diff options
author | Alon Zakai <azakai@mozilla.com> | 2010-11-25 13:06:31 -0800 |
---|---|---|
committer | Alon Zakai <azakai@mozilla.com> | 2010-11-25 13:06:31 -0800 |
commit | b5eea6060f32c1be666fd52ba8b337701f8723dc (patch) | |
tree | 4c440d71cb05cbdec265121f02dc7f8857573005 | |
parent | d3f5cfa7e7544af1754be29c5776d32a5fc08c17 (diff) |
check stores in SAFE_HEAP
-rw-r--r-- | src/preamble.js | 18 | ||||
-rw-r--r-- | tests/runner.py | 3 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/preamble.js b/src/preamble.js index 3993bd96..53463c1a 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -14,6 +14,9 @@ var __THREW__ = false; // Used in checking for thrown exceptions. var __ATEXIT__ = []; #if SAFE_HEAP +var MAX_WARNINGS = 10; +var WARNINGS = 0; + // Semi-manual memory corruption debugging var HEAP_WATCHED = {}; var HEAP_HISTORY = {}; @@ -47,6 +50,9 @@ function SAFE_HEAP_ACCESS(dest, type, store) { } } function SAFE_HEAP_STORE(dest, value, type) { + if (!value && value !== 0 && value !== false) { // false can be the result of a mathop comparator + throw('Warning: Writing an invalid value of ' + JSON.stringify(value) + ' at ' + dest + ' :: ' + new Error().stack + '\n'); + } SAFE_HEAP_ACCESS(dest, type, true); if (dest in HEAP_WATCHED) { print((new Error()).stack); @@ -338,7 +344,17 @@ function _atoi(s) { function _llvm_memcpy_i32(dest, src, num, idunno) { for (var i = 0; i < num; i++) { #if SAFE_HEAP - SAFE_HEAP_STORE(dest + i, HEAP[src + i], null); + var curr = HEAP[src + i]; + if (!curr && curr !== 0 && curr !== false) { + curr = 0; // memcpy can sometimes copy invalid areas, like copying an entire struct with some uninitialized parts + WARNINGS++; + if (WARNINGS < MAX_WARNINGS) { + print('WARNING: memcpy copying from ' + (src+i) + ' where there is no valid value; copying 0 instead'); + } else if (WARNINGS == MAX_WARNINGS) { + print('WARNING: Not showing further warnings'); + } + } + SAFE_HEAP_STORE(dest + i, curr, null); #else HEAP[dest + i] = HEAP[src + i]; #if USE_TYPED_ARRAYS diff --git a/tests/runner.py b/tests/runner.py index 24f620f7..69b58672 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -739,6 +739,9 @@ if 'benchmark' not in sys.argv: self.do_test(src, '*5*', output_processor=check_warnings) def test_sizeof(self): + # Has invalid writes between printouts + global SAFE_HEAP; SAFE_HEAP = 0 + src = ''' #include <stdio.h> #include <string.h> |