ubsan_handlers.cc revision a82a5d360b19080f2b1beae374c12d4f26146450
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", 25eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith "member call on", "constructor call on" 266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith }; 27eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith} 28eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith 29eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smithvoid __ubsan::__ubsan_handle_type_mismatch(TypeMismatchData *Data, 30eda8bd0fc07df35c9ad7de5b698bb717b063e7afRichard Smith ValueHandle Pointer) { 316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (!Pointer) 326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "%0 null pointer of type %1") 336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << Data->Type; 346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (Data->Alignment && (Pointer & (Data->Alignment - 1))) 356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "%0 misaligned address %1 for type %3, " 366ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "which requires %2 byte alignment") 376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer 386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Data->Alignment << Data->Type; 396ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 406ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "%0 address %1 with insufficient space " 416ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "for an object of type %2") 426ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << TypeCheckKinds[Data->TypeCheckKind] << (void*)Pointer << Data->Type; 43a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 44a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_type_mismatch_abort(TypeMismatchData *Data, 45a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle Pointer) { 46a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_type_mismatch(Data, Pointer); 476ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 486ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 496ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 5080af605afd0e92a2a128c81898f647207f384e08Will Dietz/// \brief Common diagnostic emission for various forms of integer overflow. 5180af605afd0e92a2a128c81898f647207f384e08Will Dietztemplate<typename T> static void HandleIntegerOverflow(OverflowData *Data, 526ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 536ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith const char *Operator, 546ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith T RHS) { 5580af605afd0e92a2a128c81898f647207f384e08Will Dietz Diag(Data->Loc, "%0 integer overflow: " 5680af605afd0e92a2a128c81898f647207f384e08Will Dietz "%1 %2 %3 cannot be represented in type %4") 5780af605afd0e92a2a128c81898f647207f384e08Will Dietz << (Data->Type.isSignedIntegerTy() ? "signed" : "unsigned") 586ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, LHS) << Operator << RHS << Data->Type; 596ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 606ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 616ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_add_overflow(OverflowData *Data, 626ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 6380af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "+", Value(Data->Type, RHS)); 646ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 65a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_add_overflow_abort(OverflowData *Data, 66a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 67a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 68a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_add_overflow(Data, LHS, RHS); 69a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 70a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 716ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 726ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_sub_overflow(OverflowData *Data, 736ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 7480af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "-", Value(Data->Type, RHS)); 756ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 76a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_sub_overflow_abort(OverflowData *Data, 77a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 78a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 79a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_sub_overflow(Data, LHS, RHS); 80a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 81a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 826ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 836ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_mul_overflow(OverflowData *Data, 846ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 8580af605afd0e92a2a128c81898f647207f384e08Will Dietz HandleIntegerOverflow(Data, LHS, "*", Value(Data->Type, RHS)); 866ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 87a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_mul_overflow_abort(OverflowData *Data, 88a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 89a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 90a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_mul_overflow(Data, LHS, RHS); 91a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz Die(); 92a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 936ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 946ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data, 956ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle OldVal) { 966ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "negation of %0 cannot be represented in type %1; " 976ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "cast to an unsigned type to negate this value to itself") 986ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << Value(Data->Type, OldVal) << Data->Type; 99a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 100a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_negate_overflow_abort(OverflowData *Data, 101a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle OldVal) { 102a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_negate_overflow(Data, OldVal); 1036ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1046ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1056ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1066ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data, 1076ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, ValueHandle RHS) { 1086ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->Type, LHS); 1096ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->Type, RHS); 1106ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isMinusOne()) 1116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "division of %0 by -1 cannot be represented in type %1") 1126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << LHSVal << Data->Type; 1136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "division by zero"); 115a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 116a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_divrem_overflow_abort(OverflowData *Data, 117a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 118a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 119a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_divrem_overflow(Data, LHS, RHS); 1206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1216ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data, 1246ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle LHS, 1256ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith ValueHandle RHS) { 1266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value LHSVal(Data->LHSType, LHS); 1276ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Value RHSVal(Data->RHSType, RHS); 1286ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith if (RHSVal.isNegative()) 1296ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "shift exponent %0 is negative") << RHSVal; 1306ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (RHSVal.getPositiveIntValue() >= Data->LHSType.getIntegerBitWidth()) 1316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "shift exponent %0 is too large for %1-bit type %2") 1326ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith << RHSVal << Data->LHSType.getIntegerBitWidth() << Data->LHSType; 1336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else if (LHSVal.isNegative()) 1346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "left shift of negative value %0") << LHSVal; 1356ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith else 1366ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "left shift of %0 by %1 places cannot be represented " 1376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "in type %2") << LHSVal << RHSVal << Data->LHSType; 138a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 139a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_shift_out_of_bounds_abort( 140a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ShiftOutOfBoundsData *Data, 141a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle LHS, 142a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle RHS) { 143a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_shift_out_of_bounds(Data, LHS, RHS); 1446ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1456ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1466ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1476ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) { 1486ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "execution reached a __builtin_unreachable() call"); 1496ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1506ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 1516ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith 1526ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithvoid __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) { 1536ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Diag(Data->Loc, "execution reached the end of a value-returning function " 1546ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith "without returning a value"); 1556ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith Die(); 1566ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith} 157b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith 158b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smithvoid __ubsan::__ubsan_handle_vla_bound_not_positive(VLABoundData *Data, 159b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith ValueHandle Bound) { 160b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith Diag(Data->Loc, "variable length array bound evaluates to " 161b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith "non-positive value %0") 162b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith << Value(Data->Type, Bound); 163a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 164a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data, 165a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle Bound) { 166a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_vla_bound_not_positive(Data, Bound); 167b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith Die(); 168b04caf1385a4279a7b95d41c3ccefc61842c3633Richard Smith} 16958561700a4abad310911a24a867da49a14fae91eRichard Smith 17058561700a4abad310911a24a867da49a14fae91eRichard Smithvoid __ubsan::__ubsan_handle_float_cast_overflow(FloatCastOverflowData *Data, 17158561700a4abad310911a24a867da49a14fae91eRichard Smith ValueHandle From) { 17258561700a4abad310911a24a867da49a14fae91eRichard Smith Diag(SourceLocation(), "value %0 is outside the range of representable " 17358561700a4abad310911a24a867da49a14fae91eRichard Smith "values of type %2") 17458561700a4abad310911a24a867da49a14fae91eRichard Smith << Value(Data->FromType, From) << Data->FromType << Data->ToType; 175a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz} 176a82a5d360b19080f2b1beae374c12d4f26146450Will Dietzvoid __ubsan::__ubsan_handle_float_cast_overflow_abort( 177a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz FloatCastOverflowData *Data, 178a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz ValueHandle From) { 179a82a5d360b19080f2b1beae374c12d4f26146450Will Dietz __ubsan_handle_float_cast_overflow(Data, From); 18058561700a4abad310911a24a867da49a14fae91eRichard Smith Die(); 18158561700a4abad310911a24a867da49a14fae91eRichard Smith} 182