ubsan_handlers.cc revision 9b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535
1eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith//===-- ubsan_handlers.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 22eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smithnamespace __ubsan { 236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const char *TypeCheckKinds[] = { 246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "load of", "store to", "reference binding to", "member access within", 2545a8124a70fa720756c4c40d741b588172879bb7Richard Smith "member call on", "constructor call on", "downcast of", "downcast of" 266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith }; 27eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith} 28eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith 295f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smithstatic void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer, 305f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Location FallbackLoc) { 312af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Location Loc = Data->Loc.acquire(); 322af552f98f980178db37eed28a609b6bf55f6df8Will Dietz 332af552f98f980178db37eed28a609b6bf55f6df8Will Dietz // Use the SourceLocation from Data to track deduplication, even if 'invalid' 342af552f98f980178db37eed28a609b6bf55f6df8Will Dietz if (Loc.getSourceLocation().isDisabled()) 352af552f98f980178db37eed28a609b6bf55f6df8Will Dietz return; 365f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith if (Data->Loc.isInvalid()) 375f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith Loc = FallbackLoc; 385f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith 396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (!Pointer) 4025ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(Loc, DL_Error, "%0 null pointer of type %1") 416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << Data->Type; 426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (Data->Alignment && (Pointer & (Data->Alignment - 1))) 4325ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(Loc, DL_Error, "%0 misaligned address %1 for type %3, " 4425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "which requires %2 byte alignment") 456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer 466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Data->Alignment << Data->Type; 476ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 4825ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(Loc, DL_Error, "%0 address %1 with insufficient space " 4925ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "for an object of type %2") 506ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer << Data->Type; 5125ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith if (Pointer) 5225ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(Pointer, DL_Note, "pointer points here"); 53a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 545f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smithvoid __ubsan::__ubsan_handle_type_mismatch(TypeMismatchData *Data, 555f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith ValueHandle Pointer) { 565f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith handleTypeMismatchImpl(Data, Pointer, getCallerLocation()); 575f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith} 58a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_type_mismatch_abort(TypeMismatchData *Data, 595f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith ValueHandle Pointer) { 605f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith handleTypeMismatchImpl(Data, Pointer, getCallerLocation()); 616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 6480af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Common diagnostic emission for various forms of integer overflow. 6580af605afd0e92a2a128c81898f647207f384e08Will Dietztemplate<typename T> static void HandleIntegerOverflow(OverflowData *Data, 6625ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith ValueHandle LHS, 6725ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith const char *Operator, 6825ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith T RHS) { 692af552f98f980178db37eed28a609b6bf55f6df8Will Dietz SourceLocation Loc = Data->Loc.acquire(); 702af552f98f980178db37eed28a609b6bf55f6df8Will Dietz if (Loc.isDisabled()) 712af552f98f980178db37eed28a609b6bf55f6df8Will Dietz return; 722af552f98f980178db37eed28a609b6bf55f6df8Will Dietz 732af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, "%0 integer overflow: " 742af552f98f980178db37eed28a609b6bf55f6df8Will Dietz "%1 %2 %3 cannot be represented in type %4") 7580af605afd0e92a2a128c81898f647207f384e08Will Dietz << (Data->Type.isSignedIntegerTy() ? "signed" : "unsigned") 766ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, LHS) << Operator << RHS << Data->Type; 776ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 786ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 796ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_add_overflow(OverflowData *Data, 806ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 8180af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "+", Value(Data->Type, RHS)); 826ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 83a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_add_overflow_abort(OverflowData *Data, 84a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 85a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 86a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_add_overflow(Data, LHS, RHS); 87a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 88a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 896ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 906ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_sub_overflow(OverflowData *Data, 916ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 9280af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "-", Value(Data->Type, RHS)); 936ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 94a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_sub_overflow_abort(OverflowData *Data, 95a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 96a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 97a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_sub_overflow(Data, LHS, RHS); 98a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 99a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 1006ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1016ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_mul_overflow(OverflowData *Data, 1026ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 10380af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "*", Value(Data->Type, RHS)); 1046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 105a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_mul_overflow_abort(OverflowData *Data, 106a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 107a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 108a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_mul_overflow(Data, LHS, RHS); 109a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 110a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 1116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data, 1136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle OldVal) { 1142af552f98f980178db37eed28a609b6bf55f6df8Will Dietz SourceLocation Loc = Data->Loc.acquire(); 1152af552f98f980178db37eed28a609b6bf55f6df8Will Dietz if (Loc.isDisabled()) 1162af552f98f980178db37eed28a609b6bf55f6df8Will Dietz return; 1172af552f98f980178db37eed28a609b6bf55f6df8Will Dietz 118f359dea95de4a17287d11052e9b552100c152287Will Dietz if (Data->Type.isSignedIntegerTy()) 1192af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, 120f359dea95de4a17287d11052e9b552100c152287Will Dietz "negation of %0 cannot be represented in type %1; " 121f359dea95de4a17287d11052e9b552100c152287Will Dietz "cast to an unsigned type to negate this value to itself") 122f359dea95de4a17287d11052e9b552100c152287Will Dietz << Value(Data->Type, OldVal) << Data->Type; 123f359dea95de4a17287d11052e9b552100c152287Will Dietz else 1242af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, 125f359dea95de4a17287d11052e9b552100c152287Will Dietz "negation of %0 cannot be represented in type %1") 126f359dea95de4a17287d11052e9b552100c152287Will Dietz << Value(Data->Type, OldVal) << Data->Type; 127a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 128a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_negate_overflow_abort(OverflowData *Data, 129a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle OldVal) { 130a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_negate_overflow(Data, OldVal); 1316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data, 1356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 1362af552f98f980178db37eed28a609b6bf55f6df8Will Dietz SourceLocation Loc = Data->Loc.acquire(); 1372af552f98f980178db37eed28a609b6bf55f6df8Will Dietz if (Loc.isDisabled()) 1382af552f98f980178db37eed28a609b6bf55f6df8Will Dietz return; 1392af552f98f980178db37eed28a609b6bf55f6df8Will Dietz 1406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->Type, LHS); 1416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->Type, RHS); 1426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isMinusOne()) 1432af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, 14425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "division of %0 by -1 cannot be represented in type %1") 1456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << LHSVal << Data->Type; 1466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1472af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, "division by zero"); 148a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 149a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_divrem_overflow_abort(OverflowData *Data, 150a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 151a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 152a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_divrem_overflow(Data, LHS, RHS); 1536ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1546ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1566ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data, 1576ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 1586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle RHS) { 1592af552f98f980178db37eed28a609b6bf55f6df8Will Dietz SourceLocation Loc = Data->Loc.acquire(); 1602af552f98f980178db37eed28a609b6bf55f6df8Will Dietz if (Loc.isDisabled()) 1612af552f98f980178db37eed28a609b6bf55f6df8Will Dietz return; 1622af552f98f980178db37eed28a609b6bf55f6df8Will Dietz 1636ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->LHSType, LHS); 1646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->RHSType, RHS); 1656ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isNegative()) 1662af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, "shift exponent %0 is negative") << RHSVal; 1676ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (RHSVal.getPositiveIntValue() >= Data->LHSType.getIntegerBitWidth()) 1682af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, 16925ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "shift exponent %0 is too large for %1-bit type %2") 1706ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << RHSVal << Data->LHSType.getIntegerBitWidth() << Data->LHSType; 1716ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (LHSVal.isNegative()) 1722af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, "left shift of negative value %0") << LHSVal; 1736ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1742af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, 17525ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "left shift of %0 by %1 places cannot be represented in type %2") 17625ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith << LHSVal << RHSVal << Data->LHSType; 177a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 178a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_shift_out_of_bounds_abort( 179a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ShiftOutOfBoundsData *Data, 180a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 181a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 182a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_shift_out_of_bounds(Data, LHS, RHS); 1836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1846ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1856ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 186a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smithvoid __ubsan::__ubsan_handle_out_of_bounds(OutOfBoundsData *Data, 187a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith ValueHandle Index) { 188a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith SourceLocation Loc = Data->Loc.acquire(); 189a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith if (Loc.isDisabled()) 190a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith return; 191a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith 192a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith Value IndexVal(Data->IndexType, Index); 193a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith Diag(Loc, DL_Error, "index %0 out of bounds for type %1") 194a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith << IndexVal << Data->ArrayType; 195a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith} 196a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smithvoid __ubsan::__ubsan_handle_out_of_bounds_abort(OutOfBoundsData *Data, 197a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith ValueHandle Index) { 198a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith __ubsan_handle_out_of_bounds(Data, Index); 199a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith Die(); 200a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith} 201a0b1e21d72429c3672115b3ddc85240e3b7ac88bRichard Smith 2026ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) { 20325ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(Data->Loc, DL_Error, "execution reached a __builtin_unreachable() call"); 2046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 2056ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 2066ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 2076ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) { 20825ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(Data->Loc, DL_Error, 20925ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "execution reached the end of a value-returning function " 21025ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "without returning a value"); 2116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 2126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 213b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith 214b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smithvoid __ubsan::__ubsan_handle_vla_bound_not_positive(VLABoundData *Data, 215b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith ValueHandle Bound) { 2162af552f98f980178db37eed28a609b6bf55f6df8Will Dietz SourceLocation Loc = Data->Loc.acquire(); 2172af552f98f980178db37eed28a609b6bf55f6df8Will Dietz if (Loc.isDisabled()) 2182af552f98f980178db37eed28a609b6bf55f6df8Will Dietz return; 2192af552f98f980178db37eed28a609b6bf55f6df8Will Dietz 2202af552f98f980178db37eed28a609b6bf55f6df8Will Dietz Diag(Loc, DL_Error, "variable length array bound evaluates to " 2212af552f98f980178db37eed28a609b6bf55f6df8Will Dietz "non-positive value %0") 222b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith << Value(Data->Type, Bound); 223a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 224a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data, 225a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle Bound) { 226a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_vla_bound_not_positive(Data, Bound); 227b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith Die(); 228b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith} 22958561700a4abad310911a24a867da49a14fae91eRichard Smith 2305f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith 23158561700a4abad310911a24a867da49a14fae91eRichard Smithvoid __ubsan::__ubsan_handle_float_cast_overflow(FloatCastOverflowData *Data, 23258561700a4abad310911a24a867da49a14fae91eRichard Smith ValueHandle From) { 2332af552f98f980178db37eed28a609b6bf55f6df8Will Dietz // TODO: Add deduplication once a SourceLocation is generated for this check. 23425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(getCallerLocation(), DL_Error, 23525ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "value %0 is outside the range of representable values of type %2") 23658561700a4abad310911a24a867da49a14fae91eRichard Smith << Value(Data->FromType, From) << Data->FromType << Data->ToType; 237a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 238a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_float_cast_overflow_abort( 239a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz FloatCastOverflowData *Data, 240a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle From) { 24125ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith Diag(getCallerLocation(), DL_Error, 24225ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "value %0 is outside the range of representable values of type %2") 2435f1164955fb28a9bcb826abc195aa2119feb0f97Richard Smith << Value(Data->FromType, From) << Data->FromType << Data->ToType; 24458561700a4abad310911a24a867da49a14fae91eRichard Smith Die(); 24558561700a4abad310911a24a867da49a14fae91eRichard Smith} 246f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith 247f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithvoid __ubsan::__ubsan_handle_load_invalid_value(InvalidValueData *Data, 248f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith ValueHandle Val) { 249d1bf52ecb1211af7fa3fe5f5b05d08033eb1a90cNick Lewycky SourceLocation Loc = Data->Loc.acquire(); 250d1bf52ecb1211af7fa3fe5f5b05d08033eb1a90cNick Lewycky if (Loc.isDisabled()) 251d1bf52ecb1211af7fa3fe5f5b05d08033eb1a90cNick Lewycky return; 252d1bf52ecb1211af7fa3fe5f5b05d08033eb1a90cNick Lewycky 253d1bf52ecb1211af7fa3fe5f5b05d08033eb1a90cNick Lewycky Diag(Loc, DL_Error, 25425ee97fe8ada76755c8bd1087fac9cc3cd03b28cRichard Smith "load of value %0, which is not a valid value for type %1") 255f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith << Value(Data->Type, Val) << Data->Type; 256f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith} 257f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smithvoid __ubsan::__ubsan_handle_load_invalid_value_abort(InvalidValueData *Data, 258f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith ValueHandle Val) { 259d1bf52ecb1211af7fa3fe5f5b05d08033eb1a90cNick Lewycky __ubsan_handle_load_invalid_value(Data, Val); 260f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith Die(); 261f2d77d03b75733139c9f0896162bbc7a6fc38385Richard Smith} 2629b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne 2639b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbournevoid __ubsan::__ubsan_handle_function_type_mismatch( 2649b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne FunctionTypeMismatchData *Data, 2659b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne ValueHandle Function) { 2669b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne const char *FName = "(unknown)"; 2679b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne 2689b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne Location Loc = getFunctionLocation(Function, &FName); 2699b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne 2709b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne Diag(Data->Loc, DL_Error, 2719b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne "call to function %0 through pointer to incorrect function type %1") 2729b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne << FName << Data->Type; 2739b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne Diag(Loc, DL_Note, "%0 defined here") << FName; 2749b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne} 2759b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne 2769b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbournevoid __ubsan::__ubsan_handle_function_type_mismatch_abort( 2779b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne FunctionTypeMismatchData *Data, 2789b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne ValueHandle Function) { 2799b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne __ubsan_handle_function_type_mismatch(Data, Function); 2809b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne Die(); 2819b5f95f5fe1a24be4dfb7436b64cb0e0f8c00535Peter Collingbourne} 282