// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /* runner.json { "differential": true, "actions": [ { "Instantiate": { "code": { "Solidity": { "contract": "MemoryBounds" } } } }, { "Call": { "dest": { "Instantiated": 0 } } }, { "Call": { "dest": { "Instantiated": 0 }, "data": "489eb33e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000000" } }, { "Call": { "dest": { "Instantiated": 0 }, "data": "db1ff7bb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000000" } } ] } */ contract MemoryBounds { function oobLoad(bytes memory data) public pure returns (uint256, bytes memory) { uint256 result1; assembly { let ptr := mload(add(data, 0x20)) result1 := calldataload(ptr) } return (result1, data); } function oobCopy(bytes memory data) public pure returns (uint256, bytes memory) { assembly { calldatacopy(0, 0x3a0000000000000000000000000000000000, 0x20) } } fallback() external { assembly { // Accessing OOB offsets should always work when the length is 0. return(100000, 0) } } }