diff --git a/tests/compiler/overflow.optimized.wast b/tests/compiler/overflow.optimized.wast index 81a48261..423898fb 100644 --- a/tests/compiler/overflow.optimized.wast +++ b/tests/compiler/overflow.optimized.wast @@ -1,10 +1,12 @@ (module (type $iiiiv (func (param i32 i32 i32 i32))) (type $v (func)) + (type $i (func (result i32))) (import "env" "abort" (func $abort (param i32 i32 i32 i32))) (global $overflow/badByte (mut i32) (i32.const 255)) (global $overflow/anotherBadByte (mut i32) (i32.const 255)) (global $overflow/badIncrementer (mut i32) (i32.const 1)) + (global $overflow/valueU8 (mut i32) (i32.const 0)) (memory $0 1) (data (i32.const 8) "\0b\00\00\00o\00v\00e\00r\00f\00l\00o\00w\00.\00t\00s") (export "memory" (memory $0)) @@ -12,7 +14,16 @@ (func $overflow/local (; 1 ;) (type $v) (nop) ) - (func $start (; 2 ;) (type $v) + (func $overflow/loadU8FF (; 2 ;) (type $i) (result i32) + (i32.store8 + (i32.const 0) + (i32.const 255) + ) + (i32.load8_u + (i32.const 0) + ) + ) + (func $start (; 3 ;) (type $v) (set_global $overflow/badByte (i32.and (i32.add @@ -56,5 +67,29 @@ ) ) (call $overflow/local) + (set_global $overflow/valueU8 + (call $overflow/loadU8FF) + ) + (set_global $overflow/valueU8 + (i32.and + (i32.add + (get_global $overflow/valueU8) + (i32.const 1) + ) + (i32.const 255) + ) + ) + (if + (get_global $overflow/valueU8) + (block + (call $abort + (i32.const 0) + (i32.const 8) + (i32.const 32) + (i32.const 0) + ) + (unreachable) + ) + ) ) ) diff --git a/tests/compiler/overflow.ts b/tests/compiler/overflow.ts index 98f89f2a..e4c45187 100644 --- a/tests/compiler/overflow.ts +++ b/tests/compiler/overflow.ts @@ -21,3 +21,12 @@ function local(): void { } local(); + +function loadU8FF(): u8 { + store(0, 0xff); + return load(0); +} + +var valueU8: u8 = loadU8FF(); +valueU8 += 1; +assert(valueU8 == 0); diff --git a/tests/compiler/overflow.wast b/tests/compiler/overflow.wast index 965d0e1d..570f2580 100644 --- a/tests/compiler/overflow.wast +++ b/tests/compiler/overflow.wast @@ -1,10 +1,12 @@ (module (type $iiiiv (func (param i32 i32 i32 i32))) (type $v (func)) + (type $i (func (result i32))) (import "env" "abort" (func $abort (param i32 i32 i32 i32))) (global $overflow/badByte (mut i32) (i32.const 255)) (global $overflow/anotherBadByte (mut i32) (i32.const 255)) (global $overflow/badIncrementer (mut i32) (i32.const 1)) + (global $overflow/valueU8 (mut i32) (i32.const 0)) (global $HEAP_BASE i32 (i32.const 36)) (memory $0 1) (data (i32.const 8) "\0b\00\00\00o\00v\00e\00r\00f\00l\00o\00w\00.\00t\00s\00") @@ -92,7 +94,24 @@ ) ) ) - (func $start (; 2 ;) (type $v) + (func $overflow/loadU8FF (; 2 ;) (type $i) (result i32) + ;;@ overflow.ts:26:2 + (i32.store8 + ;;@ overflow.ts:26:12 + (i32.const 0) + ;;@ overflow.ts:26:15 + (i32.const 255) + ) + ;;@ overflow.ts:27:19 + (return + ;;@ overflow.ts:27:9 + (i32.load8_u + ;;@ overflow.ts:27:18 + (i32.const 0) + ) + ) + ) + (func $start (; 3 ;) (type $v) ;;@ overflow.ts:4:0 (set_global $overflow/badByte (i32.and @@ -157,5 +176,40 @@ ) ;;@ overflow.ts:23:0 (call $overflow/local) + (set_global $overflow/valueU8 + ;;@ overflow.ts:30:18 + (call $overflow/loadU8FF) + ) + ;;@ overflow.ts:31:0 + (set_global $overflow/valueU8 + (i32.and + (i32.add + (get_global $overflow/valueU8) + ;;@ overflow.ts:31:11 + (i32.const 1) + ) + (i32.const 255) + ) + ) + ;;@ overflow.ts:32:0 + (if + (i32.eqz + ;;@ overflow.ts:32:7 + (i32.eq + (get_global $overflow/valueU8) + ;;@ overflow.ts:32:18 + (i32.const 0) + ) + ) + (block + (call $abort + (i32.const 0) + (i32.const 8) + (i32.const 32) + (i32.const 0) + ) + (unreachable) + ) + ) ) )