summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2016-07-22 00:56:17 +0000
committerVitaly Buka <vitalybuka@google.com>2016-07-22 00:56:17 +0000
commit53054a7024f6353c6d3d300e556418739e546d47 (patch)
tree08bf4f92bbd120ddafc0cdded18e082320059ba3
parentaae623f4c2965af735677312e2a5f070d25a5827 (diff)
downloadbcm5719-llvm-53054a7024f6353c6d3d300e556418739e546d47.tar.gz
bcm5719-llvm-53054a7024f6353c6d3d300e556418739e546d47.zip
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
-rw-r--r--llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp4
-rw-r--r--llvm/test/Instrumentation/AddressSanitizer/lifetime.ll20
2 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index 43d1b377f85..27b68b0387d 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2286,6 +2286,10 @@ AllocaInst *FunctionStackPoisoner::findAllocaForValue(Value *V) {
return nullptr;
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;
return Res;
diff --git a/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll b/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll
index fb43e882705..f8c8d47e3a3 100644
--- a/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll
+++ b/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll
@@ -91,6 +91,26 @@ bb1:
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 {
; CHECK-LABEL: define void @zero_sized(i64 %a)
OpenPOWER on IntegriCloud