1 | // RUN: %clang_dfsan -gmlt -DOFFSET=0 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
2 | // RUN: %run %t >%t.out 2>&1 |
3 | // RUN: FileCheck %s --check-prefix=CHECK0 < %t.out |
4 | // |
5 | // RUN: %clang_dfsan -gmlt -DOFFSET=10 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
6 | // RUN: %run %t >%t.out 2>&1 |
7 | // RUN: FileCheck %s --check-prefix=CHECK10 < %t.out |
8 | |
9 | #include <sanitizer/dfsan_interface.h> |
10 | |
11 | #include <string.h> |
12 | |
13 | int xx[10000]; |
14 | |
15 | volatile int idx = 30; |
16 | |
17 | __attribute__((noinline)) |
18 | void fn_g(int a, int b) { |
19 | memset(s: &xx[idx], c: a, n: sizeof(a)); |
20 | memset(s: &xx[idx + 10], c: b, n: sizeof(b)); |
21 | } |
22 | |
23 | __attribute__((noinline)) |
24 | void fn_f(int a, int b) { |
25 | fn_g(a, b); |
26 | } |
27 | |
28 | int main(int argc, char *argv[]) { |
29 | int volatile z1; |
30 | int volatile z2; |
31 | dfsan_set_label(label: 8, addr: (void *)&z1, size: sizeof(z1)); |
32 | dfsan_set_label(label: 16, addr: (void *)&z2, size: sizeof(z2)); |
33 | fn_f(a: z1, b: z2); |
34 | dfsan_print_origin_trace(&xx[idx + OFFSET], NULL); |
35 | return 0; |
36 | } |
37 | |
38 | // CHECK0: Taint value 0x8 {{.*}} origin tracking () |
39 | // CHECK0: Origin value: {{.*}}, Taint value was created at |
40 | |
41 | // CHECK0: #0 {{.*}} in main {{.*}}origin_memset.c:[[@LINE-10]] |
42 | |
43 | // CHECK10: Taint value 0x10 {{.*}} origin tracking () |
44 | // CHECK10: Origin value: {{.*}}, Taint value was created at |
45 | |
46 | // CHECK10: #0 {{.*}} in main {{.*}}origin_memset.c:[[@LINE-14]] |
47 | |