1// RUN: %clang_dfsan %s -mllvm -dfsan-combine-offset-labels-on-gep=false -Wno-error=int-conversion -o %t && %run %t
2// RUN: %clang_dfsan %s -DPROP_OFFSET_LABELS -Wno-error=int-conversion -o %t && %run %t
3
4// Tests that labels are propagated through GEP.
5
6#include <sanitizer/dfsan_interface.h>
7#include <assert.h>
8
9int main(void) {
10 int i = 1;
11 int *p = &i;
12 int j = 2;
13 // test that pointer arithmetic propagates labels in terms of the flag.
14 dfsan_set_label(label: 1, addr: &i, size: sizeof(i));
15 p += i;
16#ifdef PROP_OFFSET_LABELS
17 assert(dfsan_get_label(p) == 1);
18#else
19 assert(dfsan_get_label(p) == 0);
20#endif
21 // test that non-pointer operations always propagate labels.
22 dfsan_set_label(label: 2, addr: &j, size: sizeof(j));
23 j += i;
24 assert(dfsan_get_label(j) == 3);
25 return 0;
26}
27

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