[llvm] r318708 - [msan] Don't sanitize "nosanitize" instructions

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 20 15:37:57 PST 2017


Author: vitalybuka
Date: Mon Nov 20 15:37:56 2017
New Revision: 318708

URL: http://llvm.org/viewvc/llvm-project?rev=318708&view=rev
Log:
[msan] Don't sanitize "nosanitize" instructions

Reviewers: eugenis

Subscribers: hiraditya, llvm-commits

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

Added:
    llvm/trunk/test/Instrumentation/MemorySanitizer/nosanitize.ll
Removed:
    llvm/trunk/test/Instrumentation/MemorySanitizer/call-nosanitize.ll
Modified:
    llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp?rev=318708&r1=318707&r2=318708&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp Mon Nov 20 15:37:56 2017
@@ -1156,6 +1156,8 @@ struct MemorySanitizerVisitor : public I
   Value *getShadow(Value *V) {
     if (!PropagateShadow) return getCleanShadow(V);
     if (Instruction *I = dyn_cast<Instruction>(V)) {
+      if (I->getMetadata("nosanitize"))
+        return getCleanShadow(V);
       // For instructions the shadow is already stored in the map.
       Value *Shadow = ShadowMap[V];
       if (!Shadow) {
@@ -1255,6 +1257,10 @@ struct MemorySanitizerVisitor : public I
     if (isa<Constant>(V)) return getCleanOrigin();
     assert((isa<Instruction>(V) || isa<Argument>(V)) &&
            "Unexpected value type in getOrigin()");
+    if (Instruction *I = dyn_cast<Instruction>(V)) {
+      if (I->getMetadata("nosanitize"))
+        return getCleanOrigin();
+    }
     Value *Origin = OriginMap[V];
     assert(Origin && "Missing origin");
     return Origin;
@@ -1335,6 +1341,11 @@ struct MemorySanitizerVisitor : public I
   }
 
   // ------------------- Visitors.
+  using InstVisitor<MemorySanitizerVisitor>::visit;
+  void visit(Instruction &I) {
+    if (!I.getMetadata("nosanitize"))
+      InstVisitor<MemorySanitizerVisitor>::visit(I);
+  }
 
   /// \brief Instrument LoadInst
   ///
@@ -1342,10 +1353,11 @@ struct MemorySanitizerVisitor : public I
   /// Optionally, checks that the load address is fully defined.
   void visitLoadInst(LoadInst &I) {
     assert(I.getType()->isSized() && "Load type must have size");
+    assert(!I.getMetadata("nosanitize"));
     IRBuilder<> IRB(I.getNextNode());
     Type *ShadowTy = getShadowTy(&I);
     Value *Addr = I.getPointerOperand();
-    if (PropagateShadow && !I.getMetadata("nosanitize")) {
+    if (PropagateShadow) {
       Value *ShadowPtr = getShadowPtr(Addr, ShadowTy, IRB);
       setShadow(&I,
                 IRB.CreateAlignedLoad(ShadowPtr, I.getAlignment(), "_msld"));
@@ -2653,7 +2665,7 @@ struct MemorySanitizerVisitor : public I
 
   void visitCallSite(CallSite CS) {
     Instruction &I = *CS.getInstruction();
-    if (I.getMetadata("nosanitize")) return;
+    assert(!I.getMetadata("nosanitize"));
     assert((CS.isCall() || CS.isInvoke()) && "Unknown type of CallSite");
     if (CS.isCall()) {
       CallInst *Call = cast<CallInst>(&I);

Removed: llvm/trunk/test/Instrumentation/MemorySanitizer/call-nosanitize.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/MemorySanitizer/call-nosanitize.ll?rev=318707&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/MemorySanitizer/call-nosanitize.ll (original)
+++ llvm/trunk/test/Instrumentation/MemorySanitizer/call-nosanitize.ll (removed)
@@ -1,16 +0,0 @@
-; Verify that calls with !nosanitize are not instrumented by MSan.
-; RUN: opt < %s -msan -S | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-declare void @bar(i32 %x)
-
-define void @foo() {
-  call void @bar(i32 7), !nosanitize !{}
-  ret void
-}
-
-; CHECK-LABEL: define void @foo
-; CHECK-NOT: store i{{[0-9]+}} 0, {{.*}} @__msan_param_tls
-; CHECK: call void @bar
-; CHECK: ret void

Added: llvm/trunk/test/Instrumentation/MemorySanitizer/nosanitize.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/MemorySanitizer/nosanitize.ll?rev=318708&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/MemorySanitizer/nosanitize.ll (added)
+++ llvm/trunk/test/Instrumentation/MemorySanitizer/nosanitize.ll Mon Nov 20 15:37:56 2017
@@ -0,0 +1,48 @@
+; Verify that calls with !nosanitize are not instrumented by MSan.
+; RUN: opt < %s -msan -S | FileCheck %s
+; RUN: opt < %s -msan -msan-track-origins=1 -S | FileCheck %s
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare void @bar(i32 %x)
+
+define void @foo() {
+  call void @bar(i32 7), !nosanitize !{}
+  ret void
+}
+
+; CHECK-LABEL: define void @foo
+; CHECK-NOT: store {{.*}} @__msan_param_tls
+; CHECK: call void @bar
+; CHECK: ret void
+
+
+ at __sancov_gen_ = private global [1 x i8] zeroinitializer, section "__sancov_cntrs", align 1
+define void @sancov() sanitize_memory {
+entry:
+  %0 = load i8, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @__sancov_gen_, i64 0, i64 0), !nosanitize !{}
+  %1 = add i8 %0, 1
+  store i8 %1, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @__sancov_gen_, i64 0, i64 0), !nosanitize !{}
+  ret void
+}
+
+; CHECK-LABEL: define void @sancov
+; CHECK-NOT: xor
+; CHECK-NOT: 87960930222080
+; CHECK: ret void
+
+
+define void @load_store() sanitize_memory {
+entry:
+  %x = alloca i32, align 4, !nosanitize !{}
+  store i32 4, i32* %x, align 4, !nosanitize !{}
+  %0 = load i32, i32* %x, align 4, !nosanitize !{}
+  %add = add nsw i32 %0, %0
+  store i32 %add, i32* %x, align 4, !nosanitize !{}
+  ret void
+}
+
+; CHECK-LABEL: define void @load_store
+; CHECK-NOT: xor
+; CHECK-NOT: 87960930222080
+; CHECK: ret void




More information about the llvm-commits mailing list