1 | // RUN: %clangxx_asan %s -o %t |
2 | // RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=A1 |
3 | // RUN: not %run %t 1 2>&1 | FileCheck %s --check-prefix=A2 |
4 | // RUN: %env_asan_opts=intercept_memmem=0 %run %t |
5 | |
6 | #include <string.h> |
7 | int main(int argc, char **argv) { |
8 | char a1[] = {1, 2, 3, 4, 5, 6, 7, 8}; |
9 | char a2[] = {3, 4, 5}; |
10 | void *res; |
11 | if (argc == 1) |
12 | res = memmem(haystack: a1, haystacklen: sizeof(a1) + 1, needle: a2, needlelen: sizeof(a2)); // BOOM |
13 | else |
14 | res = memmem(haystack: a1, haystacklen: sizeof(a1), needle: a2, needlelen: sizeof(a2) + 1); // BOOM |
15 | // A1: AddressSanitizer: stack-buffer-overflow |
16 | // A1: {{#0.*memmem}} |
17 | // A1-NEXT: {{#1.*main}} |
18 | // A1: 'a1'{{.*}} <== Memory access at offset |
19 | // |
20 | // A2: AddressSanitizer: stack-buffer-overflow |
21 | // A2: {{#0.*memmem}} |
22 | // A2: 'a2'{{.*}} <== Memory access at offset |
23 | return res == NULL; |
24 | } |
25 | |