Skip to content

Commit

Permalink
[asan] Do not instrument pointers with address space attributes
Browse files Browse the repository at this point in the history
Do not instrument pointers with address space attributes since we cannot track
them anyway. Instrumenting them results in false positives in ASan and a
compiler crash in TSan. (The compiler should not crash in any case, but that's
a different problem.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273339 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
AnnaZaks committed Jun 22, 2016
1 parent 99e2e27 commit b523d2b
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/Transforms/Instrumentation/AddressSanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,14 @@ Value *AddressSanitizer::isInterestingMemoryAccess(Instruction *I,
PtrOperand = XCHG->getPointerOperand();
}

// Do not instrument acesses from different address spaces; we cannot deal
// with them.
if (PtrOperand) {
Type *PtrTy = cast<PointerType>(PtrOperand->getType()->getScalarType());
if (PtrTy->getPointerAddressSpace() != 0)
return nullptr;
}

// Treat memory accesses to promotable allocas as non-interesting since they
// will not cause memory violations. This greatly speeds up the instrumented
// executable at -O0.
Expand Down
9 changes: 9 additions & 0 deletions lib/Transforms/Instrumentation/ThreadSanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,15 @@ static bool shouldInstrumentReadWriteFromAddress(Value *Addr) {
if (GV->getName() == "__llvm_gcov_ctr")
return false;
}

// Do not instrument acesses from different address spaces; we cannot deal
// with them.
if (Addr) {
Type *PtrTy = cast<PointerType>(Addr->getType()->getScalarType());
if (PtrTy->getPointerAddressSpace() != 0)
return false;
}

return true;
}

Expand Down
32 changes: 32 additions & 0 deletions test/Instrumentation/AddressSanitizer/asan_address_space_attr.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
; RUN: opt < %s -asan -S | FileCheck %s
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.11.0"

; Checks that we do not instrument loads and stores comming from custom address space.
; These result in invalid (false positive) reports.
; int foo(int argc, const char * argv[]) {
; void *__attribute__((address_space(256))) *gs_base = (((void * __attribute__((address_space(256))) *)0));
; void *somevalue = gs_base[-1];
; return somevalue;
; }

define i32 @foo(i32 %argc, i8** %argv) sanitize_address {
entry:
%retval = alloca i32, align 4
%argc.addr = alloca i32, align 4
%argv.addr = alloca i8**, align 8
%gs_base = alloca i8* addrspace(256)*, align 8
%somevalue = alloca i8*, align 8
store i32 0, i32* %retval, align 4
store i32 %argc, i32* %argc.addr, align 4
store i8** %argv, i8*** %argv.addr, align 8
store i8* addrspace(256)* null, i8* addrspace(256)** %gs_base, align 8
%0 = load i8* addrspace(256)*, i8* addrspace(256)** %gs_base, align 8
%arrayidx = getelementptr inbounds i8*, i8* addrspace(256)* %0, i64 -1
%1 = load i8*, i8* addrspace(256)* %arrayidx, align 8
store i8* %1, i8** %somevalue, align 8
%2 = load i8*, i8** %somevalue, align 8
%3 = ptrtoint i8* %2 to i32
ret i32 %3
}
; CHECK-NOT: call void @__asan_report_load8
33 changes: 33 additions & 0 deletions test/Instrumentation/ThreadSanitizer/tsan_address_space_attr.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
; RUN: opt < %s -tsan -S | FileCheck %s
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.11.0"

; Checks that we do not instrument loads and stores comming from custom address space.
; These result in crashing the compiler.
; int foo(int argc, const char * argv[]) {
; void *__attribute__((address_space(256))) *gs_base = (((void * __attribute__((address_space(256))) *)0));
; void *somevalue = gs_base[-1];
; return somevalue;
; }

define i32 @foo(i32 %argc, i8** %argv) sanitize_thread {
entry:
%retval = alloca i32, align 4
%argc.addr = alloca i32, align 4
%argv.addr = alloca i8**, align 8
%gs_base = alloca i8* addrspace(256)*, align 8
%somevalue = alloca i8*, align 8
store i32 0, i32* %retval, align 4
store i32 %argc, i32* %argc.addr, align 4
store i8** %argv, i8*** %argv.addr, align 8
store i8* addrspace(256)* null, i8* addrspace(256)** %gs_base, align 8
%0 = load i8* addrspace(256)*, i8* addrspace(256)** %gs_base, align 8
%arrayidx = getelementptr inbounds i8*, i8* addrspace(256)* %0, i64 -1
%1 = load i8*, i8* addrspace(256)* %arrayidx, align 8
store i8* %1, i8** %somevalue, align 8
%2 = load i8*, i8** %somevalue, align 8
%3 = ptrtoint i8* %2 to i32
ret i32 %3
}
; CHECK-NOT: call void @__tsan_read
; CHECK-NOT: addrspacecast

0 comments on commit b523d2b

Please sign in to comment.