Serenity Operating System
1/*
2 * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
3 * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
4 *
5 * SPDX-License-Identifier: BSD-2-Clause
6 */
7
8#include <AK/UBSanitizer.h>
9
10using namespace AK::UBSanitizer;
11
12Atomic<bool> AK::UBSanitizer::g_ubsan_is_deadly { true };
13
14extern "C" {
15
16static void print_location(SourceLocation const&)
17{
18#if ARCH(X86_64)
19 asm volatile("cli; hlt");
20#else
21 for (;;) { }
22#endif
23}
24
25void __ubsan_handle_load_invalid_value(InvalidValueData const&, ValueHandle) __attribute__((used));
26void __ubsan_handle_load_invalid_value(InvalidValueData const& data, ValueHandle)
27{
28 print_location(data.location);
29}
30
31void __ubsan_handle_nonnull_arg(NonnullArgData const&) __attribute__((used));
32void __ubsan_handle_nonnull_arg(NonnullArgData const& data)
33{
34 print_location(data.location);
35}
36
37void __ubsan_handle_nullability_arg(NonnullArgData const&) __attribute__((used));
38void __ubsan_handle_nullability_arg(NonnullArgData const& data)
39{
40 print_location(data.location);
41}
42
43void __ubsan_handle_nonnull_return_v1(NonnullReturnData const&, SourceLocation const&) __attribute__((used));
44void __ubsan_handle_nonnull_return_v1(NonnullReturnData const&, SourceLocation const& location)
45{
46 print_location(location);
47}
48
49void __ubsan_handle_nullability_return_v1(NonnullReturnData const& data, SourceLocation const& location) __attribute__((used));
50void __ubsan_handle_nullability_return_v1(NonnullReturnData const&, SourceLocation const& location)
51{
52 print_location(location);
53}
54
55void __ubsan_handle_vla_bound_not_positive(VLABoundData const&, ValueHandle) __attribute__((used));
56void __ubsan_handle_vla_bound_not_positive(VLABoundData const& data, ValueHandle)
57{
58 print_location(data.location);
59}
60
61void __ubsan_handle_add_overflow(OverflowData const&, ValueHandle lhs, ValueHandle rhs) __attribute__((used));
62void __ubsan_handle_add_overflow(OverflowData const& data, ValueHandle, ValueHandle)
63{
64 print_location(data.location);
65}
66
67void __ubsan_handle_sub_overflow(OverflowData const&, ValueHandle lhs, ValueHandle rhs) __attribute__((used));
68void __ubsan_handle_sub_overflow(OverflowData const& data, ValueHandle, ValueHandle)
69{
70 print_location(data.location);
71}
72
73void __ubsan_handle_negate_overflow(OverflowData const&, ValueHandle) __attribute__((used));
74void __ubsan_handle_negate_overflow(OverflowData const& data, ValueHandle)
75{
76 print_location(data.location);
77}
78
79void __ubsan_handle_mul_overflow(OverflowData const&, ValueHandle lhs, ValueHandle rhs) __attribute__((used));
80void __ubsan_handle_mul_overflow(OverflowData const& data, ValueHandle, ValueHandle)
81{
82 print_location(data.location);
83}
84
85void __ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData const&, ValueHandle lhs, ValueHandle rhs) __attribute__((used));
86void __ubsan_handle_shift_out_of_bounds(ShiftOutOfBoundsData const& data, ValueHandle, ValueHandle)
87{
88 print_location(data.location);
89}
90
91void __ubsan_handle_divrem_overflow(OverflowData const&, ValueHandle lhs, ValueHandle rhs) __attribute__((used));
92void __ubsan_handle_divrem_overflow(OverflowData const& data, ValueHandle, ValueHandle)
93{
94 print_location(data.location);
95}
96
97void __ubsan_handle_out_of_bounds(OutOfBoundsData const&, ValueHandle) __attribute__((used));
98void __ubsan_handle_out_of_bounds(OutOfBoundsData const& data, ValueHandle)
99{
100 print_location(data.location);
101}
102
103void __ubsan_handle_type_mismatch_v1(TypeMismatchData const&, ValueHandle) __attribute__((used));
104void __ubsan_handle_type_mismatch_v1(TypeMismatchData const& data, ValueHandle)
105{
106 print_location(data.location);
107}
108
109void __ubsan_handle_alignment_assumption(AlignmentAssumptionData const&, ValueHandle, ValueHandle, ValueHandle) __attribute__((used));
110void __ubsan_handle_alignment_assumption(AlignmentAssumptionData const& data, ValueHandle, ValueHandle, ValueHandle)
111{
112 print_location(data.location);
113}
114
115void __ubsan_handle_builtin_unreachable(UnreachableData const&) __attribute__((used));
116void __ubsan_handle_builtin_unreachable(UnreachableData const& data)
117{
118 print_location(data.location);
119}
120
121void __ubsan_handle_missing_return(UnreachableData const&) __attribute__((used));
122void __ubsan_handle_missing_return(UnreachableData const& data)
123{
124 print_location(data.location);
125}
126
127void __ubsan_handle_implicit_conversion(ImplicitConversionData const&, ValueHandle, ValueHandle) __attribute__((used));
128void __ubsan_handle_implicit_conversion(ImplicitConversionData const& data, ValueHandle, ValueHandle)
129{
130 print_location(data.location);
131}
132
133void __ubsan_handle_invalid_builtin(const InvalidBuiltinData) __attribute__((used));
134void __ubsan_handle_invalid_builtin(const InvalidBuiltinData data)
135{
136 print_location(data.location);
137}
138
139void __ubsan_handle_pointer_overflow(PointerOverflowData const&, ValueHandle, ValueHandle) __attribute__((used));
140void __ubsan_handle_pointer_overflow(PointerOverflowData const& data, ValueHandle, ValueHandle)
141{
142 print_location(data.location);
143}
144}