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 #include <stdio.h> 6 #include <sanitizer/common_interface_defs.h> 7 8 int GLOBAL_VAR_ABC; 9 10 void SymbolizeSmallBuffer() { 11 char data[] = "abcdef"; 12 __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data, 0); 13 printf("UNCHANGED '%s'\n", data); 14 __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data, 1); 15 printf("EMPTY '%s'\n", data); 16 __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data, 17 sizeof(data)); 18 printf("PARTIAL '%s'\n", data); 19 } 20 21 void SymbolizeCaller() { 22 char data[100]; 23 __sanitizer_symbolize_pc(__sanitizer_return_address(), "%p %F %L", data, 24 sizeof(data)); 25 printf("FIRST_FORMAT %s\n", data); 26 __sanitizer_symbolize_pc(__sanitizer_return_address(), 27 "FUNC:%f LINE:%l FILE:%s", data, sizeof(data)); 28 printf("SECOND_FORMAT %s\n", data); 29 __sanitizer_symbolize_pc(__sanitizer_return_address(), 30 "LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" 31 "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" 32 "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" 33 "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" 34 "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONG" 35 "FUNC:%f LINE:%l FILE:%s", 36 data, sizeof(data)); 37 printf("LONG_FORMAT %s\n", data); 38 } 39 40 struct s { 41 int i; 42 }; 43 44 struct s SymbolizeSRet() { 45 char data[100]; 46 __sanitizer_symbolize_pc(__sanitizer_return_address(), 47 "FUNC:%f LINE:%l FILE:%s", data, sizeof(data)); 48 printf("SRET: %s\n", data); 49 struct s s = {1}; 50 return s; 51 } 52 53 void SymbolizeData() { 54 char data[100]; 55 __sanitizer_symbolize_global(&GLOBAL_VAR_ABC, "%g %s:%l", data, sizeof(data)); 56 printf("GLOBAL: %s\n", data); 57 } 58 59 int main() { 60 // CHECK: UNCHANGED 'abcdef' 61 // CHECK: EMPTY '' 62 // CHECK: PARTIAL '0x{{.*}}' 63 SymbolizeSmallBuffer(); 64 65 // CHECK: FIRST_FORMAT 0x{{.*}} in main symbolize_pc.cpp:[[@LINE+2]] 66 // CHECK: SECOND_FORMAT FUNC:main LINE:[[@LINE+1]] FILE:symbolize_pc.cpp 67 SymbolizeCaller(); 68 69 struct s s; 70 // CHECK: SRET: FUNC:main LINE:[[@LINE+1]] FILE:symbolize_pc.cpp 71 s = SymbolizeSRet(); 72 73 // CHECK: GLOBAL: GLOBAL_VAR_ABC 74 SymbolizeData(); 75 } 76