| // stores |
| HEAP8[x] = 1; |
| HEAP16[x] = 2; |
| HEAP32[x] = 3; |
| HEAPU8[x] = 4; |
| HEAPU16[x] = 5; |
| HEAPU32[x] = 6; |
| HEAPF32[x] = 7; |
| HEAPF64[x] = 8; |
| |
| // loads |
| a1 = HEAP8[x]; |
| a2 = HEAP16[x]; |
| a3 = HEAP32[x]; |
| a4 = HEAPU8[x]; |
| a5 = HEAPU16[x]; |
| a6 = HEAPU32[x]; |
| a7 = HEAPF32[x]; |
| a8 = HEAPF64[x]; |
| |
| // store return value |
| foo = HEAPU8[1337] = 42; |
| |
| // nesting |
| HEAP16[bar(HEAPF64[5])]; |
| HEAPF32[x] = HEAP32[y]; |
| |
| // Ignore the special functions themselves. that is, any JS memory access |
| // will turn into a function call to _asan_js_load_1 etc., which then does |
| // the memory access for it. It either calls into wasm to get the proper |
| // asan-instrumented operation, or before the wasm is ready to be called into, |
| // we must do the access in JS, unsafely. We should not instrument a heap |
| // access in these functions, as then we'd get infinite recursion - this is |
| // where we do actually need to still do a HEAP8[..] etc. operation without |
| // any ASan instrumentation. |
| function SAFE_HEAP_FOO(ptr) { |
| return HEAP8[ptr]; |
| } |
| function setValue(ptr) { |
| return HEAP8[ptr]; |
| } |
| function getValue(ptr) { |
| return HEAP8[ptr]; |
| } |
| |
| // but do handle everything else |
| function somethingElse() { |
| return HEAP8[ptr]; |
| } |
| |
| // ignore a.X |
| HEAP8.length; |
| HEAP8[length]; |