Fix detection of stack-use-after scope for char arrays.

Summary:
Clang inserts GetElementPtrInst so findAllocaForValue was not
able to find allocas.

PR27453

Reviewers: kcc, eugenis

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

llvm-svn: 276374
This commit is contained in:
Vitaly Buka 2016-07-22 00:56:17 +00:00
parent aae623f4c2
commit 53054a7024
2 changed files with 24 additions and 0 deletions

View File

@ -2286,6 +2286,10 @@ AllocaInst *FunctionStackPoisoner::findAllocaForValue(Value *V) {
return nullptr; return nullptr;
Res = IncValueAI; Res = IncValueAI;
} }
} else if (GetElementPtrInst *EP = dyn_cast<GetElementPtrInst>(V)) {
Res = findAllocaForValue(EP->getPointerOperand());
} else {
DEBUG(dbgs() << "Alloca search canceled on unknown instruction: " << *V << "\n");
} }
if (Res) AllocaForValue[V] = Res; if (Res) AllocaForValue[V] = Res;
return Res; return Res;

View File

@ -91,6 +91,26 @@ bb1:
ret void ret void
} }
; Check that arguments of lifetime may come from getelementptr nodes.
define void @getelementptr_args() sanitize_address{
; CHECK-LABEL: define void @getelementptr_args
entry:
%x = alloca [1024 x i8], align 16
%d = alloca i8*, align 8
%0 = getelementptr inbounds [1024 x i8], [1024 x i8]* %x, i64 0, i64 0
call void @llvm.lifetime.start(i64 1024, i8* %0)
; CHECK: __asan_unpoison_stack_memory
store i8* %0, i8** %d, align 8
call void @llvm.lifetime.end(i64 1024, i8* %0)
; CHECK: __asan_poison_stack_memory
ret void
; CHECK: __asan_unpoison_stack_memory
}
define void @zero_sized(i64 %a) #0 { define void @zero_sized(i64 %a) #0 {
; CHECK-LABEL: define void @zero_sized(i64 %a) ; CHECK-LABEL: define void @zero_sized(i64 %a)