Skip to content

A specific pattern of pushes to array causes a runtime error in ~lib/rt/tlsf/insertBlock #1042

Closed
@vladimir-tikhonov

Description

@vladimir-tikhonov

This is another of "randomly occurred after a couple of seconds" errors. This time it was caused by pushing into an array. As you can see from the code, I've basically recorded and replicated a pattern of pushes that lead to an error.

Webassembly studio: https://webassembly.studio/?f=ul7d4jxj0rd

Code:

const tracing: i32[] = [ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 11, 0, 11, 0, 11, 0, 11, 0, 11, 0, 11, 0, 11, 0, 11, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 17, 0, 17, 0, 17, 0, 17, 0, 17, 0, 17, 0, 17, 0, 17, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 13 ];
const arrayBuffer: Array<i32[]|null> = [];

function inflate( buffer: Array<i32[]|null>, targetLength: i32 ): void {
    while ( buffer.length < targetLength ) {
        buffer.push( null );
    }
}

function push( arrayId: i32 ): void {
    if ( arrayBuffer.length <= arrayId ) {
        inflate( arrayBuffer, arrayId + 1 );
    }
    let array = arrayBuffer[ arrayId ];
    if ( array === null ) {
        array = [];
        arrayBuffer[ arrayId ] = array;
    }

    array.push( 0 );
}

for ( let j = 0; j < 2; j++ ) {
    for ( let i = 0; i < tracing.length; i++ ) {
        push( tracing[ i ] );
    }
}

Stack trace:

RuntimeError: unreachable
    at ~lib/rt/tlsf/insertBlock
    at ~lib/rt/tlsf/reallocateBlock
    at ~lib/rt/tlsf/__realloc
    at ~lib/array/ensureSize
    at ~lib/array/Array<i32>#push
    at assembly/index/push
    at start:assembly/index
    at start

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions