[Asan] Unpoison red zones even if use-after-scope was disabled with runtime flag

Summary: PR27453

Reviewers: eugenis

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D23481

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278818 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vitaly Buka 2016-08-16 16:24:10 +00:00
parent 0084b4209f
commit fc819213c1
3 changed files with 11 additions and 6 deletions

View File

@ -2186,12 +2186,13 @@ void FunctionStackPoisoner::poisonStack() {
poisonRedZones(L.ShadowBytes, IRB, ShadowBase, true);
auto UnpoisonStack = [&](IRBuilder<> &IRB) {
// Do this always as poisonAlloca can be disabled with
// detect_stack_use_after_scope=0.
poisonRedZones(L.ShadowBytes, IRB, ShadowBase, false);
if (HavePoisonedStaticAllocas) {
// If we poisoned some allocas in llvm.lifetime analysis,
// unpoison whole stack frame now.
poisonAlloca(LocalStackBase, LocalStackSize, IRB, false);
} else {
poisonRedZones(L.ShadowBytes, IRB, ShadowBase, false);
}
};

View File

@ -28,9 +28,9 @@ entry:
; CHECK-UAS: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 1)
; Unpoison memory at function exit in UAS mode.
; CHECK-UAS: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 64)
; CHECK-UAS: ret void
; CHECK-UAS: store i64 0
; CHECK-UAS-NEXT: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 64)
; CHECK-UAS: ret i32 0
ret i32 0
}

View File

@ -108,7 +108,11 @@ entry:
; CHECK: __asan_poison_stack_memory
ret void
; CHECK: __asan_unpoison_stack_memory
; CHECK: store i64 0
; CHECK: store i64 0
; CHECK: store i64 0
; CHECK: store i32 0
; CHECK-NEXT: __asan_unpoison_stack_memory
}
define void @zero_sized(i64 %a) #0 {