| 1 | // RUN: %clang_dfsan -gmlt -DTEST64 -DALIGN=8 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
| 2 | // RUN: %run %t >%t.out 2>&1 |
| 3 | // RUN: FileCheck %s < %t.out |
| 4 | // |
| 5 | // RUN: %clang_dfsan -gmlt -DTEST32 -DALIGN=4 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
| 6 | // RUN: %run %t >%t.out 2>&1 |
| 7 | // RUN: FileCheck %s < %t.out |
| 8 | // |
| 9 | // RUN: %clang_dfsan -gmlt -DALIGN=2 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
| 10 | // RUN: %run %t >%t.out 2>&1 |
| 11 | // RUN: FileCheck %s < %t.out |
| 12 | // |
| 13 | // RUN: %clang_dfsan -gmlt -DTEST64 -DALIGN=4 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
| 14 | // RUN: %run %t >%t.out 2>&1 |
| 15 | // RUN: FileCheck %s < %t.out |
| 16 | // |
| 17 | // RUN: %clang_dfsan -gmlt -DTEST32 -DALIGN=2 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
| 18 | // RUN: %run %t >%t.out 2>&1 |
| 19 | // RUN: FileCheck %s < %t.out |
| 20 | // |
| 21 | // RUN: %clang_dfsan -gmlt -DALIGN=1 -mllvm -dfsan-track-origins=1 %s -o %t && \ |
| 22 | // RUN: %run %t >%t.out 2>&1 |
| 23 | // RUN: FileCheck %s < %t.out |
| 24 | // |
| 25 | // Test origin tracking is accurate in terms of partial store/load, and |
| 26 | // different aligments. Do not test alignments that are not power of 2. |
| 27 | // Compilers do not always allow this. |
| 28 | |
| 29 | #include <sanitizer/dfsan_interface.h> |
| 30 | |
| 31 | #ifdef TEST64 |
| 32 | typedef uint64_t FULL_TYPE; |
| 33 | typedef uint32_t HALF_TYPE; |
| 34 | #elif defined(TEST32) |
| 35 | typedef uint32_t FULL_TYPE; |
| 36 | typedef uint16_t HALF_TYPE; |
| 37 | #else |
| 38 | typedef uint16_t FULL_TYPE; |
| 39 | typedef uint8_t HALF_TYPE; |
| 40 | #endif |
| 41 | |
| 42 | __attribute__((noinline)) FULL_TYPE foo(FULL_TYPE a, FULL_TYPE b) { return a + b; } |
| 43 | |
| 44 | int main(int argc, char *argv[]) { |
| 45 | char x __attribute__((aligned(ALIGN))) = 1, y = 2; |
| 46 | dfsan_set_label(label: 8, addr: &x, size: sizeof(x)); |
| 47 | char z __attribute__((aligned(ALIGN))) = x + y; |
| 48 | dfsan_print_origin_trace(addr: &z, NULL); |
| 49 | |
| 50 | FULL_TYPE a __attribute__((aligned(ALIGN))) = 1; |
| 51 | FULL_TYPE b = 10; |
| 52 | dfsan_set_label(label: 4, addr: (HALF_TYPE *)&a + 1, size: sizeof(HALF_TYPE)); |
| 53 | FULL_TYPE c __attribute__((aligned(ALIGN))) = foo(a, b); |
| 54 | dfsan_print_origin_trace(addr: &c, NULL); |
| 55 | dfsan_print_origin_trace(addr: (HALF_TYPE *)&c + 1, NULL); |
| 56 | } |
| 57 | |
| 58 | // CHECK: Taint value 0x8 {{.*}} origin tracking () |
| 59 | // CHECK: Origin value: {{.*}}, Taint value was stored to memory at |
| 60 | // CHECK: #0 {{.*}} in main {{.*}}origin_ldst.c:[[@LINE-13]] |
| 61 | |
| 62 | // CHECK: Origin value: {{.*}}, Taint value was created at |
| 63 | // CHECK: #0 {{.*}} in main {{.*}}origin_ldst.c:[[@LINE-17]] |
| 64 | |
| 65 | // CHECK: Taint value 0x4 {{.*}} origin tracking () |
| 66 | // CHECK: Origin value: {{.*}}, Taint value was stored to memory at |
| 67 | // CHECK: #0 {{.*}} in main {{.*}}origin_ldst.c:[[@LINE-14]] |
| 68 | |
| 69 | // CHECK: Origin value: {{.*}}, Taint value was created at |
| 70 | // CHECK: #0 {{.*}} in main {{.*}}origin_ldst.c:[[@LINE-18]] |
| 71 | |
| 72 | // CHECK: Taint value 0x4 {{.*}} origin tracking () |
| 73 | // CHECK: Origin value: {{.*}}, Taint value was stored to memory at |
| 74 | // CHECK: #0 {{.*}} in main {{.*}}origin_ldst.c:[[@LINE-21]] |
| 75 | |
| 76 | // CHECK: Origin value: {{.*}}, Taint value was created at |
| 77 | // CHECK: #0 {{.*}} in main {{.*}}origin_ldst.c:[[@LINE-25]] |
| 78 | |