| 1 | // RUN: %clangxx_asan -g -O2 %s -o %t |
| 2 | // RUN: not %run %t g 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=GLOB |
| 3 | // RUN: not %run %t c 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=CLASS_STATIC |
| 4 | // RUN: not %run %t f 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=FUNC_STATIC |
| 5 | // RUN: not %run %t l 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=LITERAL |
| 6 | |
| 7 | // COFF doesn't support debuginfo for globals. For the non-debuginfo tests, see global-location-nodebug.cpp. |
| 8 | // XFAIL: target={{.*windows-msvc.*}} |
| 9 | |
| 10 | // FIXME: Investigate failure on MinGW |
| 11 | // XFAIL: target={{.*-windows-gnu}} |
| 12 | |
| 13 | // atos doesn't show source line numbers for global variables. |
| 14 | // UNSUPPORTED: darwin |
| 15 | |
| 16 | // CHECK: AddressSanitizer: global-buffer-overflow |
| 17 | |
| 18 | #include <string.h> |
| 19 | |
| 20 | struct C { |
| 21 | static int array[10]; |
| 22 | // CLASS_STATIC: 0x{{.*}} is located 4 bytes after global variable 'C::array' defined in '{{.*}}global-location.cpp:[[@LINE-1]]' {{.*}} of size 40 |
| 23 | }; |
| 24 | |
| 25 | int global[10]; |
| 26 | // GLOB: 0x{{.*}} is located 4 bytes after global variable 'global' defined in '{{.*}}global-location.cpp:[[@LINE-1]]' {{.*}} of size 40 |
| 27 | int C::array[10]; |
| 28 | |
| 29 | int main(int argc, char **argv) { |
| 30 | int one = argc - 1; |
| 31 | switch (argv[1][0]) { |
| 32 | case 'g': return global[one * 11]; |
| 33 | case 'c': return C::array[one * 11]; |
| 34 | case 'f': |
| 35 | static int array[10]; |
| 36 | // FUNC_STATIC: 0x{{.*}} is located 4 bytes after global variable 'main::array' defined in '{{.*}}global-location.cpp:[[@LINE-1]]' {{.*}} of size 40 |
| 37 | memset(s: array, c: 0, n: 10); |
| 38 | return array[one * 11]; |
| 39 | case 'l': |
| 40 | const char *str = "0123456789" ; |
| 41 | // LITERAL: 0x{{.*}} is located 0 bytes after global variable {{.*}} defined in '{{.*}}global-location.cpp:[[@LINE-1]]' {{.*}} of size 11 |
| 42 | return str[one * 11]; |
| 43 | } |
| 44 | return 0; |
| 45 | } |
| 46 | |
| 47 | // CHECK: SUMMARY: AddressSanitizer: global-buffer-overflow |
| 48 | |