Annotate our undefined behaviour to sneak it past the sanitizers
authorJustin Bogner <mail@justinbogner.com>
Fri, 4 Mar 2016 01:52:47 +0000 (01:52 +0000)
committerJustin Bogner <mail@justinbogner.com>
Fri, 4 Mar 2016 01:52:47 +0000 (01:52 +0000)
We have known UB in some ilists where we static cast half nodes to
(larger) derived types and use the address. See llvm.org/PR26753.

This needs to be fixed, but in the meantime it'd be nice if running
ubsan didn't complain. This adds annotations in the two places where
ubsan complains while running check-all of a sanitized clang build.

llvm-svn: 262683

llvm/include/llvm/CodeGen/MachineFunction.h
llvm/include/llvm/Support/Compiler.h
llvm/include/llvm/Transforms/Utils/MemorySSA.h

index 4b1b5f4..640f8db 100644 (file)
@@ -24,6 +24,7 @@
 #include "llvm/IR/Metadata.h"
 #include "llvm/Support/Allocator.h"
 #include "llvm/Support/ArrayRecycler.h"
+#include "llvm/Support/Compiler.h"
 #include "llvm/Support/Recycler.h"
 
 namespace llvm {
@@ -50,6 +51,8 @@ struct ilist_traits<MachineBasicBlock>
     : public ilist_default_traits<MachineBasicBlock> {
   mutable ilist_half_node<MachineBasicBlock> Sentinel;
 public:
+  // FIXME: This downcast is UB. See llvm.org/PR26753.
+  LLVM_NO_SANITIZE("object-size")
   MachineBasicBlock *createSentinel() const {
     return static_cast<MachineBasicBlock*>(&Sentinel);
   }
index d28151c..45a70bd 100644 (file)
@@ -415,6 +415,14 @@ void AnnotateIgnoreWritesEnd(const char *file, int line);
 # define TsanIgnoreWritesEnd()
 #endif
 
+/// \macro LLVM_NO_SANITIZE
+/// \brief Disable a particular sanitizer for a function.
+#if __has_attribute(no_sanitize)
+#define LLVM_NO_SANITIZE(KIND) __attribute__((no_sanitize(KIND)))
+#else
+#define LLVM_NO_SANITIZE(KIND)
+#endif
+
 /// \brief Mark debug helper function definitions like dump() that should not be
 /// stripped from debug builds.
 // FIXME: Move this to a private config.h as it's not usable in public headers.
index 2881669..4ae5a7b 100644 (file)
@@ -86,6 +86,7 @@
 #include "llvm/IR/User.h"
 #include "llvm/IR/Value.h"
 #include "llvm/Pass.h"
+#include "llvm/Support/Compiler.h"
 
 namespace llvm {
 class BasicBlock;
@@ -153,7 +154,8 @@ private:
 template <>
 struct ilist_traits<MemoryAccess> : public ilist_default_traits<MemoryAccess> {
   /// See details of the instruction class for why this trick works
-  /// FIXME: The downcast is UB.
+  // FIXME: This downcast is UB. See llvm.org/PR26753.
+  LLVM_NO_SANITIZE("object-size")
   MemoryAccess *createSentinel() const {
     return static_cast<MemoryAccess *>(&Sentinel);
   }