|  | //===-- SanitizerHandler.h - Definition of sanitizer handlers ---*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This is the internal per-function state used for llvm translation. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_LIB_CODEGEN_SANITIZER_HANDLER_H | 
|  | #define LLVM_CLANG_LIB_CODEGEN_SANITIZER_HANDLER_H | 
|  |  | 
|  | #define LIST_SANITIZER_CHECKS                                                  \ | 
|  | 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 | 
|  | // part of UBSan; therefore, no trap reason is emitted for | 
|  | // this case. | 
|  |  | 
|  | enum SanitizerHandler { | 
|  | #define SANITIZER_CHECK(Enum, Name, Version, Msg) Enum, | 
|  | LIST_SANITIZER_CHECKS | 
|  | #undef SANITIZER_CHECK | 
|  | }; | 
|  |  | 
|  | #endif // LLVM_CLANG_LIB_CODEGEN_SANITIZER_HANDLER_H |