Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmCustomPageSizesEnabled()
// Test access to an index from a local.
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (param i32) (result i32)
(i32.store (local.get 0) (i32.const 42))
(i32.load (local.get 0))
)
)
`);
assertEq(instance.exports.f(5), 42);
}
// Test constant memory access.
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (result i32)
(i32.store (i32.const 5) (i32.const 42))
(i32.load (i32.const 5))
)
)
`);
assertEq(instance.exports.f(), 42);
}
// Test bounds checks with various offsets.
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (param i32)
(i32.store8 offset=1 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(8);
assertErrorMessage(() => instance.exports.f(9), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 20 20 (pagesize 1))
(func (export "f") (param i32)
(i32.store8 offset=17 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(0);
instance.exports.f(2);
assertErrorMessage(() => instance.exports.f(3), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(19), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 20 20 (pagesize 1))
(func (export "f") (param i32)
(i32.store offset=2 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(0);
instance.exports.f(14);
assertErrorMessage(() => instance.exports.f(15), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(19), WebAssembly.RuntimeError, "index out of bounds");
}
// Test bounds checks with various access sizes.
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (param i32)
(i32.store8 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(3);
instance.exports.f(9);
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (param i32)
(i32.store16 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(3);
assertErrorMessage(() => instance.exports.f(9), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (param i32)
(i32.store (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(6);
assertErrorMessage(() => instance.exports.f(7), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(8), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(9), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 10 10 (pagesize 1))
(func (export "f") (param i32)
(i64.store (local.get 0) (i64.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(2);
assertErrorMessage(() => instance.exports.f(3), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(4), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(5), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(6), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(7), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(8), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(9), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 20 20 (pagesize 1))
(func (export "f") (param i32) (result i32)
(i32x4.extract_lane 0 (v128.load (local.get 0)))
)
)
`);
instance.exports.f(1);
instance.exports.f(4);
assertErrorMessage(() => instance.exports.f(5), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(10), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(15), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(20), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 0 0 (pagesize 1))
(func (export "f") (param i32)
(i64.store8 (local.get 0) (i64.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(0), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 0 0 (pagesize 1))
(func (export "f") (param i32)
(i64.store16 (local.get 0) (i64.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(0), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 0 0 (pagesize 1))
(func (export "f") (param i32)
(i32.store (local.get 0) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(0), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 0 0 (pagesize 1))
(func (export "f") (param i32)
(i64.store (local.get 0) (i64.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(0), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i64 0 0 (pagesize 1))
(func (export "f") (param i64) (result i32)
(i32x4.extract_lane 0 (v128.load (local.get 0)))
)
)
`);
assertErrorMessage(() => instance.exports.f(0n), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(1n), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(2n), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 1 1 (pagesize 1))
(func (export "f") (param i32)
(i64.store16 (local.get 0) (i64.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(0), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(2), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 2 2 (pagesize 1))
(func (export "f") (param i32)
(i64.store16 (local.get 0) (i64.const 42))
)
)
`);
instance.exports.f(0);
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(2), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 4 4 (pagesize 1))
(func (export "f") (param i32)
(i64.store32 (local.get 0) (i64.const 42))
)
)
`);
instance.exports.f(0);
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(2), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 8 8 (pagesize 1))
(func (export "f") (param i32)
(i64.store (local.get 0) (i64.const 42))
)
)
`);
instance.exports.f(0);
assertErrorMessage(() => instance.exports.f(1), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(2), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i64 16 16 (pagesize 1))
(func (export "f") (param i64) (result i32)
(i32x4.extract_lane 0 (v128.load (local.get 0)))
)
)
`);
instance.exports.f(0n);
assertErrorMessage(() => instance.exports.f(1n), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(2n), WebAssembly.RuntimeError, "index out of bounds");
}
// Test ARM-related cases
{
let instance = wasmEvalText(`(module
(memory i32 69648 69648 (pagesize 1))
(func (export "f") (param i32)
(i32.store8 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(0)
instance.exports.f(69647)
assertErrorMessage(() => instance.exports.f(69648), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(69649), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i64 69648 69648 (pagesize 1))
(func (export "f") (param i64)
(i32.store8 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(0n)
instance.exports.f(69647n)
assertErrorMessage(() => instance.exports.f(69648n), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(69649n), WebAssembly.RuntimeError, "index out of bounds");
}
// Test bounds checking under 4GB.
{
let instance = wasmEvalText(`(module
(memory i64 5000 10000 (pagesize 1))
(func (export "f")
(i32.store (i64.const 11000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i64 5000 (pagesize 1))
(func (export "f")
(i32.store (i64.const 11000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i64 5000 128000 (pagesize 1))
(func (export "f")
(i32.store (i64.const 64000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i64 5000 10000 (pagesize 1))
(func (export "f")
(i32.store (i64.const 6000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 5000 10000 (pagesize 1))
(func (export "f")
(i32.store (i32.const 11000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 5000 128000 (pagesize 1))
(func (export "f")
(i32.store (i32.const 64000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 5000 10000 (pagesize 1))
(func (export "f")
(i32.store (i32.const 6000) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}
if (getBuildConfiguration("x86")) {
assertErrorMessage(
() => wasmEvalText(`(module
(memory i32 4294967295 4294967295 (pagesize 1))
(func (export "f") (param i32)
(i32.store8 (local.get 0) (i32.const 42))
)
)
`),
WebAssembly.RuntimeError,
"too many memory pages"
);
} else {
{
let instance = wasmEvalText(`(module
(memory i32 4294967295 4294967295 (pagesize 1))
(func (export "f") (param i32)
(i32.store8 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(3000);
instance.exports.f(4294967292);
instance.exports.f(4294967293);
instance.exports.f(4294967294);
assertErrorMessage(() => instance.exports.f(4294967295), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 4294967295 4294967295 (pagesize 1))
(func (export "f") (param i32)
(i32.store16 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(3000);
instance.exports.f(4294967292);
instance.exports.f(4294967293);
assertErrorMessage(() => instance.exports.f(4294967294), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(4294967295), WebAssembly.RuntimeError, "index out of bounds");
}
{
let instance = wasmEvalText(`(module
(memory i32 4294967295 (pagesize 1))
(func (export "f") (param i32)
(i32.store16 (local.get 0) (i32.const 42))
)
)
`);
instance.exports.f(1);
instance.exports.f(3000);
instance.exports.f(4294967292);
instance.exports.f(4294967293);
assertErrorMessage(() => instance.exports.f(4294967294), WebAssembly.RuntimeError, "index out of bounds");
assertErrorMessage(() => instance.exports.f(4294967295), WebAssembly.RuntimeError, "index out of bounds");
}
}
// Ensure bounds checking above 4GB works as expected.
if (getBuildConfiguration("x86")) {
assertErrorMessage(
() => wasmEvalText(`(module
(memory i64 4294967299 4294967299 (pagesize 1))
(func (export "f")
(i32.store (i64.const 4294967300) (i32.const 42))
)
)
`),
WebAssembly.RuntimeError,
"too many memory pages"
);
} else {
let instance = wasmEvalText(`(module
(memory i64 4294967299 4294967299 (pagesize 1))
(func (export "f")
(i32.store (i64.const 4294967300) (i32.const 42))
)
)
`);
assertErrorMessage(() => instance.exports.f(), WebAssembly.RuntimeError, "index out of bounds");
}