Source code

Revision control

Copy as Markdown

Other Tools

// Out-of-bounds accesses are detected when inlining DataView.
function testRead() {
const xs = [0x11_22_33_44, 0x55_66_77_88];
let dv = new DataView(new ArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2));
dv.setInt32(0 * Int32Array.BYTES_PER_ELEMENT, xs[0], true);
dv.setInt32(1 * Int32Array.BYTES_PER_ELEMENT, xs[1], true);
function f(dv, q) {
for (let i = 0; i <= 1000; ++i) {
// Perform an out-of-bounds read in the last iteration.
let k = (i & 1) * Int32Array.BYTES_PER_ELEMENT + (i === 1000 && q == 2 ? 7 : 0);
let v = dv.getInt32(k, true);
assertEq(v, xs[i & 1]);
}
}
try {
for (var i = 0; i <= 2; ++i) {
f(dv, i);
}
} catch (e) {
assertEq(e instanceof RangeError, true, e.message);
assertEq(i, 2);
}
}
testRead();
function testWrite() {
const xs = [0x11_22_33_44, 0x55_66_77_88];
let dv = new DataView(new ArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2));
let ui8 = new Uint8Array(dv.buffer);
function f(dv, q) {
for (let i = 0; i <= 1000; ++i) {
// Perform an out-of-bounds read in the last iteration.
let k = (i & 1) * Int32Array.BYTES_PER_ELEMENT + (i === 1000 && q == 2 ? 7 : 0);
let x = xs[i & 1];
dv.setInt32(k, x);
assertEq(ui8[0 + (i & 1) * Int32Array.BYTES_PER_ELEMENT], (x >> 24) & 0xff);
assertEq(ui8[1 + (i & 1) * Int32Array.BYTES_PER_ELEMENT], (x >> 16) & 0xff);
assertEq(ui8[2 + (i & 1) * Int32Array.BYTES_PER_ELEMENT], (x >> 8) & 0xff);
assertEq(ui8[3 + (i & 1) * Int32Array.BYTES_PER_ELEMENT], (x >> 0) & 0xff);
}
}
try {
for (var i = 0; i <= 2; ++i) {
f(dv, i);
}
} catch (e) {
assertEq(e instanceof RangeError, true, e.message);
assertEq(i, 2);
}
}
testWrite();