Skip to content

Commit 5a737e0

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.7
2 parents 88e9a78 + 07235f2 commit 5a737e0

File tree

2 files changed

+66
-37
lines changed

2 files changed

+66
-37
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*===-- UbsanMinimalHandlers.inc - ubsan minimum handlers ------*- C++ -*-=== *\
2+
|*
3+
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
|* See https://llvm.org/LICENSE.txt for license information.
5+
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
|*
7+
\*===----------------------------------------------------------------------===*/
8+
9+
#ifndef UBSAN_HANDLER_PTR
10+
#define UBSAN_HANDLER_PTR(Enum, String)
11+
#endif
12+
13+
#ifndef UBSAN_HANDLER
14+
#define UBSAN_HANDLER(Enum, String)
15+
#endif
16+
17+
#ifndef UBSAN_HANDLER_RECOVER
18+
#define UBSAN_HANDLER_RECOVER(Enum, String)
19+
#endif
20+
21+
UBSAN_HANDLER_PTR(type_mismatch, "type-mismatch")
22+
UBSAN_HANDLER(alignment_assumption, "alignment-assumption")
23+
UBSAN_HANDLER(add_overflow, "add-overflow")
24+
UBSAN_HANDLER(sub_overflow, "sub-overflow")
25+
UBSAN_HANDLER(mul_overflow, "mul-overflow")
26+
UBSAN_HANDLER(negate_overflow, "negate-overflow")
27+
UBSAN_HANDLER(divrem_overflow, "divrem-overflow")
28+
UBSAN_HANDLER(shift_out_of_bounds, "shift-out-of-bounds")
29+
UBSAN_HANDLER(out_of_bounds, "out-of-bounds")
30+
UBSAN_HANDLER(local_out_of_bounds, "local-out-of-bounds")
31+
UBSAN_HANDLER_RECOVER(builtin_unreachable, "builtin-unreachable")
32+
UBSAN_HANDLER_RECOVER(missing_return, "missing-return")
33+
UBSAN_HANDLER(vla_bound_not_positive, "vla-bound-not-positive")
34+
UBSAN_HANDLER(float_cast_overflow, "float-cast-overflow")
35+
UBSAN_HANDLER(load_invalid_value, "load-invalid-value")
36+
UBSAN_HANDLER(invalid_builtin, "invalid-builtin")
37+
UBSAN_HANDLER(invalid_objc_cast, "invalid-objc-cast")
38+
UBSAN_HANDLER(function_type_mismatch, "function-type-mismatch")
39+
UBSAN_HANDLER(implicit_conversion, "implicit-conversion")
40+
UBSAN_HANDLER(nonnull_arg, "nonnull-arg")
41+
UBSAN_HANDLER(nonnull_return, "nonnull-return")
42+
UBSAN_HANDLER(nullability_arg, "nullability-arg")
43+
UBSAN_HANDLER(nullability_return, "nullability-return")
44+
UBSAN_HANDLER(pointer_overflow, "pointer-overflow")
45+
UBSAN_HANDLER(cfi_check_fail, "cfi-check-fail")

compiler-rt/lib/ubsan_minimal/ubsan_minimal_handlers.cpp

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -127,62 +127,46 @@ void NORETURN CheckFailed(const char *file, int, const char *cond, u64, u64) {
127127

128128
#define INTERFACE extern "C" __attribute__((visibility("default")))
129129

130-
#define HANDLER_RECOVER(name, kind) \
130+
#define UBSAN_HANDLER_RECOVER(name, kind) \
131131
INTERFACE void __ubsan_handle_##name##_minimal() { \
132132
__ubsan_report_error(kind, GET_CALLER_PC(), nullptr); \
133+
} \
134+
INTERFACE void __ubsan_handle_##name##_minimal_preserve() \
135+
[[clang::preserve_all]] { \
136+
__ubsan_report_error(kind, GET_CALLER_PC(), nullptr); \
133137
}
134138

135-
#define HANDLER_NORECOVER(name, kind) \
139+
#define UBSAN_HANDLER_NORECOVER(name, kind) \
136140
INTERFACE void __ubsan_handle_##name##_minimal_abort() { \
137141
uintptr_t caller = GET_CALLER_PC(); \
138142
__ubsan_report_error_fatal(kind, caller, nullptr); \
139143
abort_with_message(kind, caller, nullptr); \
140144
}
141145

142-
#define HANDLER(name, kind) \
143-
HANDLER_RECOVER(name, kind) \
144-
HANDLER_NORECOVER(name, kind)
146+
#define UBSAN_HANDLER(name, kind) \
147+
UBSAN_HANDLER_RECOVER(name, kind) \
148+
UBSAN_HANDLER_NORECOVER(name, kind)
145149

146-
#define HANDLER_RECOVER_PTR(name, kind) \
150+
#define UBSAN_HANDLER_RECOVER_PTR(name, kind) \
147151
INTERFACE void __ubsan_handle_##name##_minimal(const uintptr_t address) { \
148152
__ubsan_report_error(kind, GET_CALLER_PC(), &address); \
153+
} \
154+
INTERFACE void __ubsan_handle_##name##_minimal_preserve( \
155+
const uintptr_t address) [[clang::preserve_all]] { \
156+
__ubsan_report_error(kind, GET_CALLER_PC(), &address); \
149157
}
150158

151-
#define HANDLER_NORECOVER_PTR(name, kind) \
159+
#define UBSAN_HANDLER_NORECOVER_PTR(name, kind) \
152160
INTERFACE void __ubsan_handle_##name##_minimal_abort( \
153161
const uintptr_t address) { \
154162
uintptr_t caller = GET_CALLER_PC(); \
155163
__ubsan_report_error_fatal(kind, caller, &address); \
156164
abort_with_message(kind, caller, &address); \
157165
}
158166

159-
// A version of a handler that takes a pointer to a value.
160-
#define HANDLER_PTR(name, kind) \
161-
HANDLER_RECOVER_PTR(name, kind) \
162-
HANDLER_NORECOVER_PTR(name, kind)
163-
164-
HANDLER_PTR(type_mismatch, "type-mismatch")
165-
HANDLER(alignment_assumption, "alignment-assumption")
166-
HANDLER(add_overflow, "add-overflow")
167-
HANDLER(sub_overflow, "sub-overflow")
168-
HANDLER(mul_overflow, "mul-overflow")
169-
HANDLER(negate_overflow, "negate-overflow")
170-
HANDLER(divrem_overflow, "divrem-overflow")
171-
HANDLER(shift_out_of_bounds, "shift-out-of-bounds")
172-
HANDLER(out_of_bounds, "out-of-bounds")
173-
HANDLER(local_out_of_bounds, "local-out-of-bounds")
174-
HANDLER_RECOVER(builtin_unreachable, "builtin-unreachable")
175-
HANDLER_RECOVER(missing_return, "missing-return")
176-
HANDLER(vla_bound_not_positive, "vla-bound-not-positive")
177-
HANDLER(float_cast_overflow, "float-cast-overflow")
178-
HANDLER(load_invalid_value, "load-invalid-value")
179-
HANDLER(invalid_builtin, "invalid-builtin")
180-
HANDLER(invalid_objc_cast, "invalid-objc-cast")
181-
HANDLER(function_type_mismatch, "function-type-mismatch")
182-
HANDLER(implicit_conversion, "implicit-conversion")
183-
HANDLER(nonnull_arg, "nonnull-arg")
184-
HANDLER(nonnull_return, "nonnull-return")
185-
HANDLER(nullability_arg, "nullability-arg")
186-
HANDLER(nullability_return, "nullability-return")
187-
HANDLER(pointer_overflow, "pointer-overflow")
188-
HANDLER(cfi_check_fail, "cfi-check-fail")
167+
// A version of a UBSAN_HANDLER that takes a pointer to a value.
168+
#define UBSAN_HANDLER_PTR(name, kind) \
169+
UBSAN_HANDLER_RECOVER_PTR(name, kind) \
170+
UBSAN_HANDLER_NORECOVER_PTR(name, kind)
171+
172+
#include "UbsanMinimalHandlers.inc"

0 commit comments

Comments
 (0)