a16z / halmos

A symbolic testing tool for EVM smart contracts

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OverflowError: cannot fit 'int' into an index-sized integer

charles-cooper opened this issue · comments

Describe the bug
(note: similar setup as #220)

running halmos --loop 5 --solver-parallel --solver-threads 10 with the below file in the test/ directory results in the following traceback:

To Reproduce

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

// test.sol

contract Lana {
    mapping (uint => uint) solvers;
    function name() external pure returns (string memory) {
        return "Lana";
    }

    function generate(address _seed) external pure returns (uint256) {
        return uint256(uint160(_seed));
    }

    function verify(uint256 start, uint256 _solution) external view returns (bool) {
        assert(solvers[start] != 0);
        return _solution == solvers[start];
    }

    function check_solve(bytes calldata val, address start) external {
      bytes memory data = hex"61094c8061000e6000396000f3fe600080620100206080815261010082608037660fffffffffffff6106075262010140926105e784525b8015610938578060011461091057806002146108fb57806003146108e657806004146108c857806005146104b557806006146108b0578060071461089e578060091461087e5780600a146108675780600b146108565780600c146108465780600d146108385780600e146108205780600f146107f257806010146107e057806012146107c857806013146107a95780601414610791578060151461077957806016146107645780601714610750578060181461073c57806019146106f35780601a146107235780601b1461069d5780601c1461070f5780601d146106fb5780601e146106f35780601f146106db57806020146106bd578060211461069d57806022146106a5578060231461069d578060241461068657806025146106725780602614610653578060271461063b5780602814610623578060291461060b5780602a146105f15780602b146105d95780602c146105bb5780602d1461059f5780602e146105835780602f14610563578060301461054a578060311461052a5780603214610513578060331461050157806035146104e757806036146104cc57806037146104b557806038146104a657806039146104975780603a146104895780603b146104815780603c146104725780603d146104575780603e146104445780603f146104365780604014610422578060411461040a57806042146103ee57806043146103d657806044146103bf57806045146103a5578060461461039d5780604714610386578060481461036a57806049146103475780604a146103335780604b1461031b5780604c146102fc5780604d146102e45780604e146102cb5780604f146102b35760501461029d57602062010000f35b8251610200602082018086525191018452610028565b5062010000600160401b602082510890526050610028565b508051600160401b62010000918251089052604f610028565b506001600160401b03815160081b168152604e610028565b506001600160401b03815160c090811b901d60381d168152604d610028565b506001600160401b03815160381b168152604c610028565b508051601c19015160ff168152604b610028565b50620100006001600160401b03815160c090811b901d60381d169052604a610028565b50620100006001600160401b03815160381b1690526049610028565b508051601b19015160ff1662010000526048610028565b506050610028565b50604662010060516201008051036100285750603c610028565b506201006060ff6061825101511690526045610028565b50620100808051601e19015160ff1690526044610028565b506201006051600160401b620100809182510890526043610028565b506001600160401b0381511662010080526042610028565b506041620100805161002857506047610028565b508162010040526040610028565b506201008060018151169052603f610028565b506001600160401b036201004051166201008052603e610028565b5060066201006052603d610028565b506041610028565b50816201000052603b610028565b5060016201004052603a610028565b50600562010060526039610028565b508251610200602082018086525191018452610028565b506001600160401b0362010100511662010000526037610028565b5060366104f48251151590565b156100285750600e610028565b5063fffffffe62010100526035610028565b506201004051601e19015160ff1681526033610028565b50620100c05160171901516001600160401b031662010040526032610028565b5062010120600160401b60001982510890526031610028565b5060306105766201000051610423141590565b1561002857506036610028565b50620100006001600160401b03815160201c169052602f610028565b50620100006001600160401b03815160201b169052602e610028565b5082516101df1901808452602d90528251601f190183526038610028565b506001600160401b03620100e051168152602c610028565b50602b6105fe8251151590565b1561002857506030610028565b506001600160401b03815160201c168152602a610028565b506001600160401b03815160201b1681526029610028565b506001600160401b0362010120511681526028610028565b50601e19620100e0510160ff1981511660ff8351161790526027610028565b50600160401b600182510881526026610028565b50620100e051601e19015160ff1681526025610028565b506027610028565b50620100e0600160401b600182510890526023610028565b5082516101df1901808452602190528251601f190183526006610028565b506001600160401b03620100c0511681526020610028565b506036610028565b50601e60448251036100285750601f610028565b50601d604382510361002857506024610028565b50620100e0600160401b6000198251089052601b610028565b50601960428251036100285750601a610028565b506018604182510361002857506022610028565b5060176042825113156100285750601c610028565b506001600160401b03815160201c1681526016610028565b506001600160401b03815160201b1681526015610028565b506001600160401b03815160c090811b901d60381d1681526014610028565b506001600160401b03815160381b1681526013610028565b5063ffffffff62010100526012610028565b50601719620100c051016001600160401b03198151166001600160401b036201004051161790526010610028565b5062010040600160401b60018251089052600f610028565b50600e806201012052610028565b50610200620100e052600d610028565b50600c815161002857506036610028565b506201004051601e19015160ff168152600b610028565b50620100c05160171901516001600160401b03166201004052600a610028565b5063fffffffe62010100526009610028565b506001600160401b03815116620100c0526007610028565b5082516101df1901808452600590528251601f190183526006610028565b50600160401b60071982510881526004610028565b506001600160401b0383511681526003610028565b50601f198351016001600160401b03198151166001600160401b038351161790526002610028565b50600160401b60208251088152600161002856";

      assembly {
        let addr := create(0, add(data, 32), mload(data))
        let sz := extcodesize(addr)
        if iszero(sz) {
            revert(0, 0)
        }

        let code := mload(0x40)

        mstore(add(code, 0x14), start)
        calldatacopy(add(code, 0x40), val.offset, val.length)

        let success := call(gas(), addr, 0, add(code, 0x20), 0x100, code, 0x20)
        if or(iszero(eq(returndatasize(), 0x20)), iszero(success)) {
            revert(0, 0)
        }

        let secret := mload(code)
        /*
        if iszero(eq(secret, 0x1337)) {
            revert(0, 0)
        }
       */
        if eq(secret, 0x1337) {
            mstore(0x40, 0x4E487B71)
            mstore(0x60, 0x01)
            revert(0x5c, 0x24)
        }
      }

      solvers[uint(uint160(start))] = uint(keccak256(val));
    }
}

Environment:

full stack trace

[ERROR] check_solve(bytes,address)
OverflowError: cannot fit 'int' into an index-sized integer
Traceback (most recent call last):
  File "/Users/karma/projects/halmos/src/halmos/__main__.py", line 989, in run_sequential
    test_result = run(setup_ex, run_args.abi, fun_info, extended_args)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/karma/projects/halmos/src/halmos/__main__.py", line 692, in run
    for idx, ex in enumerate(exs):
  File "/Users/karma/projects/halmos/src/halmos/sevm.py", line 2443, in run
    ex.st.mstore(True)
  File "/Users/karma/projects/halmos/src/halmos/sevm.py", line 468, in mstore
    wstore(self.memory, loc, 32, val)
  File "/Users/karma/projects/halmos/src/halmos/sevm.py", line 216, in wstore
    wextend(mem, loc, size)
  File "/Users/karma/projects/halmos/src/halmos/sevm.py", line 173, in wextend
    mem.extend([0] * (loc + size - len(mem)))
               ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
OverflowError: cannot fit 'int' into an index-sized integer

Fixed in #242, thanks for reporting @charles-cooper !