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 "sanitizer_common/sanitizer_stacktrace.h" 18#include "asan_flags.h" 19 20namespace __asan { 21 22void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp, bool fast); 23void PrintStack(StackTrace *stack); 24 25} // namespace __asan 26 27// Get the stack trace with the given pc and bp. 28// The pc will be in the position 0 of the resulting stack trace. 29// The bp may refer to the current frame or to the caller's frame. 30// fast_unwind is currently unused. 31#define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp, fast) \ 32 StackTrace stack; \ 33 GetStackTrace(&stack, max_s, pc, bp, fast) 34 35// NOTE: A Rule of thumb is to retrieve stack trace in the interceptors 36// as early as possible (in functions exposed to the user), as we generally 37// don't want stack trace to contain functions from ASan internals. 38 39#define GET_STACK_TRACE(max_size, fast) \ 40 GET_STACK_TRACE_WITH_PC_AND_BP(max_size, \ 41 StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), fast) 42 43#define GET_STACK_TRACE_FATAL(pc, bp) \ 44 GET_STACK_TRACE_WITH_PC_AND_BP(kStackTraceMax, pc, bp, \ 45 flags()->fast_unwind_on_fatal) 46 47#define GET_STACK_TRACE_FATAL_HERE \ 48 GET_STACK_TRACE(kStackTraceMax, flags()->fast_unwind_on_fatal) 49 50#define GET_STACK_TRACE_THREAD \ 51 GET_STACK_TRACE(kStackTraceMax, true) 52 53#define GET_STACK_TRACE_MALLOC \ 54 GET_STACK_TRACE(flags()->malloc_context_size, \ 55 flags()->fast_unwind_on_malloc) 56 57#define GET_STACK_TRACE_FREE GET_STACK_TRACE_MALLOC 58 59#define PRINT_CURRENT_STACK() \ 60 { \ 61 GET_STACK_TRACE(kStackTraceMax, \ 62 flags()->fast_unwind_on_fatal); \ 63 PrintStack(&stack); \ 64 } 65 66#endif // ASAN_STACK_H 67