[ubsan] Suppression by type for -fsanitize=enum
(#114754)
Similar to #107332.
This commit is contained in:
parent
2c95fb9233
commit
21d25d2bcd
@ -872,10 +872,9 @@ Sanitizers
|
||||
This new flag should allow those projects to enable integer sanitizers with
|
||||
less noise.
|
||||
|
||||
- Arithmetic overflow sanitizers ``-fsanitize=signed-integer-overflow`` and
|
||||
``-fsanitize=unsigned-integer-overflow`` as well as the implicit integer
|
||||
truncation sanitizers ``-fsanitize=implicit-signed-integer-truncation`` and
|
||||
``-fsanitize=implicit-unsigned-integer-truncation`` now properly support the
|
||||
- ``-fsanitize=signed-integer-overflow``, ``-fsanitize=unsigned-integer-overflow``,
|
||||
``-fsanitize=implicit-signed-integer-truncation``, ``-fsanitize=implicit-unsigned-integer-truncation``,
|
||||
``-fsanitize=enum`` now properly support the
|
||||
"type" prefix within `Sanitizer Special Case Lists (SSCL)
|
||||
<https://clang.llvm.org/docs/SanitizerSpecialCaseList.html>`_. See that link
|
||||
for examples.
|
||||
|
@ -16,8 +16,9 @@ Goal and usage
|
||||
==============
|
||||
|
||||
Users of sanitizer tools, such as :doc:`AddressSanitizer`,
|
||||
:doc:`ThreadSanitizer`, :doc:`MemorySanitizer` or :doc:`UndefinedBehaviorSanitizer`
|
||||
may want to disable or alter some checks for certain source-level entities to:
|
||||
:doc:`HardwareAssistedAddressSanitizerDesign`, :doc:`ThreadSanitizer`,
|
||||
:doc:`MemorySanitizer` or :doc:`UndefinedBehaviorSanitizer` may want to disable
|
||||
or alter some checks for certain source-level entities to:
|
||||
|
||||
* speedup hot function, which is known to be correct;
|
||||
* ignore a function that does some low-level magic (e.g. walks through the
|
||||
@ -51,11 +52,10 @@ Example
|
||||
Usage with UndefinedBehaviorSanitizer
|
||||
=====================================
|
||||
|
||||
The arithmetic overflow sanitizers ``unsigned-integer-overflow`` and
|
||||
``signed-integer-overflow`` as well as the implicit integer truncation
|
||||
sanitizers ``implicit-signed-integer-truncation`` and
|
||||
``implicit-unsigned-integer-truncation`` support the ability to adjust
|
||||
instrumentation based on type.
|
||||
``unsigned-integer-overflow``, ``signed-integer-overflow``,
|
||||
``implicit-signed-integer-truncation``,
|
||||
``implicit-unsigned-integer-truncation``, and ``enum`` sanitizers support the
|
||||
ability to adjust instrumentation based on type.
|
||||
|
||||
By default, supported sanitizers will have their instrumentation disabled for
|
||||
types specified within an ignorelist.
|
||||
|
@ -1941,6 +1941,10 @@ bool CodeGenFunction::EmitScalarRangeCheck(llvm::Value *Value, QualType Ty,
|
||||
cast<llvm::IntegerType>(Value->getType())->getBitWidth() == 1)
|
||||
return false;
|
||||
|
||||
if (NeedsEnumCheck &&
|
||||
getContext().isTypeIgnoredBySanitizer(SanitizerKind::Enum, Ty))
|
||||
return false;
|
||||
|
||||
llvm::APInt Min, End;
|
||||
if (!getRangeForType(*this, Ty, Min, End, /*StrictEnums=*/true, IsBool))
|
||||
return true;
|
||||
|
33
clang/test/CodeGen/ubsan-type-ignorelist-enum.test
Normal file
33
clang/test/CodeGen/ubsan-type-ignorelist-enum.test
Normal file
@ -0,0 +1,33 @@
|
||||
// RUN: rm -rf %t
|
||||
// RUN: split-file %s %t
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsanitize=enum -fsanitize-ignorelist=%t/ignorelist -emit-llvm %t/test.cpp -o - | FileCheck %s --implicit-check-not="call void @__ubsan_handle"
|
||||
|
||||
//--- ignorelist
|
||||
[enum]
|
||||
type:IgnoreEnum
|
||||
|
||||
//--- test.cpp
|
||||
enum IgnoreEnum {
|
||||
A,
|
||||
B,
|
||||
C,
|
||||
};
|
||||
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z6ignore10IgnoreEnum
|
||||
int ignore(IgnoreEnum v) {
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
enum CheckEnum {
|
||||
X,
|
||||
Y,
|
||||
Z,
|
||||
};
|
||||
|
||||
// CHECK-LABEL: define dso_local noundef i32 @_Z5check9CheckEnum
|
||||
// CHECK: call void @__ubsan_handle_load_invalid_value_abort
|
||||
int check(CheckEnum v) {
|
||||
return v;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user