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