1//===--- Sanitizers.def - Runtime sanitizer 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// This file defines the options for specifying which runtime sanitizers to
10// enable. Users of this file must define the SANITIZER macro to make use of
11// this information. Users of this file can also define the SANITIZER_GROUP
12// macro to get information on options which refer to sets of sanitizers.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef SANITIZER
17#error "Define SANITIZER prior to including this file!"
18#endif
19
20// SANITIZER(NAME, ID)
21
22// The first value is the name of the sanitizer as a string. The sanitizer can
23// be enabled by specifying -fsanitize=NAME.
24
25// The second value is an identifier which can be used to refer to the
26// sanitizer.
27
28
29// SANITIZER_GROUP(NAME, ID, ALIAS)
30
31// The first two values have the same semantics as the corresponding SANITIZER
32// values. The third value is an expression ORing together the IDs of individual
33// sanitizers in this group.
34
35#ifndef SANITIZER_GROUP
36#define SANITIZER_GROUP(NAME, ID, ALIAS)
37#endif
38
39
40// AddressSanitizer
41SANITIZER("address", Address)
42
43// Requires AddressSanitizer
44SANITIZER("pointer-compare", PointerCompare)
45
46// Requires AddressSanitizer
47SANITIZER("pointer-subtract", PointerSubtract)
48
49// Kernel AddressSanitizer (KASan)
50SANITIZER("kernel-address", KernelAddress)
51
52// Hardware-assisted AddressSanitizer
53SANITIZER("hwaddress", HWAddress)
54
55// Kernel Hardware-assisted AddressSanitizer (KHWASan)
56SANITIZER("kernel-hwaddress", KernelHWAddress)
57
58// A variant of AddressSanitizer using AArch64 MTE extension.
59SANITIZER("memtag", MemTag)
60
61// MemorySanitizer
62SANITIZER("memory", Memory)
63
64// Kernel MemorySanitizer (KMSAN)
65SANITIZER("kernel-memory", KernelMemory)
66
67// libFuzzer
68SANITIZER("fuzzer", Fuzzer)
69
70// libFuzzer-required instrumentation, no linking.
71SANITIZER("fuzzer-no-link", FuzzerNoLink)
72
73// ThreadSanitizer
74SANITIZER("thread", Thread)
75
76// LeakSanitizer
77SANITIZER("leak", Leak)
78
79// UndefinedBehaviorSanitizer
80SANITIZER("alignment", Alignment)
81SANITIZER("array-bounds", ArrayBounds)
82SANITIZER("bool", Bool)
83SANITIZER("builtin", Builtin)
84SANITIZER("enum", Enum)
85SANITIZER("float-cast-overflow", FloatCastOverflow)
86SANITIZER("float-divide-by-zero", FloatDivideByZero)
87SANITIZER("function", Function)
88SANITIZER("integer-divide-by-zero", IntegerDivideByZero)
89SANITIZER("nonnull-attribute", NonnullAttribute)
90SANITIZER("null", Null)
91SANITIZER("nullability-arg", NullabilityArg)
92SANITIZER("nullability-assign", NullabilityAssign)
93SANITIZER("nullability-return", NullabilityReturn)
94SANITIZER_GROUP("nullability", Nullability,
95                NullabilityArg | NullabilityAssign | NullabilityReturn)
96SANITIZER("object-size", ObjectSize)
97SANITIZER("pointer-overflow", PointerOverflow)
98SANITIZER("return", Return)
99SANITIZER("returns-nonnull-attribute", ReturnsNonnullAttribute)
100SANITIZER("shift-base", ShiftBase)
101SANITIZER("shift-exponent", ShiftExponent)
102SANITIZER_GROUP("shift", Shift, ShiftBase | ShiftExponent)
103SANITIZER("signed-integer-overflow", SignedIntegerOverflow)
104SANITIZER("unreachable", Unreachable)
105SANITIZER("vla-bound", VLABound)
106SANITIZER("vptr", Vptr)
107
108// IntegerSanitizer
109SANITIZER("unsigned-integer-overflow", UnsignedIntegerOverflow)
110
111// DataFlowSanitizer
112SANITIZER("dataflow", DataFlow)
113
114// Control Flow Integrity
115SANITIZER("cfi-cast-strict", CFICastStrict)
116SANITIZER("cfi-derived-cast", CFIDerivedCast)
117SANITIZER("cfi-icall", CFIICall)
118SANITIZER("cfi-mfcall", CFIMFCall)
119SANITIZER("cfi-unrelated-cast", CFIUnrelatedCast)
120SANITIZER("cfi-nvcall", CFINVCall)
121SANITIZER("cfi-vcall", CFIVCall)
122SANITIZER_GROUP("cfi", CFI,
123                CFIDerivedCast | CFIICall | CFIMFCall | CFIUnrelatedCast |
124                    CFINVCall | CFIVCall)
125
126// Safe Stack
127SANITIZER("safe-stack", SafeStack)
128
129// Shadow Call Stack
130SANITIZER("shadow-call-stack", ShadowCallStack)
131
132// -fsanitize=undefined includes all the sanitizers which have low overhead, no
133// ABI or address space layout implications, and only catch undefined behavior.
134SANITIZER_GROUP("undefined", Undefined,
135                Alignment | Bool | Builtin | ArrayBounds | Enum |
136                    FloatCastOverflow |
137                    IntegerDivideByZero | NonnullAttribute | Null | ObjectSize |
138                    PointerOverflow | Return | ReturnsNonnullAttribute | Shift |
139                    SignedIntegerOverflow | Unreachable | VLABound | Function |
140                    Vptr)
141
142// -fsanitize=undefined-trap is an alias for -fsanitize=undefined.
143SANITIZER_GROUP("undefined-trap", UndefinedTrap, Undefined)
144
145// ImplicitConversionSanitizer
146SANITIZER("implicit-unsigned-integer-truncation",
147          ImplicitUnsignedIntegerTruncation)
148SANITIZER("implicit-signed-integer-truncation", ImplicitSignedIntegerTruncation)
149SANITIZER_GROUP("implicit-integer-truncation", ImplicitIntegerTruncation,
150                ImplicitUnsignedIntegerTruncation |
151                    ImplicitSignedIntegerTruncation)
152
153SANITIZER("implicit-integer-sign-change", ImplicitIntegerSignChange)
154
155SANITIZER_GROUP("implicit-integer-arithmetic-value-change",
156                ImplicitIntegerArithmeticValueChange,
157                ImplicitIntegerSignChange | ImplicitSignedIntegerTruncation)
158
159SANITIZER("objc-cast", ObjCCast)
160
161// FIXME:
162//SANITIZER_GROUP("implicit-integer-conversion", ImplicitIntegerConversion,
163//                ImplicitIntegerArithmeticValueChange |
164//                    ImplicitUnsignedIntegerTruncation)
165//SANITIZER_GROUP("implicit-conversion", ImplicitConversion,
166//                ImplicitIntegerConversion)
167
168SANITIZER_GROUP("implicit-conversion", ImplicitConversion,
169                ImplicitIntegerArithmeticValueChange |
170                    ImplicitUnsignedIntegerTruncation)
171
172SANITIZER_GROUP("integer", Integer,
173                ImplicitConversion | IntegerDivideByZero | Shift |
174                    SignedIntegerOverflow | UnsignedIntegerOverflow)
175
176SANITIZER("local-bounds", LocalBounds)
177SANITIZER_GROUP("bounds", Bounds, ArrayBounds | LocalBounds)
178
179// Scudo hardened allocator
180SANITIZER("scudo", Scudo)
181
182// Magic group, containing all sanitizers. For example, "-fno-sanitize=all"
183// can be used to disable all the sanitizers.
184SANITIZER_GROUP("all", All, ~SanitizerMask())
185
186#undef SANITIZER
187#undef SANITIZER_GROUP
188