1 //===-- asan_stack.h --------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is a part of AddressSanitizer, an address sanity checker. 11 // 12 // ASan-private header for asan_stack.cc. 13 //===----------------------------------------------------------------------===// 14 #ifndef ASAN_STACK_H 15 #define ASAN_STACK_H 16 17 #include "asan_flags.h" 18 #include "asan_thread.h" 19 #include "sanitizer_common/sanitizer_flags.h" 20 #include "sanitizer_common/sanitizer_stacktrace.h" 21 22 namespace __asan { 23 24 void PrintStack(StackTrace *stack); 25 26 } // namespace __asan 27 28 // Get the stack trace with the given pc and bp. 29 // The pc will be in the position 0 of the resulting stack trace. 30 // The bp may refer to the current frame or to the caller's frame. 31 #if SANITIZER_WINDOWS 32 #define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast) \ 33 StackTrace stack; \ 34 GetStackTrace(&stack, max_s, pc, bp, 0, 0, fast) 35 #else 36 #define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast) \ 37 StackTrace stack; \ 38 { \ 39 uptr stack_top = 0, stack_bottom = 0; \ 40 AsanThread *t; \ 41 if (asan_inited && (t = GetCurrentThread())) { \ 42 stack_top = t->stack_top(); \ 43 stack_bottom = t->stack_bottom(); \ 44 } \ 45 GetStackTrace(&stack, max_s, pc, bp, \ 46 stack_top, stack_bottom, fast); \ 47 } 48 #endif // SANITIZER_WINDOWS 49 50 // NOTE: A Rule of thumb is to retrieve stack trace in the interceptors 51 // as early as possible (in functions exposed to the user), as we generally 52 // don't want stack trace to contain functions from ASan internals. 53 54 #define GET_STACK_TRACE(max_size, fast) \ 55 GET_STACK_TRACE_WITH_PC_AND_BP(max_size, \ 56 StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), fast) 57 58 #define GET_STACK_TRACE_FATAL(pc, bp) \ 59 GET_STACK_TRACE_WITH_PC_AND_BP(kStackTraceMax, pc, bp, \ 60 common_flags()->fast_unwind_on_fatal) 61 62 #define GET_STACK_TRACE_FATAL_HERE \ 63 GET_STACK_TRACE(kStackTraceMax, common_flags()->fast_unwind_on_fatal) 64 65 #define GET_STACK_TRACE_THREAD \ 66 GET_STACK_TRACE(kStackTraceMax, true) 67 68 #define GET_STACK_TRACE_MALLOC \ 69 GET_STACK_TRACE(common_flags()->malloc_context_size, \ 70 common_flags()->fast_unwind_on_malloc) 71 72 #define GET_STACK_TRACE_FREE GET_STACK_TRACE_MALLOC 73 74 #define PRINT_CURRENT_STACK() \ 75 { \ 76 GET_STACK_TRACE(kStackTraceMax, \ 77 common_flags()->fast_unwind_on_fatal); \ 78 PrintStack(&stack); \ 79 } 80 81 #endif // ASAN_STACK_H 82