]> granicus.if.org Git - clang/commitdiff
CodeGen: Add CFI unrelated cast checks to the new pointer code path.
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 9 Sep 2015 00:01:31 +0000 (00:01 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 9 Sep 2015 00:01:31 +0000 (00:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247105 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
test/CodeGenCXX/cfi-cast.cpp

index b7d1ef19b15d256e4acf9b7c38a42f9510ef83e0..8339444c20e656e09347785b2b2dbb20e3e175a1 100644 (file)
@@ -820,6 +820,14 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
                          getNaturalPointeeTypeAlignment(E->getType(), Source));
         }
 
+        if (SanOpts.has(SanitizerKind::CFIUnrelatedCast)) {
+          if (auto PT = E->getType()->getAs<PointerType>())
+            EmitVTablePtrCheckForCast(PT->getPointeeType(), Addr.getPointer(),
+                                      /*MayBeNull=*/true,
+                                      CodeGenFunction::CFITCK_UnrelatedCast,
+                                      CE->getLocStart());
+        }
+
         return Builder.CreateBitCast(Addr, ConvertType(E->getType()));
       }
       break;
index 09089634442c4719431888f1b1c9643fc67957ea..7efcd9e0cae47aa79d5e762bcc258a71e8d0e76e 100644 (file)
@@ -107,3 +107,19 @@ void vcp(void *p) {
   // CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1C")
   static_cast<C*>(p);
 }
+
+// CHECK-UCAST-LABEL: define void @_Z3bcpP1B
+// CHECK-UCAST-STRICT-LABEL: define void @_Z3bcpP1B
+void bcp(B *p) {
+  // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1A")
+  // CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1C")
+  (C *)p;
+}
+
+// CHECK-UCAST-LABEL: define void @_Z8bcp_callP1B
+// CHECK-UCAST-STRICT-LABEL: define void @_Z8bcp_callP1B
+void bcp_call(B *p) {
+  // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1A")
+  // CHECK-UCAST-STRICT: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1C")
+  ((C *)p)->f();
+}