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
13int xx[10000];
14
15volatile int idx = 30;
16
17__attribute__((noinline))
18void 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))
24void fn_f(int a, int b) {
25 fn_g(a, b);
26}
27
28int 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

source code of compiler-rt/test/dfsan/origin_memset.c