1 1.1 kamil //===-- ubsan_handlers.h ----------------------------------------*- C++ -*-===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // 10 1.1 kamil // Entry points to the runtime library for Clang's undefined behavior sanitizer. 11 1.1 kamil // 12 1.1 kamil //===----------------------------------------------------------------------===// 13 1.1 kamil #ifndef UBSAN_HANDLERS_H 14 1.1 kamil #define UBSAN_HANDLERS_H 15 1.1 kamil 16 1.1 kamil #include "ubsan_value.h" 17 1.1 kamil 18 1.1 kamil namespace __ubsan { 19 1.1 kamil 20 1.1 kamil struct TypeMismatchData { 21 1.1 kamil SourceLocation Loc; 22 1.1 kamil const TypeDescriptor &Type; 23 1.1 kamil unsigned char LogAlignment; 24 1.1 kamil unsigned char TypeCheckKind; 25 1.1 kamil }; 26 1.1 kamil 27 1.1 kamil #define UNRECOVERABLE(checkname, ...) \ 28 1.1 kamil extern "C" SANITIZER_INTERFACE_ATTRIBUTE NORETURN \ 29 1.1 kamil void __ubsan_handle_ ## checkname( __VA_ARGS__ ); 30 1.1 kamil 31 1.1 kamil #define RECOVERABLE(checkname, ...) \ 32 1.1 kamil extern "C" SANITIZER_INTERFACE_ATTRIBUTE \ 33 1.1 kamil void __ubsan_handle_ ## checkname( __VA_ARGS__ ); \ 34 1.1 kamil extern "C" SANITIZER_INTERFACE_ATTRIBUTE NORETURN \ 35 1.1 kamil void __ubsan_handle_ ## checkname ## _abort( __VA_ARGS__ ); 36 1.1 kamil 37 1.1 kamil /// \brief Handle a runtime type check failure, caused by either a misaligned 38 1.1 kamil /// pointer, a null pointer, or a pointer to insufficient storage for the 39 1.1 kamil /// type. 40 1.1 kamil RECOVERABLE(type_mismatch_v1, TypeMismatchData *Data, ValueHandle Pointer) 41 1.1 kamil 42 1.1 kamil struct OverflowData { 43 1.1 kamil SourceLocation Loc; 44 1.1 kamil const TypeDescriptor &Type; 45 1.1 kamil }; 46 1.1 kamil 47 1.1 kamil /// \brief Handle an integer addition overflow. 48 1.1 kamil RECOVERABLE(add_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 49 1.1 kamil 50 1.1 kamil /// \brief Handle an integer subtraction overflow. 51 1.1 kamil RECOVERABLE(sub_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 52 1.1 kamil 53 1.1 kamil /// \brief Handle an integer multiplication overflow. 54 1.1 kamil RECOVERABLE(mul_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 55 1.1 kamil 56 1.1 kamil /// \brief Handle a signed integer overflow for a unary negate operator. 57 1.1 kamil RECOVERABLE(negate_overflow, OverflowData *Data, ValueHandle OldVal) 58 1.1 kamil 59 1.1 kamil /// \brief Handle an INT_MIN/-1 overflow or division by zero. 60 1.1 kamil RECOVERABLE(divrem_overflow, OverflowData *Data, 61 1.1 kamil ValueHandle LHS, ValueHandle RHS) 62 1.1 kamil 63 1.1 kamil struct ShiftOutOfBoundsData { 64 1.1 kamil SourceLocation Loc; 65 1.1 kamil const TypeDescriptor &LHSType; 66 1.1 kamil const TypeDescriptor &RHSType; 67 1.1 kamil }; 68 1.1 kamil 69 1.1 kamil /// \brief Handle a shift where the RHS is out of bounds or a left shift where 70 1.1 kamil /// the LHS is negative or overflows. 71 1.1 kamil RECOVERABLE(shift_out_of_bounds, ShiftOutOfBoundsData *Data, 72 1.1 kamil ValueHandle LHS, ValueHandle RHS) 73 1.1 kamil 74 1.1 kamil struct OutOfBoundsData { 75 1.1 kamil SourceLocation Loc; 76 1.1 kamil const TypeDescriptor &ArrayType; 77 1.1 kamil const TypeDescriptor &IndexType; 78 1.1 kamil }; 79 1.1 kamil 80 1.1 kamil /// \brief Handle an array index out of bounds error. 81 1.1 kamil RECOVERABLE(out_of_bounds, OutOfBoundsData *Data, ValueHandle Index) 82 1.1 kamil 83 1.1 kamil struct UnreachableData { 84 1.1 kamil SourceLocation Loc; 85 1.1 kamil }; 86 1.1 kamil 87 1.1 kamil /// \brief Handle a __builtin_unreachable which is reached. 88 1.1 kamil UNRECOVERABLE(builtin_unreachable, UnreachableData *Data) 89 1.1 kamil /// \brief Handle reaching the end of a value-returning function. 90 1.1 kamil UNRECOVERABLE(missing_return, UnreachableData *Data) 91 1.1 kamil 92 1.1 kamil struct VLABoundData { 93 1.1 kamil SourceLocation Loc; 94 1.1 kamil const TypeDescriptor &Type; 95 1.1 kamil }; 96 1.1 kamil 97 1.1 kamil /// \brief Handle a VLA with a non-positive bound. 98 1.1 kamil RECOVERABLE(vla_bound_not_positive, VLABoundData *Data, ValueHandle Bound) 99 1.1 kamil 100 1.1 kamil // Keeping this around for binary compatibility with (sanitized) programs 101 1.1 kamil // compiled with older compilers. 102 1.1 kamil struct FloatCastOverflowData { 103 1.1 kamil const TypeDescriptor &FromType; 104 1.1 kamil const TypeDescriptor &ToType; 105 1.1 kamil }; 106 1.1 kamil 107 1.1 kamil struct FloatCastOverflowDataV2 { 108 1.1 kamil SourceLocation Loc; 109 1.1 kamil const TypeDescriptor &FromType; 110 1.1 kamil const TypeDescriptor &ToType; 111 1.1 kamil }; 112 1.1 kamil 113 1.1 kamil /// Handle overflow in a conversion to or from a floating-point type. 114 1.1 kamil /// void *Data is one of FloatCastOverflowData* or FloatCastOverflowDataV2* 115 1.1 kamil RECOVERABLE(float_cast_overflow, void *Data, ValueHandle From) 116 1.1 kamil 117 1.1 kamil struct InvalidValueData { 118 1.1 kamil SourceLocation Loc; 119 1.1 kamil const TypeDescriptor &Type; 120 1.1 kamil }; 121 1.1 kamil 122 1.1 kamil /// \brief Handle a load of an invalid value for the type. 123 1.1 kamil RECOVERABLE(load_invalid_value, InvalidValueData *Data, ValueHandle Val) 124 1.1 kamil 125 1.1 kamil /// Known implicit conversion check kinds. 126 1.1 kamil /// Keep in sync with the enum of the same name in CGExprScalar.cpp 127 1.1 kamil enum ImplicitConversionCheckKind : unsigned char { 128 1.1 kamil ICCK_IntegerTruncation = 0, // Legacy, was only used by clang 7. 129 1.1 kamil ICCK_UnsignedIntegerTruncation = 1, 130 1.1 kamil ICCK_SignedIntegerTruncation = 2, 131 1.1 kamil ICCK_IntegerSignChange = 3, 132 1.1 kamil ICCK_SignedIntegerTruncationOrSignChange = 4, 133 1.1 kamil }; 134 1.1 kamil 135 1.1 kamil struct ImplicitConversionData { 136 1.1 kamil SourceLocation Loc; 137 1.1 kamil const TypeDescriptor &FromType; 138 1.1 kamil const TypeDescriptor &ToType; 139 1.1 kamil /* ImplicitConversionCheckKind */ unsigned char Kind; 140 1.1 kamil }; 141 1.1 kamil 142 1.1 kamil /// \brief Implict conversion that changed the value. 143 1.1 kamil RECOVERABLE(implicit_conversion, ImplicitConversionData *Data, ValueHandle Src, 144 1.1 kamil ValueHandle Dst) 145 1.1 kamil 146 1.1 kamil /// Known builtin check kinds. 147 1.1 kamil /// Keep in sync with the enum of the same name in CodeGenFunction.h 148 1.1 kamil enum BuiltinCheckKind : unsigned char { 149 1.1 kamil BCK_CTZPassedZero, 150 1.1 kamil BCK_CLZPassedZero, 151 1.1 kamil }; 152 1.1 kamil 153 1.1 kamil struct InvalidBuiltinData { 154 1.1 kamil SourceLocation Loc; 155 1.1 kamil unsigned char Kind; 156 1.1 kamil }; 157 1.1 kamil 158 1.1 kamil /// Handle a builtin called in an invalid way. 159 1.1 kamil RECOVERABLE(invalid_builtin, InvalidBuiltinData *Data) 160 1.1 kamil 161 1.1 kamil struct FunctionTypeMismatchData { 162 1.1 kamil SourceLocation Loc; 163 1.1 kamil const TypeDescriptor &Type; 164 1.1 kamil }; 165 1.1 kamil 166 1.1 kamil RECOVERABLE(function_type_mismatch, 167 1.1 kamil FunctionTypeMismatchData *Data, 168 1.1 kamil ValueHandle Val) 169 1.1 kamil 170 1.1 kamil struct NonNullReturnData { 171 1.1 kamil SourceLocation AttrLoc; 172 1.1 kamil }; 173 1.1 kamil 174 1.1 kamil /// \brief Handle returning null from function with the returns_nonnull 175 1.1 kamil /// attribute, or a return type annotated with _Nonnull. 176 1.1 kamil RECOVERABLE(nonnull_return_v1, NonNullReturnData *Data, SourceLocation *Loc) 177 1.1 kamil RECOVERABLE(nullability_return_v1, NonNullReturnData *Data, SourceLocation *Loc) 178 1.1 kamil 179 1.1 kamil struct NonNullArgData { 180 1.1 kamil SourceLocation Loc; 181 1.1 kamil SourceLocation AttrLoc; 182 1.1 kamil int ArgIndex; 183 1.1 kamil }; 184 1.1 kamil 185 1.1 kamil /// \brief Handle passing null pointer to a function parameter with the nonnull 186 1.1 kamil /// attribute, or a _Nonnull type annotation. 187 1.1 kamil RECOVERABLE(nonnull_arg, NonNullArgData *Data) 188 1.1 kamil RECOVERABLE(nullability_arg, NonNullArgData *Data) 189 1.1 kamil 190 1.1 kamil struct PointerOverflowData { 191 1.1 kamil SourceLocation Loc; 192 1.1 kamil }; 193 1.1 kamil 194 1.1 kamil RECOVERABLE(pointer_overflow, PointerOverflowData *Data, ValueHandle Base, 195 1.1 kamil ValueHandle Result) 196 1.1 kamil 197 1.1 kamil /// \brief Known CFI check kinds. 198 1.1 kamil /// Keep in sync with the enum of the same name in CodeGenFunction.h 199 1.1 kamil enum CFITypeCheckKind : unsigned char { 200 1.1 kamil CFITCK_VCall, 201 1.1 kamil CFITCK_NVCall, 202 1.1 kamil CFITCK_DerivedCast, 203 1.1 kamil CFITCK_UnrelatedCast, 204 1.1 kamil CFITCK_ICall, 205 1.1 kamil CFITCK_NVMFCall, 206 1.1 kamil CFITCK_VMFCall, 207 1.1 kamil }; 208 1.1 kamil 209 1.1 kamil struct CFICheckFailData { 210 1.1 kamil CFITypeCheckKind CheckKind; 211 1.1 kamil SourceLocation Loc; 212 1.1 kamil const TypeDescriptor &Type; 213 1.1 kamil }; 214 1.1 kamil 215 1.1 kamil /// \brief Handle control flow integrity failures. 216 1.1 kamil RECOVERABLE(cfi_check_fail, CFICheckFailData *Data, ValueHandle Function, 217 1.1 kamil uptr VtableIsValid) 218 1.1 kamil 219 1.1 kamil struct ReportOptions; 220 1.1 kamil 221 1.1 kamil extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __ubsan_handle_cfi_bad_type( 222 1.1 kamil CFICheckFailData *Data, ValueHandle Vtable, bool ValidVtable, 223 1.1 kamil ReportOptions Opts); 224 1.1 kamil 225 1.1 kamil } 226 1.1 kamil 227 1.1 kamil #endif // UBSAN_HANDLERS_H 228