1 | // RUN: %clangxx -O0 %s -o %t |
2 | // RUN: %env_tool_opts=strip_path_prefix=/TestCases/ %run %t 2>&1 | FileCheck %s |
3 | // |
4 | // Tests __sanitizer_symbolize_pc. |
5 | |
6 | // FIXME: Investigate why it does not print GLOBAL_VAR_ABC. |
7 | // XFAIL: hwasan && target=aarch64{{.*}} |
8 | // LSan tests fail on Darwin |
9 | // UNSUPPORTED: darwin && lsan |
10 | // tsan and ubsan are supported on darwin, but they currently fail |
11 | // on some platforms likely because the test platform is too old |
12 | // UNSUPPORTED: darwin && tsan |
13 | // UNSUPPORTED: darwin && ubsan |
14 | |
15 | #include <stdio.h> |
16 | #include <sanitizer/common_interface_defs.h> |
17 | |
18 | int GLOBAL_VAR_ABC; |
19 | |
20 | void SymbolizeSmallBuffer() { |
21 | char data[] = "abcdef" ; |
22 | __sanitizer_symbolize_pc(__sanitizer_return_address(), fmt: "%p %F %L" , out_buf: data, out_buf_size: 0); |
23 | printf(format: "UNCHANGED '%s'\n" , data); |
24 | __sanitizer_symbolize_pc(__sanitizer_return_address(), fmt: "%p %F %L" , out_buf: data, out_buf_size: 1); |
25 | printf(format: "EMPTY '%s'\n" , data); |
26 | __sanitizer_symbolize_pc(__sanitizer_return_address(), fmt: "%p %F %L" , out_buf: data, |
27 | out_buf_size: sizeof(data)); |
28 | printf(format: "PARTIAL '%s'\n" , data); |
29 | } |
30 | |
31 | void SymbolizeCaller() { |
32 | char data[100]; |
33 | __sanitizer_symbolize_pc(__sanitizer_return_address(), fmt: "%p %F %L" , out_buf: data, |
34 | out_buf_size: sizeof(data)); |
35 | printf(format: "FIRST_FORMAT %s\n" , data); |
36 | __sanitizer_symbolize_pc(__sanitizer_return_address(), |
37 | fmt: "FUNC:%f LINE:%l FILE:%s" , out_buf: data, out_buf_size: sizeof(data)); |
38 | printf(format: "SECOND_FORMAT %s\n" , data); |
39 | __sanitizer_symbolize_pc(__sanitizer_return_address(), |
40 | fmt: "LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" |
41 | "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" |
42 | "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" |
43 | "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" |
44 | "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONG" |
45 | "FUNC:%f LINE:%l FILE:%s" , |
46 | out_buf: data, out_buf_size: sizeof(data)); |
47 | printf(format: "LONG_FORMAT %s\n" , data); |
48 | } |
49 | |
50 | struct s { |
51 | int i; |
52 | }; |
53 | |
54 | struct s SymbolizeSRet() { |
55 | char data[100]; |
56 | __sanitizer_symbolize_pc(__sanitizer_return_address(), |
57 | fmt: "FUNC:%f LINE:%l FILE:%s" , out_buf: data, out_buf_size: sizeof(data)); |
58 | printf(format: "SRET: %s\n" , data); |
59 | struct s s = {.i: 1}; |
60 | return s; |
61 | } |
62 | |
63 | void SymbolizeData() { |
64 | char data[100]; |
65 | __sanitizer_symbolize_global(data_ptr: &GLOBAL_VAR_ABC, fmt: "%g %s:%l" , out_buf: data, out_buf_size: sizeof(data)); |
66 | printf(format: "GLOBAL: %s\n" , data); |
67 | } |
68 | |
69 | int main() { |
70 | // CHECK: UNCHANGED 'abcdef' |
71 | // CHECK: EMPTY '' |
72 | // CHECK: PARTIAL '0x{{.*}}' |
73 | SymbolizeSmallBuffer(); |
74 | |
75 | // CHECK: FIRST_FORMAT 0x{{.*}} in main symbolize_pc.cpp:[[@LINE+2]] |
76 | // CHECK: SECOND_FORMAT FUNC:main LINE:[[@LINE+1]] FILE:symbolize_pc.cpp |
77 | SymbolizeCaller(); |
78 | |
79 | struct s s; |
80 | // CHECK: SRET: FUNC:main LINE:[[@LINE+1]] FILE:symbolize_pc.cpp |
81 | s = SymbolizeSRet(); |
82 | |
83 | // CHECK: GLOBAL: GLOBAL_VAR_ABC |
84 | SymbolizeData(); |
85 | } |
86 | |