From 85ddad485ce0822d01db93136cd22afeeacd72b5 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Fri, 4 Mar 2016 01:52:47 +0000 Subject: [PATCH] Annotate our undefined behaviour to sneak it past the sanitizers 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 | 3 +++ llvm/include/llvm/Support/Compiler.h | 8 ++++++++ llvm/include/llvm/Transforms/Utils/MemorySSA.h | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h index 4b1b5f4..640f8db 100644 --- a/llvm/include/llvm/CodeGen/MachineFunction.h +++ b/llvm/include/llvm/CodeGen/MachineFunction.h @@ -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 : public ilist_default_traits { mutable ilist_half_node Sentinel; public: + // FIXME: This downcast is UB. See llvm.org/PR26753. + LLVM_NO_SANITIZE("object-size") MachineBasicBlock *createSentinel() const { return static_cast(&Sentinel); } diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h index d28151c..45a70bd 100644 --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -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. diff --git a/llvm/include/llvm/Transforms/Utils/MemorySSA.h b/llvm/include/llvm/Transforms/Utils/MemorySSA.h index 2881669..4ae5a7b 100644 --- a/llvm/include/llvm/Transforms/Utils/MemorySSA.h +++ b/llvm/include/llvm/Transforms/Utils/MemorySSA.h @@ -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 : public ilist_default_traits { /// 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(&Sentinel); } -- 2.7.4