GCC Middle and Back End API Reference
asan.h
Go to the documentation of this file.
1/* AddressSanitizer, a fast memory error detector.
2 Copyright (C) 2011-2024 Free Software Foundation, Inc.
3 Contributed by Kostya Serebryany <kcc@google.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef TREE_ASAN
22#define TREE_ASAN
23
24extern void asan_function_start (void);
25extern void asan_finish_file (void);
26extern rtx_insn *asan_emit_stack_protection (rtx, rtx, unsigned int,
27 HOST_WIDE_INT *, tree *, int);
29extern bool asan_protect_global (tree, bool ignore_decl_rtl_set_p = false);
30extern void initialize_sanitizer_builtins (void);
31extern tree asan_dynamic_init_call (bool);
34extern bool asan_expand_poison_ifn (gimple_stmt_iterator *, bool *,
36extern rtx asan_memfn_rtl (tree);
37
38extern void hwasan_record_frame_init ();
40extern void hwasan_emit_prologue ();
43extern rtx hwasan_frame_base ();
44extern void hwasan_maybe_emit_frame_base_init (void);
45extern bool stack_vars_base_reg_p (rtx);
46extern uint8_t hwasan_current_frame_tag ();
47extern void hwasan_increment_frame_tag ();
49extern void hwasan_finish_file (void);
50extern bool hwasan_sanitize_p (void);
51extern bool hwasan_sanitize_stack_p (void);
52extern bool hwasan_sanitize_allocas_p (void);
55extern bool gate_hwasan (void);
56
58 (gimple_stmt_iterator *, bool, bool, bool, basic_block *, basic_block *);
59
60/* Alias set for accessing the shadow memory. */
62
63/* Hash set of labels that are either used in a goto, or their address
64 has been taken. */
65extern hash_set <tree> *asan_used_labels;
66
67/* Shadow memory is found at
68 (address >> ASAN_SHADOW_SHIFT) + asan_shadow_offset (). */
69#define ASAN_SHADOW_SHIFT 3
70#define ASAN_SHADOW_GRANULARITY (1UL << ASAN_SHADOW_SHIFT)
71
72/* Red zone size, stack and global variables are padded by ASAN_RED_ZONE_SIZE
73 up to 2 * ASAN_RED_ZONE_SIZE - 1 bytes. */
74#define ASAN_RED_ZONE_SIZE 32
75
76/* Stack variable use more compact red zones. The size includes also
77 size of variable itself. */
78
79#define ASAN_MIN_RED_ZONE_SIZE 16
80
81/* Shadow memory values for stack protection. Left is below protected vars,
82 the first pointer in stack corresponding to that offset contains
83 ASAN_STACK_FRAME_MAGIC word, the second pointer to a string describing
84 the frame. Middle is for padding in between variables, right is
85 above the last protected variable and partial immediately after variables
86 up to ASAN_RED_ZONE_SIZE alignment. */
87#define ASAN_STACK_MAGIC_LEFT 0xf1
88#define ASAN_STACK_MAGIC_MIDDLE 0xf2
89#define ASAN_STACK_MAGIC_RIGHT 0xf3
90#define ASAN_STACK_MAGIC_USE_AFTER_RET 0xf5
91#define ASAN_STACK_MAGIC_USE_AFTER_SCOPE 0xf8
92
93#define ASAN_STACK_FRAME_MAGIC 0x41b58ab3
94#define ASAN_STACK_RETIRED_MAGIC 0x45e0360e
95
96#define ASAN_USE_AFTER_SCOPE_ATTRIBUTE "use after scope memory"
97
98/* NOTE: The values below and the hooks under targetm.memtag define an ABI and
99 are hard-coded to these values in libhwasan, hence they can't be changed
100 independently here. */
101/* How many bits are used to store a tag in a pointer.
102 The default version uses the entire top byte of a pointer (i.e. 8 bits). */
103#define HWASAN_TAG_SIZE targetm.memtag.tag_size ()
104/* Tag Granule of HWASAN shadow stack.
105 This is the size in real memory that each byte in the shadow memory refers
106 to. I.e. if a variable is X bytes long in memory then its tag in shadow
107 memory will span X / HWASAN_TAG_GRANULE_SIZE bytes.
108 Most variables will need to be aligned to this amount since two variables
109 that are neighbors in memory and share a tag granule would need to share the
110 same tag (the shared tag granule can only store one tag). */
111#define HWASAN_TAG_GRANULE_SIZE targetm.memtag.granule_size ()
112/* Define the tag for the stack background.
113 This defines what tag the stack pointer will be and hence what tag all
114 variables that are not given special tags are (e.g. spilled registers,
115 and parameters passed on the stack). */
116#define HWASAN_STACK_BACKGROUND gen_int_mode (0, QImode)
117
118/* Various flags for Asan builtins. */
126
127/* Flags for Asan check builtins. */
128#define IFN_ASAN_MARK_FLAGS DEF(POISON), DEF(UNPOISON)
129
131{
132#define DEF(X) ASAN_MARK_##X
134#undef DEF
136
137/* Return true if STMT is ASAN_MARK with FLAG as first argument. */
138extern bool asan_mark_p (gimple *stmt, enum asan_mark_flags flag);
139
140/* Return the size of padding needed to insert after a protected
141 decl of SIZE. */
142
143inline unsigned int
144asan_red_zone_size (unsigned int size)
145{
146 unsigned int c = size & (ASAN_RED_ZONE_SIZE - 1);
147 return c ? 2 * ASAN_RED_ZONE_SIZE - c : ASAN_RED_ZONE_SIZE;
148}
149
150/* Return how much a stack variable occupis on a stack
151 including a space for red zone. */
152
153inline unsigned HOST_WIDE_INT
154asan_var_and_redzone_size (unsigned HOST_WIDE_INT size)
155{
156 if (size <= 4)
157 return 16;
158 else if (size <= 16)
159 return 32;
160 else if (size <= 128)
161 return size + 32;
162 else if (size <= 512)
163 return size + 64;
164 else if (size <= 4096)
165 return size + 128;
166 else
167 return size + 256;
168}
169
170extern bool set_asan_shadow_offset (const char *);
171
172extern bool asan_shadow_offset_set_p ();
173
174extern void set_sanitized_sections (const char *);
175
176extern bool asan_sanitize_stack_p (void);
177
178extern bool asan_sanitize_allocas_p (void);
179
181
182/* Return TRUE if builtin with given FCODE will be intercepted by
183 libasan. */
184
185inline bool
187{
188 /* This list should be kept up-to-date with upstream's version at
189 compiler-rt/lib/hwasan/hwasan_platform_interceptors.h. */
190 if (hwasan_sanitize_p ())
191 return fcode == BUILT_IN_MEMCMP
192 || fcode == BUILT_IN_MEMCPY
193 || fcode == BUILT_IN_MEMMOVE
194 || fcode == BUILT_IN_MEMSET;
195
196 return fcode == BUILT_IN_INDEX
197 || fcode == BUILT_IN_MEMCHR
198 || fcode == BUILT_IN_MEMCMP
199 || fcode == BUILT_IN_MEMCPY
200 || fcode == BUILT_IN_MEMMOVE
201 || fcode == BUILT_IN_MEMSET
202 || fcode == BUILT_IN_STRCASECMP
203 || fcode == BUILT_IN_STRCAT
204 || fcode == BUILT_IN_STRCHR
205 || fcode == BUILT_IN_STRCMP
206 || fcode == BUILT_IN_STRCPY
207 || fcode == BUILT_IN_STRDUP
208 || fcode == BUILT_IN_STRLEN
209 || fcode == BUILT_IN_STRNCASECMP
210 || fcode == BUILT_IN_STRNCAT
211 || fcode == BUILT_IN_STRNCMP
212 || fcode == BUILT_IN_STRCSPN
213 || fcode == BUILT_IN_STRPBRK
214 || fcode == BUILT_IN_STRSPN
215 || fcode == BUILT_IN_STRSTR
216 || fcode == BUILT_IN_STRNCPY;
217}
218
219/* Return TRUE if we should instrument for use-after-scope sanity checking. */
220
221inline bool
223{
224 return (flag_sanitize_address_use_after_scope
226}
227
228/* Return true if DECL should be guarded on the stack. */
229
230inline bool
237
238/* Return true when flag_sanitize & FLAG is non-zero. If FN is non-null,
239 remove all flags mentioned in "no_sanitize" of DECL_ATTRIBUTES. */
240
241inline bool
243{
244 unsigned int result_flags = flag_sanitize & flag;
245 if (result_flags == 0)
246 return false;
247
248 if (fn != NULL_TREE)
249 {
250 tree value = lookup_attribute ("no_sanitize", DECL_ATTRIBUTES (fn));
251 if (value)
252 result_flags &= ~tree_to_uhwi (TREE_VALUE (value));
253 }
254
255 return result_flags;
256}
257
258/* Return true when coverage sanitization should happend for FN function. */
259
260inline bool
262{
263 return (flag_sanitize_coverage
264 && (fn == NULL_TREE
265 || lookup_attribute ("no_sanitize_coverage",
266 DECL_ATTRIBUTES (fn)) == NULL_TREE));
267}
268
269#endif /* TREE_ASAN */
void asan_finish_file(void)
Definition asan.cc:3640
void hwasan_record_frame_init()
Definition asan.cc:4540
rtx_insn * hwasan_emit_untag_frame(rtx, rtx)
Definition asan.cc:4642
rtx_insn * asan_emit_allocas_unpoison(rtx, rtx, rtx_insn *)
Definition asan.cc:2230
void hwasan_maybe_emit_frame_base_init(void)
Definition asan.cc:4438
bool gate_hwasan(void)
Definition asan.cc:4852
bool hwasan_expand_mark_ifn(gimple_stmt_iterator *)
Definition asan.cc:4846
rtx_insn * asan_emit_stack_protection(rtx, rtx, unsigned int, HOST_WIDE_INT *, tree *, int)
Definition asan.cc:1848
bool asan_intercepted_p(enum built_in_function fcode)
Definition asan.h:186
bool asan_protect_stack_decl(tree decl)
Definition asan.h:231
bool asan_expand_check_ifn(gimple_stmt_iterator *, bool)
Definition asan.cc:3897
gimple_stmt_iterator create_cond_insert_point(gimple_stmt_iterator *, bool, bool, bool, basic_block *, basic_block *)
Definition asan.cc:2450
tree asan_dynamic_init_call(bool)
Definition asan.cc:3172
hash_set< tree > * asan_used_labels
Definition asan.cc:260
bool sanitize_coverage_p(const_tree fn=current_function_decl)
Definition asan.h:261
rtx asan_memfn_rtl(tree)
Definition asan.cc:398
#define IFN_ASAN_MARK_FLAGS
Definition asan.h:128
bool hwasan_sanitize_p(void)
Definition asan.cc:1794
rtx hwasan_truncate_to_tag_size(rtx, rtx)
Definition asan.cc:4707
bool asan_sanitize_use_after_scope(void)
Definition asan.h:222
#define ASAN_RED_ZONE_SIZE
Definition asan.h:74
bool asan_protect_global(tree, bool ignore_decl_rtl_set_p=false)
Definition asan.cc:2273
bool asan_sanitize_allocas_p(void)
Definition asan.cc:370
void set_sanitized_sections(const char *)
Definition asan.cc:338
asan_mark_flags
Definition asan.h:131
bool stack_vars_base_reg_p(rtx)
Definition asan.cc:4420
unsigned HOST_WIDE_INT asan_var_and_redzone_size(unsigned HOST_WIDE_INT size)
Definition asan.h:154
alias_set_type asan_shadow_set
Definition asan.cc:467
void hwasan_finish_file(void)
Definition asan.cc:4686
bool asan_expand_mark_ifn(gimple_stmt_iterator *)
Definition asan.cc:3783
bool asan_expand_poison_ifn(gimple_stmt_iterator *, bool *, hash_map< tree, tree > &)
Definition asan.cc:4133
void hwasan_increment_frame_tag()
Definition asan.cc:4492
void asan_function_start(void)
Definition asan.cc:1487
bool set_asan_shadow_offset(const char *)
Definition asan.cc:317
asan_check_flags
Definition asan.h:120
@ ASAN_CHECK_NON_ZERO_LEN
Definition asan.h:123
@ ASAN_CHECK_LAST
Definition asan.h:124
@ ASAN_CHECK_SCALAR_ACCESS
Definition asan.h:122
@ ASAN_CHECK_STORE
Definition asan.h:121
bool asan_mark_p(gimple *stmt, enum asan_mark_flags flag)
Definition asan.cc:357
bool hwasan_expand_check_ifn(gimple_stmt_iterator *, bool)
Definition asan.cc:4760
rtx hwasan_get_frame_extent()
Definition asan.cc:4481
rtx hwasan_frame_base()
Definition asan.cc:4398
bool asan_shadow_offset_set_p()
Definition asan.cc:462
bool asan_sanitize_stack_p(void)
Definition asan.cc:364
void initialize_sanitizer_builtins(void)
Definition asan.cc:3420
bool sanitize_flags_p(unsigned int flag, const_tree fn=current_function_decl)
Definition asan.h:242
bool hwasan_sanitize_allocas_p(void)
Definition asan.cc:1808
void hwasan_record_stack_var(rtx, rtx, poly_int64, poly_int64)
Definition asan.cc:4461
uint8_t hwasan_current_frame_tag()
Definition asan.cc:4386
unsigned int asan_red_zone_size(unsigned int size)
Definition asan.h:144
hash_set< tree > * asan_handled_variables
Definition asan.cc:258
bool hwasan_sanitize_stack_p(void)
Definition asan.cc:1801
void hwasan_emit_prologue()
Definition asan.cc:4580
tree lookup_attribute(const char *attr_name, tree list)
Definition attribs.h:223
Definition hash-map.h:40
Definition hash-set.h:37
const union tree_node * const_tree
Definition coretypes.h:98
union tree_node * tree
Definition coretypes.h:97
int alias_set_type
Definition coretypes.h:342
built_in_function
Definition genmatch.cc:354
Definition basic-block.h:117
Definition genautomata.cc:499
Definition gimple-iterator.h:26
Definition gimple.h:225
Definition rtl.h:311
Definition rtl.h:545
tree current_function_decl
Definition toplev.cc:124
#define TREE_VALUE(NODE)
Definition tree.h:1210
#define DECL_ATTRIBUTES(NODE)
Definition tree.h:2771
#define DECL_ARTIFICIAL(NODE)
Definition tree.h:2897
#define TREE_ADDRESSABLE(NODE)
Definition tree.h:744
#define NULL_TREE
Definition tree.h:317
#define DECL_P(NODE)
Definition tree.h:231