16ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===-- ubsan_handlers.h ----------------------------------------*- C++ -*-===// 26ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// 36ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// The LLVM Compiler Infrastructure 46ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// 56ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// This file is distributed under the University of Illinois Open Source 66ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// License. See LICENSE.TXT for details. 76ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// 86ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===----------------------------------------------------------------------===// 96ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// 106ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// Entry points to the runtime library for Clang's undefined behavior sanitizer. 116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// 126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===----------------------------------------------------------------------===// 136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#ifndef UBSAN_HANDLERS_H 146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#define UBSAN_HANDLERS_H 156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "ubsan_value.h" 176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithnamespace __ubsan { 196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct TypeMismatchData { 216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith SourceLocation Loc; 226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const TypeDescriptor &Type; 236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith uptr Alignment; 246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith unsigned char TypeCheckKind; 256ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}; 266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 27a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz#define RECOVERABLE(checkname, ...) \ 28a44110995241d30a886d711cbc33f65269b170eaWill Dietz extern "C" SANITIZER_INTERFACE_ATTRIBUTE \ 29a44110995241d30a886d711cbc33f65269b170eaWill Dietz void __ubsan_handle_ ## checkname( __VA_ARGS__ ); \ 30a44110995241d30a886d711cbc33f65269b170eaWill Dietz extern "C" SANITIZER_INTERFACE_ATTRIBUTE \ 31a44110995241d30a886d711cbc33f65269b170eaWill Dietz void __ubsan_handle_ ## checkname ## _abort( __VA_ARGS__ ); 32a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz 336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a runtime type check failure, caused by either a misaligned 346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// pointer, a null pointer, or a pointer to insufficient storage for the 356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// type. 36a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(type_mismatch, TypeMismatchData *Data, ValueHandle Pointer) 376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct OverflowData { 396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith SourceLocation Loc; 406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const TypeDescriptor &Type; 416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}; 426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 4380af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Handle an integer addition overflow. 44a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(add_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 45a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz 4680af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Handle an integer subtraction overflow. 47a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(sub_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 48a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz 4980af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Handle an integer multiplication overflow. 50a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(mul_overflow, OverflowData *Data, ValueHandle LHS, ValueHandle RHS) 51a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz 526ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a signed integer overflow for a unary negate operator. 53a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(negate_overflow, OverflowData *Data, ValueHandle OldVal) 54a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz 556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle an INT_MIN/-1 overflow or division by zero. 56a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(divrem_overflow, OverflowData *Data, 57a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, ValueHandle RHS) 586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 596ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct ShiftOutOfBoundsData { 606ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith SourceLocation Loc; 616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const TypeDescriptor &LHSType; 626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const TypeDescriptor &RHSType; 636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}; 646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 656ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a shift where the RHS is out of bounds or a left shift where 666ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// the LHS is negative or overflows. 67a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(shift_out_of_bounds, ShiftOutOfBoundsData *Data, 68a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, ValueHandle RHS) 696ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 70a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smithstruct OutOfBoundsData { 71a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith SourceLocation Loc; 72a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith const TypeDescriptor &ArrayType; 73a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith const TypeDescriptor &IndexType; 74a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith}; 75a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith 76a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith/// \brief Handle an array index out of bounds error. 77a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard SmithRECOVERABLE(out_of_bounds, OutOfBoundsData *Data, ValueHandle Index) 78a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith 796ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct UnreachableData { 806ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith SourceLocation Loc; 816ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}; 826ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle a __builtin_unreachable which is reached. 84a44110995241d30a886d711cbc33f65269b170eaWill Dietzextern "C" SANITIZER_INTERFACE_ATTRIBUTE 85a44110995241d30a886d711cbc33f65269b170eaWill Dietzvoid __ubsan_handle_builtin_unreachable(UnreachableData *Data); 866ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Handle reaching the end of a value-returning function. 87a44110995241d30a886d711cbc33f65269b170eaWill Dietzextern "C" SANITIZER_INTERFACE_ATTRIBUTE 88a44110995241d30a886d711cbc33f65269b170eaWill Dietzvoid __ubsan_handle_missing_return(UnreachableData *Data); 896ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 90b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smithstruct VLABoundData { 91b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith SourceLocation Loc; 92b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith const TypeDescriptor &Type; 93b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith}; 94b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith 95b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith/// \brief Handle a VLA with a non-positive bound. 96a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(vla_bound_not_positive, VLABoundData *Data, ValueHandle Bound) 97b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith 9858561700a4abad310911a24a867da49a14fae91eRichard Smithstruct FloatCastOverflowData { 9958561700a4abad310911a24a867da49a14fae91eRichard Smith // FIXME: SourceLocation Loc; 10058561700a4abad310911a24a867da49a14fae91eRichard Smith const TypeDescriptor &FromType; 10158561700a4abad310911a24a867da49a14fae91eRichard Smith const TypeDescriptor &ToType; 10258561700a4abad310911a24a867da49a14fae91eRichard Smith}; 10358561700a4abad310911a24a867da49a14fae91eRichard Smith 10458561700a4abad310911a24a867da49a14fae91eRichard Smith/// \brief Handle overflow in a conversion to or from a floating-point type. 105a82a5d360b19080f2b1beae374c12d4f26146450Will DietzRECOVERABLE(float_cast_overflow, FloatCastOverflowData *Data, ValueHandle From) 10658561700a4abad310911a24a867da49a14fae91eRichard Smith 107f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithstruct InvalidValueData { 108f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith // FIXME: SourceLocation Loc; 109f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith const TypeDescriptor &Type; 110f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith}; 111f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith 112f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith/// \brief Handle a load of an invalid value for the type. 113f2d77d03b75733139c9f0896162bbc7a6fc38385Richard SmithRECOVERABLE(load_invalid_value, InvalidValueData *Data, ValueHandle Val) 114f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith 1156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#endif // UBSAN_HANDLERS_H 118