1243791Sdim//===--- Sanitizers.def - Runtime sanitizer options -------------*- C++ -*-===//
2243791Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6243791Sdim//
7243791Sdim//===----------------------------------------------------------------------===//
8243791Sdim//
9243791Sdim// This file defines the options for specifying which runtime sanitizers to
10243791Sdim// enable. Users of this file must define the SANITIZER macro to make use of
11243791Sdim// this information. Users of this file can also define the SANITIZER_GROUP
12243791Sdim// macro to get information on options which refer to sets of sanitizers.
13243791Sdim//
14243791Sdim//===----------------------------------------------------------------------===//
15243791Sdim
16243791Sdim#ifndef SANITIZER
17243791Sdim#error "Define SANITIZER prior to including this file!"
18243791Sdim#endif
19243791Sdim
20243791Sdim// SANITIZER(NAME, ID)
21243791Sdim
22243791Sdim// The first value is the name of the sanitizer as a string. The sanitizer can
23243791Sdim// be enabled by specifying -fsanitize=NAME.
24243791Sdim
25243791Sdim// The second value is an identifier which can be used to refer to the
26243791Sdim// sanitizer.
27243791Sdim
28243791Sdim
29243791Sdim// SANITIZER_GROUP(NAME, ID, ALIAS)
30243791Sdim
31243791Sdim// The first two values have the same semantics as the corresponding SANITIZER
32243791Sdim// values. The third value is an expression ORing together the IDs of individual
33243791Sdim// sanitizers in this group.
34243791Sdim
35243791Sdim#ifndef SANITIZER_GROUP
36243791Sdim#define SANITIZER_GROUP(NAME, ID, ALIAS)
37243791Sdim#endif
38243791Sdim
39243791Sdim
40243791Sdim// AddressSanitizer
41243791SdimSANITIZER("address", Address)
42243791Sdim
43353358Sdim// Requires AddressSanitizer
44353358SdimSANITIZER("pointer-compare", PointerCompare)
45353358Sdim
46353358Sdim// Requires AddressSanitizer
47353358SdimSANITIZER("pointer-subtract", PointerSubtract)
48353358Sdim
49288943Sdim// Kernel AddressSanitizer (KASan)
50288943SdimSANITIZER("kernel-address", KernelAddress)
51288943Sdim
52341825Sdim// Hardware-assisted AddressSanitizer
53327952SdimSANITIZER("hwaddress", HWAddress)
54327952Sdim
55341825Sdim// Kernel Hardware-assisted AddressSanitizer (KHWASan)
56341825SdimSANITIZER("kernel-hwaddress", KernelHWAddress)
57341825Sdim
58353358Sdim// A variant of AddressSanitizer using AArch64 MTE extension.
59353358SdimSANITIZER("memtag", MemTag)
60353358Sdim
61249423Sdim// MemorySanitizer
62249423SdimSANITIZER("memory", Memory)
63249423Sdim
64344779Sdim// Kernel MemorySanitizer (KMSAN)
65344779SdimSANITIZER("kernel-memory", KernelMemory)
66344779Sdim
67321369Sdim// libFuzzer
68321369SdimSANITIZER("fuzzer", Fuzzer)
69321369Sdim
70327952Sdim// libFuzzer-required instrumentation, no linking.
71327952SdimSANITIZER("fuzzer-no-link", FuzzerNoLink)
72327952Sdim
73243791Sdim// ThreadSanitizer
74243791SdimSANITIZER("thread", Thread)
75243791Sdim
76261991Sdim// LeakSanitizer
77261991SdimSANITIZER("leak", Leak)
78261991Sdim
79243791Sdim// UndefinedBehaviorSanitizer
80249423SdimSANITIZER("alignment", Alignment)
81261991SdimSANITIZER("array-bounds", ArrayBounds)
82249423SdimSANITIZER("bool", Bool)
83327952SdimSANITIZER("builtin", Builtin)
84249423SdimSANITIZER("enum", Enum)
85249423SdimSANITIZER("float-cast-overflow", FloatCastOverflow)
86249423SdimSANITIZER("float-divide-by-zero", FloatDivideByZero)
87261991SdimSANITIZER("function", Function)
88249423SdimSANITIZER("integer-divide-by-zero", IntegerDivideByZero)
89280031SdimSANITIZER("nonnull-attribute", NonnullAttribute)
90249423SdimSANITIZER("null", Null)
91321369SdimSANITIZER("nullability-arg", NullabilityArg)
92321369SdimSANITIZER("nullability-assign", NullabilityAssign)
93321369SdimSANITIZER("nullability-return", NullabilityReturn)
94321369SdimSANITIZER_GROUP("nullability", Nullability,
95321369Sdim                NullabilityArg | NullabilityAssign | NullabilityReturn)
96249423SdimSANITIZER("object-size", ObjectSize)
97321369SdimSANITIZER("pointer-overflow", PointerOverflow)
98249423SdimSANITIZER("return", Return)
99280031SdimSANITIZER("returns-nonnull-attribute", ReturnsNonnullAttribute)
100288943SdimSANITIZER("shift-base", ShiftBase)
101288943SdimSANITIZER("shift-exponent", ShiftExponent)
102288943SdimSANITIZER_GROUP("shift", Shift, ShiftBase | ShiftExponent)
103243791SdimSANITIZER("signed-integer-overflow", SignedIntegerOverflow)
104243791SdimSANITIZER("unreachable", Unreachable)
105243791SdimSANITIZER("vla-bound", VLABound)
106243791SdimSANITIZER("vptr", Vptr)
107243791Sdim
108249423Sdim// IntegerSanitizer
109249423SdimSANITIZER("unsigned-integer-overflow", UnsignedIntegerOverflow)
110249423Sdim
111261991Sdim// DataFlowSanitizer
112261991SdimSANITIZER("dataflow", DataFlow)
113261991Sdim
114288943Sdim// Control Flow Integrity
115288943SdimSANITIZER("cfi-cast-strict", CFICastStrict)
116288943SdimSANITIZER("cfi-derived-cast", CFIDerivedCast)
117296417SdimSANITIZER("cfi-icall", CFIICall)
118341825SdimSANITIZER("cfi-mfcall", CFIMFCall)
119288943SdimSANITIZER("cfi-unrelated-cast", CFIUnrelatedCast)
120288943SdimSANITIZER("cfi-nvcall", CFINVCall)
121288943SdimSANITIZER("cfi-vcall", CFIVCall)
122288943SdimSANITIZER_GROUP("cfi", CFI,
123341825Sdim                CFIDerivedCast | CFIICall | CFIMFCall | CFIUnrelatedCast |
124341825Sdim                    CFINVCall | CFIVCall)
125288943Sdim
126288943Sdim// Safe Stack
127288943SdimSANITIZER("safe-stack", SafeStack)
128288943Sdim
129341825Sdim// Shadow Call Stack
130341825SdimSANITIZER("shadow-call-stack", ShadowCallStack)
131341825Sdim
132249423Sdim// -fsanitize=undefined includes all the sanitizers which have low overhead, no
133249423Sdim// ABI or address space layout implications, and only catch undefined behavior.
134243791SdimSANITIZER_GROUP("undefined", Undefined,
135327952Sdim                Alignment | Bool | Builtin | ArrayBounds | Enum |
136353358Sdim                    FloatCastOverflow |
137327952Sdim                    IntegerDivideByZero | NonnullAttribute | Null | ObjectSize |
138327952Sdim                    PointerOverflow | Return | ReturnsNonnullAttribute | Shift |
139327952Sdim                    SignedIntegerOverflow | Unreachable | VLABound | Function |
140327952Sdim                    Vptr)
141249423Sdim
142288943Sdim// -fsanitize=undefined-trap is an alias for -fsanitize=undefined.
143288943SdimSANITIZER_GROUP("undefined-trap", UndefinedTrap, Undefined)
144288943Sdim
145341825Sdim// ImplicitConversionSanitizer
146344779SdimSANITIZER("implicit-unsigned-integer-truncation",
147344779Sdim          ImplicitUnsignedIntegerTruncation)
148344779SdimSANITIZER("implicit-signed-integer-truncation", ImplicitSignedIntegerTruncation)
149344779SdimSANITIZER_GROUP("implicit-integer-truncation", ImplicitIntegerTruncation,
150344779Sdim                ImplicitUnsignedIntegerTruncation |
151344779Sdim                    ImplicitSignedIntegerTruncation)
152344779Sdim
153344779SdimSANITIZER("implicit-integer-sign-change", ImplicitIntegerSignChange)
154344779Sdim
155344779SdimSANITIZER_GROUP("implicit-integer-arithmetic-value-change",
156344779Sdim                ImplicitIntegerArithmeticValueChange,
157344779Sdim                ImplicitIntegerSignChange | ImplicitSignedIntegerTruncation)
158344779Sdim
159344779Sdim// FIXME:
160344779Sdim//SANITIZER_GROUP("implicit-integer-conversion", ImplicitIntegerConversion,
161344779Sdim//                ImplicitIntegerArithmeticValueChange |
162344779Sdim//                    ImplicitUnsignedIntegerTruncation)
163344779Sdim//SANITIZER_GROUP("implicit-conversion", ImplicitConversion,
164344779Sdim//                ImplicitIntegerConversion)
165344779Sdim
166341825SdimSANITIZER_GROUP("implicit-conversion", ImplicitConversion,
167344779Sdim                ImplicitIntegerArithmeticValueChange |
168344779Sdim                    ImplicitUnsignedIntegerTruncation)
169341825Sdim
170249423SdimSANITIZER_GROUP("integer", Integer,
171344779Sdim                ImplicitConversion | IntegerDivideByZero | Shift |
172341825Sdim                    SignedIntegerOverflow | UnsignedIntegerOverflow)
173249423Sdim
174261991SdimSANITIZER("local-bounds", LocalBounds)
175261991SdimSANITIZER_GROUP("bounds", Bounds, ArrayBounds | LocalBounds)
176261991Sdim
177327952Sdim// Scudo hardened allocator
178327952SdimSANITIZER("scudo", Scudo)
179327952Sdim
180280031Sdim// Magic group, containing all sanitizers. For example, "-fno-sanitize=all"
181280031Sdim// can be used to disable all the sanitizers.
182353358SdimSANITIZER_GROUP("all", All, ~SanitizerMask())
183280031Sdim
184243791Sdim#undef SANITIZER
185243791Sdim#undef SANITIZER_GROUP
186