starkware-libs / cairo-lang

Apache License 2.0
1.34k stars 263 forks source link

Bug : Writing to [fp] seems to write to [range_check_ptr] at the same time. #147

Closed feltroidprime closed 1 year ago

feltroidprime commented 1 year ago

Consider the following cairo program :

%builtins output range_check

from starkware.cairo.common.registers import get_fp_and_pc

func add_bigint3{range_check_ptr}(a: felt*, b: felt*) {
    assert [fp] = 17;
    assert [fp + 1] = 18;
    assert [fp + 2] = 19;
    assert [range_check_ptr + 0] = 20;
    assert [range_check_ptr + 1] = 20;
    tempvar range_check_ptr = range_check_ptr + 2;

    return ();
}
func main{output_ptr: felt*, range_check_ptr}() {
    alloc_locals;
    let (__fp__, _) = get_fp_and_pc();
    local Xb: (felt, felt, felt) = (10, 11, 12);
    local Yb: (felt, felt, felt) = (9, 10, 11);
    let res = add_bigint3(&Xb, &Yb);
    return ();
}

it fails with :

Error: [code:9:36]: Error at pc=0:7:
An ASSERT_EQ instruction failed: 17 != 20.
    assert [range_check_ptr + 0] = 20;
feltroidprime commented 1 year ago

using this syntax works:

[fp] = 17, ap++;
[fp + 1] = 18, ap++;
[fp + 2] = 19, ap++;