ubsan_handlers.cc revision 6ebe45146a2d93eb010b9bb5ea34cb94c6900f83
16ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===-- ubsan_report.cc ---------------------------------------------------===// 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// Error logging entry points for the UBSan runtime. 116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith// 126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith//===----------------------------------------------------------------------===// 136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "ubsan_handlers.h" 156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "ubsan_diag.h" 166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith#include "sanitizer_common/sanitizer_common.h" 186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithusing namespace __sanitizer; 206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithusing namespace __ubsan; 216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard SmithNORETURN void __sanitizer::Die() { 236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith __builtin_trap(); 246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 256ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard SmithNORETURN void __sanitizer::CheckFailed(const char *File, int Line, 276ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const char *Cond, u64 V1, u64 V2) { 286ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(SourceLocation(File, Line, 0), 296ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "CHECK failed: %0 (with values %1 and %2)") 306ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Cond << V1 << V2; 316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_type_mismatch(TypeMismatchData *Data, 356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle Pointer) { 366ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const char *TypeCheckKinds[] = { 376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "load of", "store to", "reference binding to", "member access within", 386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "member call on" 396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith }; 406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (!Pointer) 416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "%0 null pointer of type %1") 426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << Data->Type; 436ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (Data->Alignment && (Pointer & (Data->Alignment - 1))) 446ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "%0 misaligned address %1 for type %3, " 456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "which requires %2 byte alignment") 466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer 476ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Data->Alignment << Data->Type; 486ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 496ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "%0 address %1 with insufficient space " 506ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "for an object of type %2") 516ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer << Data->Type; 526ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 536ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 546ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith/// \brief Common diagnostic emission for various forms of signed overflow. 566ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithtemplate<typename T> static void HandleSignedOverflow(OverflowData *Data, 576ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const char *Operator, 596ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith T RHS) { 606ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "signed integer overflow: " 616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "%0 %1 %2 cannot be represented in type %3") 626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, LHS) << Operator << RHS << Data->Type; 636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 656ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 666ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_add_overflow(OverflowData *Data, 676ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 686ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith HandleSignedOverflow(Data, LHS, "+", Value(Data->Type, RHS)); 696ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 706ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 716ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_sub_overflow(OverflowData *Data, 726ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 736ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith HandleSignedOverflow(Data, LHS, "-", Value(Data->Type, RHS)); 746ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 756ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 766ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_mul_overflow(OverflowData *Data, 776ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 786ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith HandleSignedOverflow(Data, LHS, "*", Value(Data->Type, RHS)); 796ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 806ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 816ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data, 826ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle OldVal) { 836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "negation of %0 cannot be represented in type %1; " 846ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "cast to an unsigned type to negate this value to itself") 856ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, OldVal) << Data->Type; 866ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 876ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 886ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 896ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data, 906ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 916ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->Type, LHS); 926ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->Type, RHS); 936ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isMinusOne()) 946ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "division of %0 by -1 cannot be represented in type %1") 956ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << LHSVal << Data->Type; 966ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 976ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "division by zero"); 986ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 996ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1006ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1016ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data, 1026ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 1036ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle RHS) { 1046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->LHSType, LHS); 1056ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->RHSType, RHS); 1066ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isNegative()) 1076ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "shift exponent %0 is negative") << RHSVal; 1086ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (RHSVal.getPositiveIntValue() >= Data->LHSType.getIntegerBitWidth()) 1096ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "shift exponent %0 is too large for %1-bit type %2") 1106ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << RHSVal << Data->LHSType.getIntegerBitWidth() << Data->LHSType; 1116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (LHSVal.isNegative()) 1126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "left shift of negative value %0") << LHSVal; 1136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "left shift of %0 by %1 places cannot be represented " 1156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "in type %2") << LHSVal << RHSVal << Data->LHSType; 1166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) { 1206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "execution reached a __builtin_unreachable() call"); 1216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) { 1256ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "execution reached the end of a value-returning function " 1266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "without returning a value"); 1276ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1286ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 129