if (pages*pagesz < 0x1_0000_0000) {
assertErrorMessage(() => ins.exports.get_varaddr(pages*pagesz),
WebAssembly.RuntimeError,
/index out of bounds/);
}
assertErrorMessage(() => ins.exports.get_varaddr_large_offset(pagesz*100+4),
WebAssembly.RuntimeError,
/index out of bounds/);
assertErrorMessage(() => ins.exports.get_varaddr_small_offset((pages-1)*pagesz+4),
WebAssembly.RuntimeError,
/index out of bounds/);
ins.exports.set_varaddr(pages*pagesz-4, 0); // Should work if (pages*pagesz < 0x1_0000_0000) {
assertErrorMessage(() => ins.exports.set_varaddr(pages*pagesz, 0),
WebAssembly.RuntimeError,
/index out of bounds/);
}
ins.exports.set_varaddr_large_offset(pagesz*100+16, 0); // Should work
assertErrorMessage(() => ins.exports.set_varaddr_large_offset(pagesz*100+20, 0),
WebAssembly.RuntimeError,
/index out of bounds/);
ins.exports.set_varaddr_small_offset((pages-1)*pagesz+24); // Should work
assertErrorMessage(() => ins.exports.set_varaddr_small_offset((pages-1)*pagesz+28, 0),
WebAssembly.RuntimeError,
/index out of bounds/);
// Active init
checkFlintstoneAt((pages-5)*pagesz);
ins.exports.init(pages*pagesz-12); // Should work // Dest goes OOB
assertErrorMessage(() => ins.exports.init(pages*pagesz-6),
WebAssembly.RuntimeError,
/index out of bounds/);
// memory.copy
// Dest and src are in bounds
ins.exports.copy((pages-10)*pagesz, (pages-5)*pagesz);
checkFlintstoneAt((pages-10)*pagesz);
// Dest goes OOB
assertErrorMessage(() => ins.exports.copy((pages)*pagesz-6, (pages-5)*pagesz, 12),
WebAssembly.RuntimeError,
/index out of bounds/);
ins.exports.copy((pages)*pagesz-12, (pages-1)*pagesz); // Should work // Src goes OOB
assertErrorMessage(() => ins.exports.copy((pages)*pagesz-12, (pages)*pagesz-6),
WebAssembly.RuntimeError,
/index out of bounds/);
// memory.fill
let lastpg = (pages-1)*pagesz;
ins.exports.fill(lastpg, 0x37, pagesz); for ( let i=0; i < pagesz/4; i++ )
assertEq(buf[lastpg/4+i], 0x37373737);
assertErrorMessage(() => ins.exports.fill(lastpg, 0x42, pagesz+1),
WebAssembly.RuntimeError,
/index out of bounds/);
done: if (pages < maxpages) {
let res = 0;
res = ins.exports.grow1(); if (res == -1) break done;
assertEq(res, pages);
res = ins.exports.grow1(); if (res == -1) break done;
assertEq(res, pages+1);
res = ins.exports.grow1(); if (res == -1) break done;
assertEq(res, pages+2);
let i = 0; while (ins.exports.grow1() != -1) {
i++;
} // We can't assert equality because we might OOM before we get to the // max, but we can assert we did not go beyond that.
assertEq(i <= maxpages-pages-3, true);
}
}
// Very large offsets should be allowed (but may of course be OOB). Observe // that offset=0xffffffff is accepted by the validator even though this access // could never succeed.
{
let ins = wasmEvalText(`
(module
(memory (export "mem") 1)
(func (export "get1") (param $p i32) (result i32)
(i32.load offset=0x80000000 (local.get $p)))
(func (export "get2") (param $p i32) (result i32)
(i32.load offset=0xfffffffc (local.get $p)))
(func (export "get3") (param $p i32) (result i32)
(i32.load offset=0xffffffff (local.get $p))))
`);
assertErrorMessage(() => ins.exports.get1(0),
WebAssembly.RuntimeError,
/index out of bounds/);
assertErrorMessage(() => ins.exports.get2(0),
WebAssembly.RuntimeError,
/index out of bounds/);
assertErrorMessage(() => ins.exports.get3(0),
WebAssembly.RuntimeError,
/index out of bounds/);
}
{
let ins = wasmEvalText(`
(module
(memory (export "mem") 32768)
(func (export "get1") (param $p i32) (result i32)
(i32.load8_s offset=0x7fffffff (local.get $p))))
`);
assertEq(ins.exports.get1(0), 0);
assertErrorMessage(() => ins.exports.get1(1),
WebAssembly.RuntimeError,
/index out of bounds/);
assertErrorMessage(() => ins.exports.get1(-1),
WebAssembly.RuntimeError,
/index out of bounds/);
}
{
let ins = wasmEvalText(`
(module
(memory (export "mem") 32769)
(func (export "get1") (param $p i32) (result i32)
(i32.load8_s offset=0x80000000 (local.get $p))))
`);
assertEq(ins.exports.get1(0), 0);
assertEq(ins.exports.get1(65535), 0);
assertErrorMessage(() => ins.exports.get1(65536),
WebAssembly.RuntimeError,
/index out of bounds/);
}
{
let ins = wasmEvalText(`
(module
(memory (export "mem") ${pages_limit})
(func (export "get1") (param $p i32) (result i32)
(i32.load8_s offset=${pages_limit*pagesz-1} (local.get $p))))
`);
assertEq(ins.exports.get1(0), 0);
assertErrorMessage(() => ins.exports.get1(1),
WebAssembly.RuntimeError,
/index out of bounds/);
assertErrorMessage(() => ins.exports.get1(-1),
WebAssembly.RuntimeError,
/index out of bounds/);
}
// Fail to grow at the declared max // Import and export
{
let ins = wasmEvalText(`
(module
(memory (export "mem") ${pages_limit} ${pages_limit})
// Fail to grow at the max heap size even if there is headroom // in the declared max if (pages_limit < 65536) {
let ins = wasmEvalText(`
(module
(memory (export "mem") ${pages_limit} ${pages_limit+2})
assertEq(ins.exports.grow1(), -1); // Because current is at the max heap size
}
// Fail to instantiate when the minimum is larger than the max heap size if (pages_limit < 65536) {
assertErrorMessage(() => wasmEvalText(`
(module (memory (export "mem") ${pages_limit+1} ${pages_limit+1}))
`),
WebAssembly.RuntimeError,
/too many memory pages/);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.29 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.