1 /* AddressSanitizer, a fast memory error detector. 2 Copyright (C) 2011-2015 Free Software Foundation, Inc. 3 Contributed by Kostya Serebryany <kcc@google.com> 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it under 8 the terms of the GNU General Public License as published by the Free 9 Software Foundation; either version 3, or (at your option) any later 10 version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 17 You should have received a copy of the GNU General Public License 18 along 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 24 extern void asan_function_start (void); 25 extern void asan_finish_file (void); 26 extern rtx_insn *asan_emit_stack_protection (rtx, rtx, unsigned int, 27 HOST_WIDE_INT *, tree *, int); 28 extern bool asan_protect_global (tree); 29 extern void initialize_sanitizer_builtins (void); 30 extern tree asan_dynamic_init_call (bool); 31 extern bool asan_expand_check_ifn (gimple_stmt_iterator *, bool); 32 33 extern gimple_stmt_iterator create_cond_insert_point 34 (gimple_stmt_iterator *, bool, bool, bool, basic_block *, basic_block *); 35 36 /* Alias set for accessing the shadow memory. */ 37 extern alias_set_type asan_shadow_set; 38 39 /* Shadow memory is found at 40 (address >> ASAN_SHADOW_SHIFT) + asan_shadow_offset (). */ 41 #define ASAN_SHADOW_SHIFT 3 42 43 /* Red zone size, stack and global variables are padded by ASAN_RED_ZONE_SIZE 44 up to 2 * ASAN_RED_ZONE_SIZE - 1 bytes. */ 45 #define ASAN_RED_ZONE_SIZE 32 46 47 /* Shadow memory values for stack protection. Left is below protected vars, 48 the first pointer in stack corresponding to that offset contains 49 ASAN_STACK_FRAME_MAGIC word, the second pointer to a string describing 50 the frame. Middle is for padding in between variables, right is 51 above the last protected variable and partial immediately after variables 52 up to ASAN_RED_ZONE_SIZE alignment. */ 53 #define ASAN_STACK_MAGIC_LEFT 0xf1 54 #define ASAN_STACK_MAGIC_MIDDLE 0xf2 55 #define ASAN_STACK_MAGIC_RIGHT 0xf3 56 #define ASAN_STACK_MAGIC_PARTIAL 0xf4 57 #define ASAN_STACK_MAGIC_USE_AFTER_RET 0xf5 58 59 #define ASAN_STACK_FRAME_MAGIC 0x41b58ab3 60 #define ASAN_STACK_RETIRED_MAGIC 0x45e0360e 61 62 /* Return true if DECL should be guarded on the stack. */ 63 64 static inline bool 65 asan_protect_stack_decl (tree decl) 66 { 67 return DECL_P (decl) && !DECL_ARTIFICIAL (decl); 68 } 69 70 /* Return the size of padding needed to insert after a protected 71 decl of SIZE. */ 72 73 static inline unsigned int 74 asan_red_zone_size (unsigned int size) 75 { 76 unsigned int c = size & (ASAN_RED_ZONE_SIZE - 1); 77 return c ? 2 * ASAN_RED_ZONE_SIZE - c : ASAN_RED_ZONE_SIZE; 78 } 79 80 extern bool set_asan_shadow_offset (const char *); 81 82 /* Return TRUE if builtin with given FCODE will be intercepted by 83 libasan. */ 84 85 static inline bool 86 asan_intercepted_p (enum built_in_function fcode) 87 { 88 return fcode == BUILT_IN_INDEX 89 || fcode == BUILT_IN_MEMCHR 90 || fcode == BUILT_IN_MEMCMP 91 || fcode == BUILT_IN_MEMCPY 92 || fcode == BUILT_IN_MEMMOVE 93 || fcode == BUILT_IN_MEMSET 94 || fcode == BUILT_IN_STRCASECMP 95 || fcode == BUILT_IN_STRCAT 96 || fcode == BUILT_IN_STRCHR 97 || fcode == BUILT_IN_STRCMP 98 || fcode == BUILT_IN_STRCPY 99 || fcode == BUILT_IN_STRDUP 100 || fcode == BUILT_IN_STRLEN 101 || fcode == BUILT_IN_STRNCASECMP 102 || fcode == BUILT_IN_STRNCAT 103 || fcode == BUILT_IN_STRNCMP 104 || fcode == BUILT_IN_STRNCPY; 105 } 106 #endif /* TREE_ASAN */ 107