| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 ; Test that the quarantine for recently freed objects works | 
|  | 2 | 
|  | 3 ; REQUIRES: no_minimal_build | 
|  | 4 | 
|  | 5 ; Test with an illegal load from a freed block | 
|  | 6 ; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \ | 
|  | 7 ; RUN:     --fsanitize-address --sz=-allow-externally-defined-symbols \ | 
|  | 8 ; RUN:     %t.pexe -o %t && %t 2>&1 | FileCheck --check-prefix=LOAD %s | 
|  | 9 ; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \ | 
|  | 10 ; RUN:     --fsanitize-address --sz=-allow-externally-defined-symbols -O2 \ | 
|  | 11 ; RUN:     %t.pexe -o %t && %t 2>&1 | FileCheck --check-prefix=LOAD %s | 
|  | 12 | 
|  | 13 ; Test with an illegal store to a freed block | 
|  | 14 ; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \ | 
|  | 15 ; RUN:     --fsanitize-address --sz=-allow-externally-defined-symbols \ | 
|  | 16 ; RUN:     %t.pexe -o %t && %t 1 2>&1 | FileCheck --check-prefix=STORE %s | 
|  | 17 ; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \ | 
|  | 18 ; RUN:     --fsanitize-address --sz=-allow-externally-defined-symbols -O2 \ | 
|  | 19 ; RUN:     %t.pexe -o %t && %t 1 2>&1 | FileCheck --check-prefix=STORE %s | 
|  | 20 | 
|  | 21 ; Test that freed objects eventually get out of quarantine and are unpoisoned | 
|  | 22 ; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \ | 
|  | 23 ; RUN:     --fsanitize-address --sz=-allow-externally-defined-symbols \ | 
|  | 24 ; RUN:     %t.pexe -o %t && %t 1 2 2>&1 | FileCheck --check-prefix=NONE %s \ | 
|  | 25 ; RUN:     --allow-empty | 
|  | 26 ; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \ | 
|  | 27 ; RUN:     --fsanitize-address --sz=-allow-externally-defined-symbols -O2 \ | 
|  | 28 ; RUN:     %t.pexe -o %t && %t 1 2 2>&1 | FileCheck --check-prefix=NONE %s \ | 
|  | 29 ; RUN:     --allow-empty | 
|  | 30 | 
|  | 31 declare external i32 @malloc(i32) | 
|  | 32 declare external void @free(i32) | 
|  | 33 declare external void @exit(i32) | 
|  | 34 | 
|  | 35 ; make three 100MB allocations | 
|  | 36 define void @_start(i32 %arg) { | 
|  | 37   %argcaddr = add i32 %arg, 8 | 
|  | 38   %argcptr = inttoptr i32 %argcaddr to i32* | 
|  | 39   %argc = load i32, i32* %argcptr, align 1 | 
|  | 40   %alloc1addr = call i32 @malloc(i32 104857600) | 
|  | 41   %alloc2addr = call i32 @malloc(i32 104857600) | 
|  | 42   %alloc3addr = call i32 @malloc(i32 104857600) | 
|  | 43   %alloc1 = inttoptr i32 %alloc1addr to i32* | 
|  | 44   %alloc2 = inttoptr i32 %alloc2addr to i32* | 
|  | 45   %alloc3 = inttoptr i32 %alloc3addr to i32* | 
|  | 46   call void @free(i32 %alloc1addr) | 
|  | 47   call void @free(i32 %alloc2addr) | 
|  | 48   call void @free(i32 %alloc3addr) | 
|  | 49   switch i32 %argc, label %error [i32 1, label %bad_load | 
|  | 50                                   i32 2, label %bad_store | 
|  | 51                                   i32 3, label %no_err] | 
|  | 52 bad_load: | 
|  | 53   %result_load = load i32, i32* %alloc2, align 1 | 
|  | 54   br label %error | 
|  | 55 bad_store: | 
|  | 56   store i32 42, i32* %alloc3, align 1 | 
|  | 57   br label %error | 
|  | 58 no_err: | 
|  | 59   %result_no_err = load i32, i32* %alloc1, align 1 | 
|  | 60   call void @exit(i32 0) | 
|  | 61   unreachable | 
|  | 62 error: | 
|  | 63   call void @exit(i32 1) | 
|  | 64   unreachable | 
|  | 65 } | 
|  | 66 | 
|  | 67 ; LOAD: Illegal 4 byte load from freed object at | 
|  | 68 ; STORE: Illegal 4 byte store to freed object at | 
|  | 69 ; NONE-NOT: Illegal | 
| OLD | NEW | 
|---|