Skip to content

[Bug]: Async Function Without Suspension Causes Crash #7034

@bendrissou

Description

@bendrissou

ChakraCore Version

ch version 1.13.0.0-beta

Steps to reproduce

./build.sh -j --static --sanitize=address,undefined,signed-integer-overflow

Proof of concept

//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Copyright (c) ChakraCore Project Contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

let bar = [];
let j = 0;

function printif (text, x, mod) {
    if (x % mod == 0) {
        print (text + x);
    }
}

async function basicAsync(a, b) {
    print("Beginning basicAsync")
    await b;
    var foo = [0.1, 0.2, 0.3, 0.4, 0];
    while (a < 200) { // Loop 0 - should be jitted
        foo[a] = Math.random();
        printif(arguments.callee.name + " Loop 0 a = ", a, 80);
        printif(arguments.callee.name + " Loop 0 arguments[0] = ", arguments[0], 80);
        for (let k in foo) { bar[k] = a - k;} // Loop 1 - shuld be jitted
        ++a;
    }
    while (true){ // Loop 2 - should not be jitted
        for (j = 0; j < 100; ++j) { // Loop 3 - should not be jitted
            //await j;
            foo[j] = j;
        }
        print("Loop 3 completed");
        for (let k of bar) { // Loop 4 - should be jitted
            printif("Loop 4 k = ", k, 80);
            foo[0] = foo[1] + 1;
        }
        print("Loop 4 completed");
        //return j;
    }
}

basicAsync(4, 3).then(x => basicAsync(3, 2));

Exception or Error

Beginning basicAsync
basicAsync Loop 0 a = 80
basicAsync Loop 0 arguments[0] = 80
basicAsync Loop 0 a = 160
basicAsync Loop 0 arguments[0] = 160
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Loop 4 k = 0
Loop 4 completed
Loop 3 completed
Loop 4 k = 160
Loop 4 k = 80
Aborted (core dumped)

Additional Context

ChakraCore crashes when an async function contains an infinite loop and lacks both await and return statements.

Adding back either await or return inside the loop prevents the crash.

Crash likely related to ChakraCore’s handling or optimisation of async functions that don’t suspend.

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