From d6837db077213c218599e33042f1006118d97be4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 5 Nov 2015 19:26:46 -0800 Subject: more int traps --- src/wasm-interpreter.h | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'src/wasm-interpreter.h') 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); -- cgit v1.2.3