#include "ubsan_platform.h"
#if CAN_SANITIZE_UB
#include "ubsan_handlers.h"
#include "ubsan_diag.h"
#include "ubsan_flags.h"
#include "ubsan_monitor.h"
#include "ubsan_value.h"
#include "sanitizer_common/sanitizer_common.h"
usingnamespace__sanitizer;
usingnamespace__ubsan;
namespace __ubsan {
bool ignoreReport(SourceLocation SLoc, ReportOptions Opts, ErrorType ET) { … }
enum TypeCheckKind { … };
extern const char *const TypeCheckKinds[] = …;
}
static void handleTypeMismatchImpl(TypeMismatchData *Data, ValueHandle Pointer,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_type_mismatch_v1(TypeMismatchData *Data,
ValueHandle Pointer) { … }
void __ubsan::__ubsan_handle_type_mismatch_v1_abort(TypeMismatchData *Data,
ValueHandle Pointer) { … }
static void handleAlignmentAssumptionImpl(AlignmentAssumptionData *Data,
ValueHandle Pointer,
ValueHandle Alignment,
ValueHandle Offset,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_alignment_assumption(AlignmentAssumptionData *Data,
ValueHandle Pointer,
ValueHandle Alignment,
ValueHandle Offset) { … }
void __ubsan::__ubsan_handle_alignment_assumption_abort(
AlignmentAssumptionData *Data, ValueHandle Pointer, ValueHandle Alignment,
ValueHandle Offset) { … }
template <typename T>
static void handleIntegerOverflowImpl(OverflowData *Data, ValueHandle LHS,
const char *Operator, T RHS,
ReportOptions Opts) { … }
#define UBSAN_OVERFLOW_HANDLER(handler_name, op, unrecoverable) …
UBSAN_OVERFLOW_HANDLER(__ubsan_handle_add_overflow, "+", false)
UBSAN_OVERFLOW_HANDLER(__ubsan_handle_add_overflow_abort, "+", true)
UBSAN_OVERFLOW_HANDLER(__ubsan_handle_sub_overflow, "-", false)
UBSAN_OVERFLOW_HANDLER(__ubsan_handle_sub_overflow_abort, "-", true)
UBSAN_OVERFLOW_HANDLER(__ubsan_handle_mul_overflow, "*", false)
UBSAN_OVERFLOW_HANDLER(__ubsan_handle_mul_overflow_abort, "*", true)
static void handleNegateOverflowImpl(OverflowData *Data, ValueHandle OldVal,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_negate_overflow(OverflowData *Data,
ValueHandle OldVal) { … }
void __ubsan::__ubsan_handle_negate_overflow_abort(OverflowData *Data,
ValueHandle OldVal) { … }
static void handleDivremOverflowImpl(OverflowData *Data, ValueHandle LHS,
ValueHandle RHS, ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_divrem_overflow(OverflowData *Data,
ValueHandle LHS, ValueHandle RHS) { … }
void __ubsan::__ubsan_handle_divrem_overflow_abort(OverflowData *Data,
ValueHandle LHS,
ValueHandle RHS) { … }
static void handleShiftOutOfBoundsImpl(ShiftOutOfBoundsData *Data,
ValueHandle LHS, ValueHandle RHS,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData *Data,
ValueHandle LHS,
ValueHandle RHS) { … }
void __ubsan::__ubsan_handle_shift_out_of_bounds_abort(
ShiftOutOfBoundsData *Data,
ValueHandle LHS,
ValueHandle RHS) { … }
static void handleOutOfBoundsImpl(OutOfBoundsData *Data, ValueHandle Index,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_out_of_bounds(OutOfBoundsData *Data,
ValueHandle Index) { … }
void __ubsan::__ubsan_handle_out_of_bounds_abort(OutOfBoundsData *Data,
ValueHandle Index) { … }
static void handleBuiltinUnreachableImpl(UnreachableData *Data,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_builtin_unreachable(UnreachableData *Data) { … }
static void handleMissingReturnImpl(UnreachableData *Data, ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_missing_return(UnreachableData *Data) { … }
static void handleVLABoundNotPositive(VLABoundData *Data, ValueHandle Bound,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_vla_bound_not_positive(VLABoundData *Data,
ValueHandle Bound) { … }
void __ubsan::__ubsan_handle_vla_bound_not_positive_abort(VLABoundData *Data,
ValueHandle Bound) { … }
static bool looksLikeFloatCastOverflowDataV1(void *Data) { … }
static void handleFloatCastOverflow(void *DataPtr, ValueHandle From,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_float_cast_overflow(void *Data, ValueHandle From) { … }
void __ubsan::__ubsan_handle_float_cast_overflow_abort(void *Data,
ValueHandle From) { … }
static void handleLoadInvalidValue(InvalidValueData *Data, ValueHandle Val,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_load_invalid_value(InvalidValueData *Data,
ValueHandle Val) { … }
void __ubsan::__ubsan_handle_load_invalid_value_abort(InvalidValueData *Data,
ValueHandle Val) { … }
static void handleImplicitConversion(ImplicitConversionData *Data,
ReportOptions Opts, ValueHandle Src,
ValueHandle Dst) { … }
void __ubsan::__ubsan_handle_implicit_conversion(ImplicitConversionData *Data,
ValueHandle Src,
ValueHandle Dst) { … }
void __ubsan::__ubsan_handle_implicit_conversion_abort(
ImplicitConversionData *Data, ValueHandle Src, ValueHandle Dst) { … }
static void handleInvalidBuiltin(InvalidBuiltinData *Data, ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_invalid_builtin(InvalidBuiltinData *Data) { … }
void __ubsan::__ubsan_handle_invalid_builtin_abort(InvalidBuiltinData *Data) { … }
static void handleInvalidObjCCast(InvalidObjCCast *Data, ValueHandle Pointer,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_invalid_objc_cast(InvalidObjCCast *Data,
ValueHandle Pointer) { … }
void __ubsan::__ubsan_handle_invalid_objc_cast_abort(InvalidObjCCast *Data,
ValueHandle Pointer) { … }
static void handleNonNullReturn(NonNullReturnData *Data, SourceLocation *LocPtr,
ReportOptions Opts, bool IsAttr) { … }
void __ubsan::__ubsan_handle_nonnull_return_v1(NonNullReturnData *Data,
SourceLocation *LocPtr) { … }
void __ubsan::__ubsan_handle_nonnull_return_v1_abort(NonNullReturnData *Data,
SourceLocation *LocPtr) { … }
void __ubsan::__ubsan_handle_nullability_return_v1(NonNullReturnData *Data,
SourceLocation *LocPtr) { … }
void __ubsan::__ubsan_handle_nullability_return_v1_abort(
NonNullReturnData *Data, SourceLocation *LocPtr) { … }
static void handleNonNullArg(NonNullArgData *Data, ReportOptions Opts,
bool IsAttr) { … }
void __ubsan::__ubsan_handle_nonnull_arg(NonNullArgData *Data) { … }
void __ubsan::__ubsan_handle_nonnull_arg_abort(NonNullArgData *Data) { … }
void __ubsan::__ubsan_handle_nullability_arg(NonNullArgData *Data) { … }
void __ubsan::__ubsan_handle_nullability_arg_abort(NonNullArgData *Data) { … }
static void handlePointerOverflowImpl(PointerOverflowData *Data,
ValueHandle Base,
ValueHandle Result,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_pointer_overflow(PointerOverflowData *Data,
ValueHandle Base,
ValueHandle Result) { … }
void __ubsan::__ubsan_handle_pointer_overflow_abort(PointerOverflowData *Data,
ValueHandle Base,
ValueHandle Result) { … }
static void handleCFIBadIcall(CFICheckFailData *Data, ValueHandle Function,
ReportOptions Opts) { … }
namespace __ubsan {
#ifdef UBSAN_CAN_USE_CXXABI
#ifdef _WIN32
extern "C" void __ubsan_handle_cfi_bad_type_default(CFICheckFailData *Data,
ValueHandle Vtable,
bool ValidVtable,
ReportOptions Opts) {
Die();
}
WIN_WEAK_ALIAS(__ubsan_handle_cfi_bad_type, __ubsan_handle_cfi_bad_type_default)
#else
SANITIZER_WEAK_ATTRIBUTE
#endif
void __ubsan_handle_cfi_bad_type(CFICheckFailData *Data, ValueHandle Vtable,
bool ValidVtable, ReportOptions Opts);
#else
void __ubsan_handle_cfi_bad_type(CFICheckFailData *Data, ValueHandle Vtable,
bool ValidVtable, ReportOptions Opts) {
Die();
}
#endif
}
void __ubsan::__ubsan_handle_cfi_check_fail(CFICheckFailData *Data,
ValueHandle Value,
uptr ValidVtable) { … }
void __ubsan::__ubsan_handle_cfi_check_fail_abort(CFICheckFailData *Data,
ValueHandle Value,
uptr ValidVtable) { … }
static bool handleFunctionTypeMismatch(FunctionTypeMismatchData *Data,
ValueHandle Function,
ReportOptions Opts) { … }
void __ubsan::__ubsan_handle_function_type_mismatch(
FunctionTypeMismatchData *Data, ValueHandle Function) { … }
void __ubsan::__ubsan_handle_function_type_mismatch_abort(
FunctionTypeMismatchData *Data, ValueHandle Function) { … }
#endif