| Index: tests_lit/asan_tests/quarantine.ll
|
| diff --git a/tests_lit/asan_tests/quarantine.ll b/tests_lit/asan_tests/quarantine.ll
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..91ff3a6f5c7261ad067a09685039a7b4b9274f0c
|
| --- /dev/null
|
| +++ b/tests_lit/asan_tests/quarantine.ll
|
| @@ -0,0 +1,69 @@
|
| +; Test that the quarantine for recently freed objects works
|
| +
|
| +; REQUIRES: no_minimal_build
|
| +
|
| +; Test with an illegal load from a freed block
|
| +; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \
|
| +; RUN: --fsanitize-address --sz=-allow-externally-defined-symbols \
|
| +; RUN: %t.pexe -o %t && %t 2>&1 | FileCheck --check-prefix=LOAD %s
|
| +; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \
|
| +; RUN: --fsanitize-address --sz=-allow-externally-defined-symbols -O2 \
|
| +; RUN: %t.pexe -o %t && %t 2>&1 | FileCheck --check-prefix=LOAD %s
|
| +
|
| +; Test with an illegal store to a freed block
|
| +; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \
|
| +; RUN: --fsanitize-address --sz=-allow-externally-defined-symbols \
|
| +; RUN: %t.pexe -o %t && %t 1 2>&1 | FileCheck --check-prefix=STORE %s
|
| +; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \
|
| +; RUN: --fsanitize-address --sz=-allow-externally-defined-symbols -O2 \
|
| +; RUN: %t.pexe -o %t && %t 1 2>&1 | FileCheck --check-prefix=STORE %s
|
| +
|
| +; Test that freed objects eventually get out of quarantine and are unpoisoned
|
| +; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \
|
| +; RUN: --fsanitize-address --sz=-allow-externally-defined-symbols \
|
| +; RUN: %t.pexe -o %t && %t 1 2 2>&1 | FileCheck --check-prefix=NONE %s \
|
| +; RUN: --allow-empty
|
| +; RUN: llvm-as %s -o - | pnacl-freeze > %t.pexe && %S/../../pydir/szbuild.py \
|
| +; RUN: --fsanitize-address --sz=-allow-externally-defined-symbols -O2 \
|
| +; RUN: %t.pexe -o %t && %t 1 2 2>&1 | FileCheck --check-prefix=NONE %s \
|
| +; RUN: --allow-empty
|
| +
|
| +declare external i32 @malloc(i32)
|
| +declare external void @free(i32)
|
| +declare external void @exit(i32)
|
| +
|
| +; make three 100MB allocations
|
| +define void @_start(i32 %arg) {
|
| + %argcaddr = add i32 %arg, 8
|
| + %argcptr = inttoptr i32 %argcaddr to i32*
|
| + %argc = load i32, i32* %argcptr, align 1
|
| + %alloc1addr = call i32 @malloc(i32 104857600)
|
| + %alloc2addr = call i32 @malloc(i32 104857600)
|
| + %alloc3addr = call i32 @malloc(i32 104857600)
|
| + %alloc1 = inttoptr i32 %alloc1addr to i32*
|
| + %alloc2 = inttoptr i32 %alloc2addr to i32*
|
| + %alloc3 = inttoptr i32 %alloc3addr to i32*
|
| + call void @free(i32 %alloc1addr)
|
| + call void @free(i32 %alloc2addr)
|
| + call void @free(i32 %alloc3addr)
|
| + switch i32 %argc, label %error [i32 1, label %bad_load
|
| + i32 2, label %bad_store
|
| + i32 3, label %no_err]
|
| +bad_load:
|
| + %result_load = load i32, i32* %alloc2, align 1
|
| + br label %error
|
| +bad_store:
|
| + store i32 42, i32* %alloc3, align 1
|
| + br label %error
|
| +no_err:
|
| + %result_no_err = load i32, i32* %alloc1, align 1
|
| + call void @exit(i32 0)
|
| + unreachable
|
| +error:
|
| + call void @exit(i32 1)
|
| + unreachable
|
| +}
|
| +
|
| +; LOAD: Illegal 4 byte load from freed object at
|
| +; STORE: Illegal 4 byte store to freed object at
|
| +; NONE-NOT: Illegal
|
|
|