fix: 修复全局边界安全与内存稳定性问题

This commit is contained in:
爱特每羊队
2026-06-22 19:43:00 +08:00
parent 1016f432f1
commit 933612c89d
35 changed files with 620 additions and 135 deletions
+50 -1
View File
@@ -67,7 +67,12 @@ fn regression_rerun_clears_ic_cache() {
#[test]
fn regression_recursion_depth_limit() {
assert_eq!(eval("function f(){f()} f()"), "vm error: RangeError: Maximum call stack size exceeded");
let result = eval("function f(){f()} f()");
assert!(result.contains("RangeError"), "expected RangeError, got: {result}");
assert!(
result.contains("Maximum call stack size exceeded"),
"expected stack limit message, got: {result}"
);
}
#[test]
@@ -164,3 +169,47 @@ fn regression_many_declarations_keep_stable_registers() {
fn regression_method_call_receiver_survives_register_reuse() {
assert_eq!(eval("var o = { x: 41, f: function() { return this.x + 1; } }; o.f()"), "42");
}
#[test]
fn test_recursive_getter_throws_range_error() {
let result = eval("function f(){ return f(); } f()");
assert!(
result.contains("Maximum call stack size exceeded"),
"expected catchable RangeError, got: {result}"
);
}
#[test]
fn test_array_length_range_error() {
let result = eval("new Array(4294967295)");
assert!(result.contains("Invalid array length"), "expected invalid length, got: {result}");
let result = eval("new Array(-1)");
assert!(result.contains("Invalid array length"), "expected invalid length, got: {result}");
}
#[test]
fn test_huge_array_index_bounded() {
let result = eval("var a=[]; a[2147483648]=1; 1");
assert_eq!(result, "1");
}
#[test]
fn test_string_pad_bounded() {
let result = eval("''.padStart(2147483648)");
assert!(result.contains("Invalid string length"), "expected invalid string length, got: {result}");
assert_eq!(eval("'x'.padStart(5,'0') == '0000x'"), "true");
}
#[test]
fn test_typed_array_survives_promote_reset() {
assert_eq!(eval("var a=new Int32Array(4); a.fill(7); a.at(0)"), "7");
assert_eq!(
eval("var b=new ArrayBuffer(8); var d=new DataView(b); d.setInt32(0, 42); d.getInt32(0)"),
"42"
);
}
#[test]
fn test_flat_infinity_bounded() {
assert_eq!(eval("[1,[2,[3,[4]]]].flat(Infinity).length"), "4");
}