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