xref: /linux/lib/ubsan.h (revision 811f35ff59b6f99ae272d6f5b96bc9e974f88196)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LIB_UBSAN_H
3 #define _LIB_UBSAN_H
4 
5 enum {
6 	type_kind_int = 0,
7 	type_kind_float = 1,
8 	type_unknown = 0xffff
9 };
10 
11 struct type_descriptor {
12 	u16 type_kind;
13 	u16 type_info;
14 	char type_name[1];
15 };
16 
17 struct source_location {
18 	const char *file_name;
19 	union {
20 		unsigned long reported;
21 		struct {
22 			u32 line;
23 			u32 column;
24 		};
25 	};
26 };
27 
28 struct overflow_data {
29 	struct source_location location;
30 	struct type_descriptor *type;
31 };
32 
33 struct type_mismatch_data {
34 	struct source_location location;
35 	struct type_descriptor *type;
36 	unsigned long alignment;
37 	unsigned char type_check_kind;
38 };
39 
40 struct type_mismatch_data_v1 {
41 	struct source_location location;
42 	struct type_descriptor *type;
43 	unsigned char log_alignment;
44 	unsigned char type_check_kind;
45 };
46 
47 struct type_mismatch_data_common {
48 	struct source_location *location;
49 	struct type_descriptor *type;
50 	unsigned long alignment;
51 	unsigned char type_check_kind;
52 };
53 
54 struct nonnull_arg_data {
55 	struct source_location location;
56 	struct source_location attr_location;
57 	int arg_index;
58 };
59 
60 struct out_of_bounds_data {
61 	struct source_location location;
62 	struct type_descriptor *array_type;
63 	struct type_descriptor *index_type;
64 };
65 
66 struct shift_out_of_bounds_data {
67 	struct source_location location;
68 	struct type_descriptor *lhs_type;
69 	struct type_descriptor *rhs_type;
70 };
71 
72 struct unreachable_data {
73 	struct source_location location;
74 };
75 
76 struct invalid_value_data {
77 	struct source_location location;
78 	struct type_descriptor *type;
79 };
80 
81 struct alignment_assumption_data {
82 	struct source_location location;
83 	struct source_location assumption_location;
84 	struct type_descriptor *type;
85 };
86 
87 #if defined(CONFIG_ARCH_SUPPORTS_INT128)
88 typedef __int128 s_max;
89 typedef unsigned __int128 u_max;
90 #else
91 typedef s64 s_max;
92 typedef u64 u_max;
93 #endif
94 
95 #endif
96