ubsan_handlers.h revision 90ad168560fa07fcc21c88d5710a05f851ecafcf
130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//===-- ubsan_handlers.h ----------------------------------------*- C++ -*-===// 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// The LLVM Compiler Infrastructure 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// This file is distributed under the University of Illinois Open Source 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// License. See LICENSE.TXT for details. 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//===----------------------------------------------------------------------===// 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Entry points to the runtime library for Clang's undefined behavior sanitizer. 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//===----------------------------------------------------------------------===// 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef UBSAN_HANDLERS_H 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define UBSAN_HANDLERS_H 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "ubsan_value.h" 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace __ubsan { 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct TypeMismatchData { 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SourceLocation Loc; 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &Type; 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun uptr Alignment; 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun unsigned char TypeCheckKind; 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define RECOVERABLE(checkname, ...) \ 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SANITIZER_INTERFACE_ATTRIBUTE \ 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun extern "C" void __ubsan_handle_ ## checkname( __VA_ARGS__ ); \ 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SANITIZER_INTERFACE_ATTRIBUTE \ 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun extern "C" void __ubsan_handle_ ## checkname ## _abort( __VA_ARGS__ ); 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle a runtime type check failure, caused by either a misaligned 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// pointer, a null pointer, or a pointer to insufficient storage for the 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// type. 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(type_mismatch, TypeMismatchData *Data, ValueHandle Pointer) 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct OverflowData { 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SourceLocation Loc; 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &Type; 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle an integer addition overflow. 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(add_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle an integer subtraction overflow. 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(sub_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle an integer multiplication overflow. 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(mul_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle a signed integer overflow for a unary negate operator. 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(negate_overflow, OverflowData *Data, ValueHandle OldVal) 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle an INT_MIN/-1 overflow or division by zero. 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(divrem_overflow, OverflowData *Data, 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ValueHandle LHS, ValueHandle RHS) 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct ShiftOutOfBoundsData { 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SourceLocation Loc; 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &LHSType; 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &RHSType; 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle a shift where the RHS is out of bounds or a left shift where 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// the LHS is negative or overflows. 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(shift_out_of_bounds, ShiftOutOfBoundsData *Data, 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ValueHandle LHS, ValueHandle RHS) 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct UnreachableData { 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SourceLocation Loc; 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle a __builtin_unreachable which is reached. 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunSANITIZER_INTERFACE_ATTRIBUTE 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunextern "C" void __ubsan_handle_builtin_unreachable(UnreachableData *Data); 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle reaching the end of a value-returning function. 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunSANITIZER_INTERFACE_ATTRIBUTE 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunextern "C" void __ubsan_handle_missing_return(UnreachableData *Data); 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct VLABoundData { 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SourceLocation Loc; 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &Type; 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle a VLA with a non-positive bound. 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(vla_bound_not_positive, VLABoundData *Data, ValueHandle Bound) 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct FloatCastOverflowData { 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // FIXME: SourceLocation Loc; 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &FromType; 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &ToType; 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle overflow in a conversion to or from a floating-point type. 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(float_cast_overflow, FloatCastOverflowData *Data, ValueHandle From) 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct InvalidValueData { 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // FIXME: SourceLocation Loc; 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TypeDescriptor &Type; 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/// \brief Handle a load of an invalid value for the type. 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunRECOVERABLE(load_invalid_value, InvalidValueData *Data, ValueHandle Val) 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // UBSAN_HANDLERS_H 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun