Skip to content

Commit

Permalink
Annotate our undefined behaviour to sneak it past the sanitizers
Browse files Browse the repository at this point in the history
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262683 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
bogner committed Mar 4, 2016
1 parent 46bd846 commit aac07fb
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 1 deletion.
3 changes: 3 additions & 0 deletions include/llvm/CodeGen/MachineFunction.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
}
Expand Down
8 changes: 8 additions & 0 deletions include/llvm/Support/Compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 3 additions & 1 deletion include/llvm/Transforms/Utils/MemorySSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -153,7 +154,8 @@ class MemoryAccess : public User, public ilist_node<MemoryAccess> {
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);
}
Expand Down

0 comments on commit aac07fb

Please sign in to comment.