From c3f02df42f7c98615bec99aa385a0fb7d787bb39 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Wed, 30 Jul 2025 20:56:15 -0700 Subject: [PATCH] Add a way to voluntarily crash on stack overflow in CI --- scripts/runner.node.mjs | 1 + src/bun.js/bindings/JSGlobalObject.zig | 6 ++++++ src/bun.zig | 6 ++++++ src/feature_flags.zig | 2 ++ 4 files changed, 15 insertions(+) diff --git a/scripts/runner.node.mjs b/scripts/runner.node.mjs index a681c27baa..604f7dd8c2 100755 --- a/scripts/runner.node.mjs +++ b/scripts/runner.node.mjs @@ -1040,6 +1040,7 @@ async function spawnBun(execPath, { args, cwd, timeout, env, stdout, stderr }) { SHELL: shellPath, FORCE_COLOR: "1", BUN_FEATURE_FLAG_INTERNAL_FOR_TESTING: "1", + BUN_FEATURE_FLAG_CRASH_ON_STACK_OVERFLOW: "1", BUN_DEBUG_QUIET_LOGS: "1", BUN_GARBAGE_COLLECTOR_LEVEL: "1", BUN_JSC_randomIntegrityAuditRate: "1.0", diff --git a/src/bun.js/bindings/JSGlobalObject.zig b/src/bun.js/bindings/JSGlobalObject.zig index 7cbada9a94..e35a4169e8 100644 --- a/src/bun.js/bindings/JSGlobalObject.zig +++ b/src/bun.js/bindings/JSGlobalObject.zig @@ -4,6 +4,12 @@ pub const JSGlobalObject = opaque { } extern fn JSGlobalObject__throwStackOverflow(this: *JSGlobalObject) void; pub fn throwStackOverflow(this: *JSGlobalObject) void { + if (comptime bun.Environment.is_canary) { + if (bun.getRuntimeFeatureFlag(.BUN_FEATURE_FLAG_CRASH_ON_STACK_OVERFLOW)) { + @panic("Stack overflow"); + } + } + JSGlobalObject__throwStackOverflow(this); } extern fn JSGlobalObject__throwOutOfMemoryError(this: *JSGlobalObject) void; diff --git a/src/bun.zig b/src/bun.zig index c40a89e73d..c88d30ecdb 100644 --- a/src/bun.zig +++ b/src/bun.zig @@ -3730,6 +3730,12 @@ pub const StackCheck = struct { // Workaround for lack of branch hints. pub noinline fn throwStackOverflow() StackOverflow!void { @branchHint(.cold); + if (comptime bun.Environment.is_canary) { + if (bun.getRuntimeFeatureFlag(.BUN_FEATURE_FLAG_CRASH_ON_STACK_OVERFLOW)) { + @panic("Stack overflow"); + } + } + return error.StackOverflow; } const StackOverflow = error{StackOverflow}; diff --git a/src/feature_flags.zig b/src/feature_flags.zig index 7e0cf90912..ecff505ecc 100644 --- a/src/feature_flags.zig +++ b/src/feature_flags.zig @@ -40,6 +40,8 @@ pub const RuntimeFeatureFlag = enum { BUN_NO_CODESIGN_MACHO_BINARY, BUN_TRACE, NODE_NO_WARNINGS, + + BUN_FEATURE_FLAG_CRASH_ON_STACK_OVERFLOW, }; /// Enable breaking changes for the next major release of Bun