brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 391e241 Raw
75 lines · cpp
1// Check that the stack trace debugging API works and returns correct2// malloc and free stacks.3// RUN: %clangxx_asan -O0 %if MSVC %{ /wd4477 %} %s -o %t && not %run %t 2>&1 | FileCheck %s4 5// FIXME: Figure out why allocation/free stack traces may be too short on ARM.6// REQUIRES: stable-runtime7 8#if _WIN649#define PTR "%llx"10#else11#define PTR "%lx"12#endif13 14#include <sanitizer/asan_interface.h>15#include <stdio.h>16#include <stdlib.h>17 18char *mem;19void func1() {20  mem = (char *)malloc(10);21}22 23void func2() {24  free(mem);25}26 27int main() {28  // Disable stderr buffering. Needed on Windows.29  setvbuf(stderr, NULL, _IONBF, 0);30 31  func1();32  func2();33 34  void *trace[100];35  size_t num_frames = 100;36  int thread_id;37  num_frames = __asan_get_alloc_stack(mem, trace, num_frames, &thread_id);38 39  fprintf(stderr, "alloc stack retval %s\n", (num_frames > 0 && num_frames < 10)40          ? "ok" : "");41  // CHECK: alloc stack retval ok42  fprintf(stderr, "thread id = %d\n", thread_id);43  // CHECK: thread id = 044  fprintf(stderr, "0x" PTR "\n", trace[0]);45  // CHECK: 0x{{0*}}[[ALLOC_FRAME_0:[0-9a-f]+]]46  fprintf(stderr, "0x" PTR "\n", trace[1]);47  // CHECK: 0x{{0*}}[[ALLOC_FRAME_1:[0-9a-f]+]]48 49  num_frames = 100;50  num_frames = __asan_get_free_stack(mem, trace, num_frames, &thread_id);51 52  fprintf(stderr, "free stack retval %s\n", (num_frames > 0 && num_frames < 10)53          ? "ok" : "");54  // CHECK: free stack retval ok55  fprintf(stderr, "thread id = %d\n", thread_id);56  // CHECK: thread id = 057  fprintf(stderr, "0x" PTR "\n", trace[0]);58  // CHECK: 0x{{0*}}[[FREE_FRAME_0:[0-9a-f]+]]59  fprintf(stderr, "0x" PTR "\n", trace[1]);60  // CHECK: 0x{{0*}}[[FREE_FRAME_1:[0-9a-f]+]]61 62  mem[0] = 'A'; // BOOM63 64  // CHECK: ERROR: AddressSanitizer: heap-use-after-free65  // CHECK: WRITE of size 1 at 0x{{.*}}66  // CHECK: freed by thread T0 here:67  // CHECK: #0 0x{{0*}}[[FREE_FRAME_0]]68  // CHECK: #1 0x{{0*}}[[FREE_FRAME_1]]69  // CHECK: previously allocated by thread T0 here:70  // CHECK: #0 0x{{0*}}[[ALLOC_FRAME_0]]71  // CHECK: #1 0x{{0*}}[[ALLOC_FRAME_1]]72 73  return 0;74}75