Home | History | Annotate | Line # | Download | only in ubsan
      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