diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 19:26:46 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 19:29:46 -0800 |
commit | d6837db077213c218599e33042f1006118d97be4 (patch) | |
tree | be9af48c021e213993634776e61e43f56a1c6668 /src/wasm-interpreter.h | |
parent | 0f96bc8b34c00562597bbfbacead38d94cd14319 (diff) | |
download | binaryen-d6837db077213c218599e33042f1006118d97be4.tar.gz binaryen-d6837db077213c218599e33042f1006118d97be4.tar.bz2 binaryen-d6837db077213c218599e33042f1006118d97be4.zip |
more int traps
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r-- | src/wasm-interpreter.h | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 100e585d6..5cb1105e8 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -371,14 +371,22 @@ public: case Mul: return Literal(l * r); case DivS: { if (r == 0) trap(); + if (l == INT32_MIN && r == -1) trap(); // signed division overflow return Literal(l / r); } case DivU: { if (r == 0) trap(); return Literal(int32_t(uint32_t(l) / uint32_t(r))); } - case RemS: return Literal(l % r); - case RemU: return Literal(int32_t(uint32_t(l) % uint32_t(r))); + case RemS: { + if (r == 0) trap(); + if (l == INT32_MIN && r == -1) return Literal(int32_t(0)); + return Literal(l % r); + } + case RemU: { + if (r == 0) trap(); + return Literal(int32_t(uint32_t(l) % uint32_t(r))); + } case And: return Literal(l & r); case Or: return Literal(l | r); case Xor: return Literal(l ^ r); @@ -395,14 +403,22 @@ public: case Mul: return Literal(l * r); case DivS: { if (r == 0) trap(); + if (l == LLONG_MIN && r == -1) trap(); // signed division overflow return Literal(l / r); } case DivU: { if (r == 0) trap(); - return Literal(int32_t(uint32_t(l) / uint32_t(r))); + return Literal(int64_t(uint64_t(l) / uint64_t(r))); + } + case RemS: { + if (r == 0) trap(); + if (l == LLONG_MIN && r == -1) return Literal(int64_t(0)); + return Literal(l % r); + } + case RemU: { + if (r == 0) trap(); + return Literal(int64_t(uint64_t(l) % uint64_t(r))); } - case RemS: return Literal(l % r); - case RemU: return Literal(int64_t(uint64_t(l) % uint64_t(r))); case And: return Literal(l & r); case Or: return Literal(l | r); case Xor: return Literal(l ^ r); |