| var a = [1,2,3,4,5]; |
| |
| // Basic overflow in hoisted condition. |
| function foo(x, n) { |
| var v = 0; |
| for (var i = 0; i < n; i++) |
| v += x[i]; |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo(a, 5), 15); |
| assertEq(foo(a, 6), NaN); |
| |
| // Basic underflow in hoisted condition. |
| function foo2(x, m, n) { |
| var v = 0; |
| for (var i = m; i < n; i++) |
| v += x[i]; |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo2(a, 0, 5), 15); |
| assertEq(foo2(a, -1, 5), NaN); |
| |
| // Overflow when hoisting consolidated condition. |
| function foo3(x, m, n) { |
| var v = 0; |
| for (var i = m; i < n; i++) |
| v += x[i] + x[i + 1] + x[i + 2]; |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo3(a, 0, 3), 27); |
| assertEq(foo3(a, 0, 4), NaN); |
| |
| // Underflow when hoisting consolidated condition. |
| function foo4(x, m, n) { |
| var v = 0; |
| for (var i = m; i < n; i++) |
| v += x[i] + x[i - 1] + x[i - 2]; |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo4(a, 2, 5), 27); |
| assertEq(foo4(a, 0, 5), NaN); |
| |
| // Underflow due to decreasing index. |
| function foo5(x, n) { |
| var v = 0; |
| for (var i = 0; i < n; i++) { |
| v += x[i]; |
| if (n == 4) |
| i -= 2; |
| if (i == -5) |
| break; |
| } |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo5(a, 5), 15); |
| assertEq(foo5(a, 4), NaN); |
| |
| // Overflow after access at constant offset. |
| function foo6(x, m, n) { |
| var v = 0; |
| for (var i = m; i < n; i++) |
| v += x[i + 10]; |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo6(a, -10, -5), 15); |
| assertEq(foo6(a, -10, -4), NaN); |
| |
| // Underflow after access at constant offset. |
| function foo7(x, m, n) { |
| var v = 0; |
| for (var i = m; i < n; i++) |
| v += x[i + 10]; |
| return v; |
| } |
| for (var i = 0; i < 15; i++) |
| assertEq(foo7(a, -10, -5), 15); |
| assertEq(foo7(a, -11, -5), NaN); |