-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[Clang][CodeGen] Emit “trap reasons” on UBSan traps #145967
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,35 +14,69 @@ | |
| #define LLVM_CLANG_LIB_CODEGEN_SANITIZER_HANDLER_H | ||
|
|
||
| #define LIST_SANITIZER_CHECKS \ | ||
| SANITIZER_CHECK(AddOverflow, add_overflow, 0) \ | ||
| SANITIZER_CHECK(BuiltinUnreachable, builtin_unreachable, 0) \ | ||
| SANITIZER_CHECK(CFICheckFail, cfi_check_fail, 0) \ | ||
| SANITIZER_CHECK(DivremOverflow, divrem_overflow, 0) \ | ||
| SANITIZER_CHECK(DynamicTypeCacheMiss, dynamic_type_cache_miss, 0) \ | ||
| SANITIZER_CHECK(FloatCastOverflow, float_cast_overflow, 0) \ | ||
| SANITIZER_CHECK(FunctionTypeMismatch, function_type_mismatch, 0) \ | ||
| SANITIZER_CHECK(ImplicitConversion, implicit_conversion, 0) \ | ||
| SANITIZER_CHECK(InvalidBuiltin, invalid_builtin, 0) \ | ||
| SANITIZER_CHECK(InvalidObjCCast, invalid_objc_cast, 0) \ | ||
| SANITIZER_CHECK(LoadInvalidValue, load_invalid_value, 0) \ | ||
| SANITIZER_CHECK(MissingReturn, missing_return, 0) \ | ||
| SANITIZER_CHECK(MulOverflow, mul_overflow, 0) \ | ||
| SANITIZER_CHECK(NegateOverflow, negate_overflow, 0) \ | ||
| SANITIZER_CHECK(NullabilityArg, nullability_arg, 0) \ | ||
| SANITIZER_CHECK(NullabilityReturn, nullability_return, 1) \ | ||
| SANITIZER_CHECK(NonnullArg, nonnull_arg, 0) \ | ||
| SANITIZER_CHECK(NonnullReturn, nonnull_return, 1) \ | ||
| SANITIZER_CHECK(OutOfBounds, out_of_bounds, 0) \ | ||
| SANITIZER_CHECK(PointerOverflow, pointer_overflow, 0) \ | ||
| SANITIZER_CHECK(ShiftOutOfBounds, shift_out_of_bounds, 0) \ | ||
| SANITIZER_CHECK(SubOverflow, sub_overflow, 0) \ | ||
| SANITIZER_CHECK(TypeMismatch, type_mismatch, 1) \ | ||
| SANITIZER_CHECK(AlignmentAssumption, alignment_assumption, 0) \ | ||
| SANITIZER_CHECK(VLABoundNotPositive, vla_bound_not_positive, 0) \ | ||
| SANITIZER_CHECK(BoundsSafety, bounds_safety, 0) | ||
| SANITIZER_CHECK(AddOverflow, add_overflow, 0, "Integer addition overflowed") \ | ||
|
||
| SANITIZER_CHECK(BuiltinUnreachable, builtin_unreachable, 0, \ | ||
| "_builtin_unreachable(), execution reached an unreachable " \ | ||
| "program point") \ | ||
| SANITIZER_CHECK(CFICheckFail, cfi_check_fail, 0, \ | ||
| "Control flow integrity check failed") \ | ||
| SANITIZER_CHECK(DivremOverflow, divrem_overflow, 0, \ | ||
| "Integer divide or remainder overflowed") \ | ||
| SANITIZER_CHECK(DynamicTypeCacheMiss, dynamic_type_cache_miss, 0, \ | ||
| "Dynamic type cache miss, member call made on an object " \ | ||
| "whose dynamic type differs from the expected type") \ | ||
| SANITIZER_CHECK(FloatCastOverflow, float_cast_overflow, 0, \ | ||
| "Floating-point to integer conversion overflowed") \ | ||
| SANITIZER_CHECK(FunctionTypeMismatch, function_type_mismatch, 0, \ | ||
| "Function called with mismatched signature") \ | ||
| SANITIZER_CHECK(ImplicitConversion, implicit_conversion, 0, \ | ||
| "Implicit integer conversion overflowed or lost data") \ | ||
| SANITIZER_CHECK(InvalidBuiltin, invalid_builtin, 0, \ | ||
| "Invalid use of builtin function") \ | ||
| SANITIZER_CHECK(InvalidObjCCast, invalid_objc_cast, 0, \ | ||
| "Invalid Objective-C cast") \ | ||
| SANITIZER_CHECK(LoadInvalidValue, load_invalid_value, 0, \ | ||
| "Loaded an invalid or uninitialized value for the type") \ | ||
| SANITIZER_CHECK(MissingReturn, missing_return, 0, \ | ||
| "Execution reached the end of a value-returning function " \ | ||
| "without returning a value") \ | ||
| SANITIZER_CHECK(MulOverflow, mul_overflow, 0, \ | ||
| "Integer multiplication overflowed") \ | ||
| SANITIZER_CHECK(NegateOverflow, negate_overflow, 0, \ | ||
| "Integer negation overflowed") \ | ||
| SANITIZER_CHECK( \ | ||
| NullabilityArg, nullability_arg, 0, \ | ||
| "Passing null as an argument which is annotated with _Nonnull") \ | ||
| SANITIZER_CHECK(NullabilityReturn, nullability_return, 1, \ | ||
| "Returning null from a function with a return type " \ | ||
| "annotated with _Nonnull") \ | ||
| SANITIZER_CHECK(NonnullArg, nonnull_arg, 0, \ | ||
| "Passing null pointer as an argument which is declared to " \ | ||
| "never be null") \ | ||
| SANITIZER_CHECK(NonnullReturn, nonnull_return, 1, \ | ||
| "Returning null pointer from a function which is declared " \ | ||
| "to never return null") \ | ||
| SANITIZER_CHECK(OutOfBounds, out_of_bounds, 0, "Array index out of bounds") \ | ||
| SANITIZER_CHECK(PointerOverflow, pointer_overflow, 0, \ | ||
| "Pointer arithmetic overflowed bounds") \ | ||
| SANITIZER_CHECK(ShiftOutOfBounds, shift_out_of_bounds, 0, \ | ||
| "Shift exponent is too large for the type") \ | ||
| SANITIZER_CHECK(SubOverflow, sub_overflow, 0, \ | ||
| "Integer subtraction overflowed") \ | ||
| SANITIZER_CHECK(TypeMismatch, type_mismatch, 1, \ | ||
| "Type mismatch in operation") \ | ||
| SANITIZER_CHECK(AlignmentAssumption, alignment_assumption, 0, \ | ||
| "Alignment assumption violated") \ | ||
| SANITIZER_CHECK( \ | ||
| VLABoundNotPositive, vla_bound_not_positive, 0, \ | ||
| "Variable length array bound evaluates to non-positive value") \ | ||
| SANITIZER_CHECK(BoundsSafety, bounds_safety, 0, \ | ||
| "") // BoundsSafety Msg is empty because it is not considered | ||
fmayer marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // part of UBSan; therefore, no trap reason is emitted for | ||
| // this case. | ||
|
|
||
| enum SanitizerHandler { | ||
| #define SANITIZER_CHECK(Enum, Name, Version) Enum, | ||
| #define SANITIZER_CHECK(Enum, Name, Version, Msg) Enum, | ||
| LIST_SANITIZER_CHECKS | ||
| #undef SANITIZER_CHECK | ||
| }; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.