clang  19.0.0git
Sanitizers.h
Go to the documentation of this file.
1 //===- Sanitizers.h - C Language Family Language Options --------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file
10 /// Defines the clang::SanitizerKind enum.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_BASIC_SANITIZERS_H
15 #define LLVM_CLANG_BASIC_SANITIZERS_H
16 
17 #include "clang/Basic/LLVM.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/Support/HashBuilder.h"
20 #include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
21 #include <cassert>
22 #include <cstdint>
23 
24 namespace llvm {
25 class hash_code;
26 class Triple;
27 namespace opt {
28 class ArgList;
29 }
30 } // namespace llvm
31 
32 namespace clang {
33 
35  // NOTE: this class assumes kNumElem == 2 in most of the constexpr functions,
36  // in order to work within the C++11 constexpr function constraints. If you
37  // change kNumElem, you'll need to update those member functions as well.
38 
39  /// Number of array elements.
40  static constexpr unsigned kNumElem = 2;
41  /// Mask value initialized to 0.
42  uint64_t maskLoToHigh[kNumElem]{};
43  /// Number of bits in a mask.
44  static constexpr unsigned kNumBits = sizeof(decltype(maskLoToHigh)) * 8;
45  /// Number of bits in a mask element.
46  static constexpr unsigned kNumBitElem = sizeof(decltype(maskLoToHigh[0])) * 8;
47 
48  constexpr SanitizerMask(uint64_t mask1, uint64_t mask2)
49  : maskLoToHigh{mask1, mask2} {}
50 
51 public:
52  SanitizerMask() = default;
53 
54  static constexpr bool checkBitPos(const unsigned Pos) {
55  return Pos < kNumBits;
56  }
57 
58  /// Create a mask with a bit enabled at position Pos.
59  static constexpr SanitizerMask bitPosToMask(const unsigned Pos) {
60  uint64_t mask1 = (Pos < kNumBitElem) ? 1ULL << (Pos % kNumBitElem) : 0;
61  uint64_t mask2 = (Pos >= kNumBitElem && Pos < (kNumBitElem * 2))
62  ? 1ULL << (Pos % kNumBitElem)
63  : 0;
64  return SanitizerMask(mask1, mask2);
65  }
66 
67  unsigned countPopulation() const;
68 
69  void flipAllBits() {
70  for (auto &Val : maskLoToHigh)
71  Val = ~Val;
72  }
73 
74  bool isPowerOf2() const {
75  return countPopulation() == 1;
76  }
77 
78  llvm::hash_code hash_value() const;
79 
80  template <typename HasherT, llvm::endianness Endianness>
81  friend void addHash(llvm::HashBuilder<HasherT, Endianness> &HBuilder,
82  const SanitizerMask &SM) {
83  HBuilder.addRange(&SM.maskLoToHigh[0], &SM.maskLoToHigh[kNumElem]);
84  }
85 
86  constexpr explicit operator bool() const {
87  return maskLoToHigh[0] || maskLoToHigh[1];
88  }
89 
90  constexpr bool operator==(const SanitizerMask &V) const {
91  return maskLoToHigh[0] == V.maskLoToHigh[0] &&
92  maskLoToHigh[1] == V.maskLoToHigh[1];
93  }
94 
96  for (unsigned k = 0; k < kNumElem; k++)
97  maskLoToHigh[k] &= RHS.maskLoToHigh[k];
98  return *this;
99  }
100 
102  for (unsigned k = 0; k < kNumElem; k++)
103  maskLoToHigh[k] |= RHS.maskLoToHigh[k];
104  return *this;
105  }
106 
107  constexpr bool operator!() const { return !bool(*this); }
108 
109  constexpr bool operator!=(const SanitizerMask &RHS) const {
110  return !((*this) == RHS);
111  }
112 
113  friend constexpr inline SanitizerMask operator~(SanitizerMask v) {
114  return SanitizerMask(~v.maskLoToHigh[0], ~v.maskLoToHigh[1]);
115  }
116 
117  friend constexpr inline SanitizerMask operator&(SanitizerMask a,
118  const SanitizerMask &b) {
119  return SanitizerMask(a.maskLoToHigh[0] & b.maskLoToHigh[0],
120  a.maskLoToHigh[1] & b.maskLoToHigh[1]);
121  }
122 
123  friend constexpr inline SanitizerMask operator|(SanitizerMask a,
124  const SanitizerMask &b) {
125  return SanitizerMask(a.maskLoToHigh[0] | b.maskLoToHigh[0],
126  a.maskLoToHigh[1] | b.maskLoToHigh[1]);
127  }
128 };
129 
130 // Declaring in clang namespace so that it can be found by ADL.
131 llvm::hash_code hash_value(const clang::SanitizerMask &Arg);
132 
133 // Define the set of sanitizer kinds, as well as the set of sanitizers each
134 // sanitizer group expands into.
136  // Assign ordinals to possible values of -fsanitize= flag, which we will use
137  // as bit positions.
139 #define SANITIZER(NAME, ID) SO_##ID,
140 #define SANITIZER_GROUP(NAME, ID, ALIAS) SO_##ID##Group,
141 #include "clang/Basic/Sanitizers.def"
142  SO_Count
143  };
144 
145 #define SANITIZER(NAME, ID) \
146  static constexpr SanitizerMask ID = SanitizerMask::bitPosToMask(SO_##ID); \
147  static_assert(SanitizerMask::checkBitPos(SO_##ID), "Bit position too big.");
148 #define SANITIZER_GROUP(NAME, ID, ALIAS) \
149  static constexpr SanitizerMask ID = SanitizerMask(ALIAS); \
150  static constexpr SanitizerMask ID##Group = \
151  SanitizerMask::bitPosToMask(SO_##ID##Group); \
152  static_assert(SanitizerMask::checkBitPos(SO_##ID##Group), \
153  "Bit position too big.");
154 #include "clang/Basic/Sanitizers.def"
155 }; // SanitizerKind
156 
157 struct SanitizerSet {
158  /// Check if a certain (single) sanitizer is enabled.
159  bool has(SanitizerMask K) const {
160  assert(K.isPowerOf2() && "Has to be a single sanitizer.");
161  return static_cast<bool>(Mask & K);
162  }
163 
164  /// Check if one or more sanitizers are enabled.
165  bool hasOneOf(SanitizerMask K) const { return static_cast<bool>(Mask & K); }
166 
167  /// Enable or disable a certain (single) sanitizer.
168  void set(SanitizerMask K, bool Value) {
169  assert(K.isPowerOf2() && "Has to be a single sanitizer.");
170  Mask = Value ? (Mask | K) : (Mask & ~K);
171  }
172 
173  void set(SanitizerMask K) { Mask = K; }
174 
175  /// Disable the sanitizers specified in \p K.
177 
178  /// Returns true if no sanitizers are enabled.
179  bool empty() const { return !Mask; }
180 
181  /// Bitmask of enabled sanitizers.
183 };
184 
185 /// Parse a single value from a -fsanitize= or -fno-sanitize= value list.
186 /// Returns a non-zero SanitizerMask, or \c 0 if \p Value is not known.
187 SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups);
188 
189 /// Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
192 
193 /// For each sanitizer group bit set in \p Kinds, set the bits for sanitizers
194 /// this group enables.
196 
197 /// Return the sanitizers which do not affect preprocessing.
199  return SanitizerKind::CFI | SanitizerKind::Integer |
200  SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |
201  SanitizerKind::Undefined | SanitizerKind::FloatDivideByZero;
202 }
203 
204 StringRef AsanDtorKindToString(llvm::AsanDtorKind kind);
205 
206 llvm::AsanDtorKind AsanDtorKindFromString(StringRef kind);
207 
209  llvm::AsanDetectStackUseAfterReturnMode mode);
210 
211 llvm::AsanDetectStackUseAfterReturnMode
213 
214 } // namespace clang
215 
216 #endif // LLVM_CLANG_BASIC_SANITIZERS_H
#define V(N, I)
Definition: ASTContext.h:3299
#define SM(sm)
Definition: Cuda.cpp:83
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
__device__ __2f16 b
do v
Definition: arm_acle.h:83
friend void addHash(llvm::HashBuilder< HasherT, Endianness > &HBuilder, const SanitizerMask &SM)
Definition: Sanitizers.h:81
constexpr bool operator==(const SanitizerMask &V) const
Definition: Sanitizers.h:90
constexpr bool operator!() const
Definition: Sanitizers.h:107
bool isPowerOf2() const
Definition: Sanitizers.h:74
llvm::hash_code hash_value() const
Definition: Sanitizers.cpp:56
SanitizerMask & operator|=(const SanitizerMask &RHS)
Definition: Sanitizers.h:101
constexpr friend SanitizerMask operator|(SanitizerMask a, const SanitizerMask &b)
Definition: Sanitizers.h:123
static constexpr bool checkBitPos(const unsigned Pos)
Definition: Sanitizers.h:54
constexpr friend SanitizerMask operator~(SanitizerMask v)
Definition: Sanitizers.h:113
SanitizerMask & operator&=(const SanitizerMask &RHS)
Definition: Sanitizers.h:95
unsigned countPopulation() const
Definition: Sanitizers.cpp:61
constexpr friend SanitizerMask operator&(SanitizerMask a, const SanitizerMask &b)
Definition: Sanitizers.h:117
constexpr bool operator!=(const SanitizerMask &RHS) const
Definition: Sanitizers.h:109
static constexpr SanitizerMask bitPosToMask(const unsigned Pos)
Create a mask with a bit enabled at position Pos.
Definition: Sanitizers.h:59
constexpr XRayInstrMask All
Definition: XRayInstr.h:43
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Definition: DiagnosticIDs.h:65
The JSON file list parser is used to communicate input to InstallAPI.
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
Definition: Sanitizers.h:198
StringRef AsanDtorKindToString(llvm::AsanDtorKind kind)
Definition: Sanitizers.cpp:72
void serializeSanitizerSet(SanitizerSet Set, SmallVectorImpl< StringRef > &Values)
Serialize a SanitizerSet into values for -fsanitize= or -fno-sanitize=.
Definition: Sanitizers.cpp:39
SanitizerMask expandSanitizerGroups(SanitizerMask Kinds)
For each sanitizer group bit set in Kinds, set the bits for sanitizers this group enables.
Definition: Sanitizers.cpp:47
SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups)
Parse a single value from a -fsanitize= or -fno-sanitize= value list.
Definition: Sanitizers.cpp:29
llvm::hash_code hash_value(const CustomizableOptional< T > &O)
llvm::AsanDtorKind AsanDtorKindFromString(StringRef kind)
Definition: Sanitizers.cpp:84
llvm::AsanDetectStackUseAfterReturnMode AsanDetectStackUseAfterReturnModeFromString(StringRef modeStr)
Definition: Sanitizers.cpp:107
StringRef AsanDetectStackUseAfterReturnModeToString(llvm::AsanDetectStackUseAfterReturnMode mode)
Definition: Sanitizers.cpp:91
unsigned long uint64_t
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
#define bool
Definition: stdbool.h:24
void set(SanitizerMask K)
Definition: Sanitizers.h:173
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
Definition: Sanitizers.h:176
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
Definition: Sanitizers.h:168
bool empty() const
Returns true if no sanitizers are enabled.
Definition: Sanitizers.h:179
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
Definition: Sanitizers.h:159
SanitizerMask Mask
Bitmask of enabled sanitizers.
Definition: Sanitizers.h:182
bool hasOneOf(SanitizerMask K) const
Check if one or more sanitizers are enabled.
Definition: Sanitizers.h:165