1 // This test case checks for an old bug when using plug-ins that caused
2 // the stack numbering to be incorrect.
3 // UNSUPPORTED: android
4 // UNSUPPORTED: ios
5
6 // RUN: %clangxx_asan -O0 -g %s -o %t
7 // RUN: %env_asan_opts=symbolize=0 not %run %t DUMMY_ARG > %t.asan_report 2>&1
8 // RUN: %asan_symbolize --log-level debug --log-dest %t_debug_log_output.txt -l %t.asan_report --plugins %S/plugin_wrong_frame_number_bug.py > %t.asan_report_sym
9 // RUN: FileCheck --input-file=%t.asan_report_sym %s
10
11 #include <stdlib.h>
12
13 int* p;
14 extern "C" {
15
bug()16 void bug() {
17 free(p);
18 }
19
foo(bool call_bug)20 void foo(bool call_bug) {
21 if (call_bug)
22 bug();
23 }
24
25 // This indirection exists so that the call stack
26 // is reliably large enough.
do_access_impl()27 void do_access_impl() {
28 *p = 42;
29 }
30
do_access()31 void do_access() {
32 do_access_impl();
33 }
34
main(int argc,char ** argv)35 int main(int argc, char** argv) {
36 p = (int*) malloc(sizeof(p));
37 foo(argc > 1);
38 do_access();
39 free(p);
40 return 0;
41 }
42 }
43
44 // Check that the numbering of the stackframes is correct.
45
46 // CHECK: AddressSanitizer: heap-use-after-free
47 // CHECK-NEXT: WRITE of size
48 // CHECK-NEXT: #0 0x{{[0-9a-fA-F]+}}
49 // CHECK-NEXT: #1 0x{{[0-9a-fA-F]+}} in do_access
50 // CHECK-NEXT: #2 0x{{[0-9a-fA-F]+}} in main
51