summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-05 10:22:23 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-05 10:22:23 -0800
commita1b24a29d50d6e060adf1ffd97d406bc5d71f290 (patch)
tree2b6a8a8b65befc12a7e2f8d193f94d5f68f470b4
parentf50602c3b20810a6f83fc178145b99aaba478766 (diff)
downloadbinaryen-a1b24a29d50d6e060adf1ffd97d406bc5d71f290.tar.gz
binaryen-a1b24a29d50d6e060adf1ffd97d406bc5d71f290.tar.bz2
binaryen-a1b24a29d50d6e060adf1ffd97d406bc5d71f290.zip
more overflow checking
-rw-r--r--src/wasm-interpreter.h5
-rw-r--r--src/wasm-shell.cpp2
2 files changed, 4 insertions, 3 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 55eb2e269..586715b77 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -380,8 +380,9 @@ public:
if (val > (double)UINT_MAX || val <= (double)-1) instance.externalInterface->trap();
return Flow(Literal(uint32_t(val)));
} else {
- if (val > (double)ULLONG_MAX || val <= (double)-1) instance.externalInterface->trap();
- return Flow(Literal(uint64_t(val)));
+ uint64_t converted = val;
+ if (converted < val - 1 || val <= (double)-1) instance.externalInterface->trap();
+ return Flow(Literal(converted));
}
}
case ReinterpretFloat: return curr->type == i32 ? Flow(Literal(value.reinterpreti32())) : Flow(Literal(value.reinterpreti64()));
diff --git a/src/wasm-shell.cpp b/src/wasm-shell.cpp
index 6761e46d8..bafbf75dc 100644
--- a/src/wasm-shell.cpp
+++ b/src/wasm-shell.cpp
@@ -146,7 +146,7 @@ int main(int argc, char **argv) {
Element& curr = *root[i];
IString id = curr[0]->str();
if (id == MODULE) break;
- std::cerr << "CHECKING| " << curr << '\n';
+ std::cerr << i << '/' << root.size() << " CHECKING| " << curr << '\n';
Element& invoke = *curr[1];
assert(invoke[0]->str() == INVOKE);
IString name = invoke[1]->str();