aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@mozilla.com>2010-11-25 13:06:31 -0800
committerAlon Zakai <azakai@mozilla.com>2010-11-25 13:06:31 -0800
commitb5eea6060f32c1be666fd52ba8b337701f8723dc (patch)
tree4c440d71cb05cbdec265121f02dc7f8857573005
parentd3f5cfa7e7544af1754be29c5776d32a5fc08c17 (diff)
check stores in SAFE_HEAP
-rw-r--r--src/preamble.js18
-rw-r--r--tests/runner.py3
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>