Skip to content

Commit

Permalink
Fix range overflow when using signed integers
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielSchiavini committed Feb 26, 2024
1 parent 7ac9dc2 commit eec9ce8
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
16 changes: 16 additions & 0 deletions tests/functional/codegen/features/iteration/test_for_range.py
Original file line number Diff line number Diff line change
Expand Up @@ -414,3 +414,19 @@ def foo(a: {typ}) -> {typ}:
assert c.foo(100) == 6
assert c.foo(1) == 666
assert c.foo(0) == 31337


def test_for_range_signed_int_overflow(get_contract, tx_failed):
code = """
@external
def foo() -> DynArray[int256, 10]:
res: DynArray[int256, 10] = empty(DynArray[int256, 10])
x:int256 = max_value(int256)
y:int256 = min_value(int256)+2
for i:int256 in range(x,y , bound=10):
res.append(i)
return res
"""
c = get_contract(code)
with tx_failed():
c.foo()
2 changes: 1 addition & 1 deletion vyper/codegen/stmt.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ def _parse_For_range(self):
with end.cache_when_complex("end") as (b1, end):
# note: the check for rounds<=rounds_bound happens in asm
# generation for `repeat`.
clamped_start = clamp("le", start, end)
clamped_start = clamp("sle" if target_type.is_signed else "le", start, end)
rounds = b1.resolve(IRnode.from_list(["sub", end, clamped_start]))
rounds_bound = kwargs.pop("bound").int_value()
else:
Expand Down

0 comments on commit eec9ce8

Please sign in to comment.