solang icon indicating copy to clipboard operation
solang copied to clipboard

recursive struct causes execution error.

Open Subway2023 opened this issue 11 months ago • 0 comments

Version: v0.3.3: Atlantis Description: s2 is a recursive struct, and inner.recursive[0].z = inner.recursive[1].z + 1; causes the program to throw an error. However, solc+EVM can execute it successfully.

contract test {
    struct s2 {
        uint32 z;
        mapping(uint8 => s2) recursive;
    }
    s2 data;
    function set() public {
        data.z = 2;
        mapping(uint8 => s2) storage map = data.recursive;
        s2 storage inner = map[0];
        inner.z = 3;
        inner.recursive[0].z = inner.recursive[1].z + 1;
    }
}

Reproduction: I set up a Solang compilation and execution environment to test the program.

solang/target/debug/vmRunNoPara test.sol test set

The execution error is as follows:

Contract name: test
function new for 8svhWB4YfosDFwCLxbPJM41bYNbux8XqPMcsfsHPXSd5
input: 872ccdc6190148bc
running bpf with calldata:872ccdc6190148bc
program: 8svhWB4YfosDFwCLxbPJM41bYNbux8XqPMcsfsHPXSd5
static: length:3f0 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
offset:410 prev:10 next:10 length:0 allocated:0 
function set for 8svhWB4YfosDFwCLxbPJM41bYNbux8XqPMcsfsHPXSd5
input: c63335f1741d7ec2
running bpf with calldata:c63335f1741d7ec2
program: 8svhWB4YfosDFwCLxbPJM41bYNbux8XqPMcsfsHPXSd5
sol_set_return_data: 
static: length:3f0 020000001004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
offset:410 prev:10 next:430 length:16 allocated:1 00000000000000000300000040040000
offset:430 prev:410 next:440 length:16 allocated:1 50040000200400001000000001000000
thread 'main' panicked at src/tests/solana.rs:1717:17:
assertion failed: length <= space
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
function_call_with_account causes error

Subway2023 avatar Feb 10 '25 06:02 Subway2023