1 // RUN: %clang_dfsan -gmlt -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 -mllvm -dfsan-track-origins=1 -mllvm -dfsan-instrument-with-call-threshold=0 %s -o %t && \ 6 // RUN: %run %t >%t.out 2>&1 7 // RUN: FileCheck %s < %t.out 8 // 9 // REQUIRES: x86_64-target-arch 10 11 #include <sanitizer/dfsan_interface.h> 12 #include <stdio.h> 13 #include <string.h> 14 15 __attribute__((noinline)) int foo(int a, int b) { return a + b; } 16 17 __attribute__((noinline)) void bar(int depth, void *addr, int size) { 18 if (depth) { 19 bar(depth - 1, addr, size); 20 } else { 21 dfsan_set_label(1, addr, size); 22 } 23 } 24 25 __attribute__((noinline)) void baz(int depth, void *addr, int size) { 26 bar(depth, addr, size); 27 } 28 29 int main(int argc, char *argv[]) { 30 int a = 10; 31 int b = 20; 32 baz(8, &a, sizeof(a)); 33 int c = foo(a, b); 34 dfsan_origin c_o = dfsan_get_origin(c); 35 dfsan_print_origin_id_trace(c_o); 36 // CHECK: Origin value: {{.*}}, Taint value was created at 37 // CHECK: #0 {{.*}} in bar.dfsan {{.*}}origin_id_stack_trace.c:[[@LINE-16]] 38 // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_id_stack_trace.c:[[@LINE-19]] 39 // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_id_stack_trace.c:[[@LINE-13]] 40 41 char buf[3000]; 42 size_t length = dfsan_sprint_origin_id_trace(c_o, buf, sizeof(buf)); 43 44 printf("==OUTPUT==\n\n%s==EOS==\n", buf); 45 // CHECK: ==OUTPUT== 46 // CHECK: Origin value: {{.*}}, Taint value was created at 47 // CHECK: #0 {{.*}} in bar.dfsan {{.*}}origin_id_stack_trace.c:[[@LINE-26]] 48 // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_id_stack_trace.c:[[@LINE-29]] 49 // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_id_stack_trace.c:[[@LINE-23]] 50 // CHECK: ==EOS== 51 52 char tinybuf[20]; 53 size_t same_length = 54 dfsan_sprint_origin_id_trace(c_o, tinybuf, sizeof(tinybuf)); 55 56 printf("==TRUNCATED OUTPUT==\n\n%s==EOS==\n", tinybuf); 57 // CHECK: ==TRUNCATED OUTPUT== 58 // CHECK: Origin value: 0x1==EOS== 59 60 printf("Returned length: %zu\n", length); 61 printf("Actual length: %zu\n", strlen(buf)); 62 printf("Returned length with truncation: %zu\n", same_length); 63 64 // CHECK: Returned length: [[#LEN:]] 65 // CHECK: Actual length: [[#LEN]] 66 // CHECK: Returned length with truncation: [[#LEN]] 67 68 buf[0] = '\0'; 69 length = dfsan_sprint_origin_id_trace(c_o, buf, 0); 70 printf("Output=\"%s\"\n", buf); 71 printf("Returned length: %zu\n", length); 72 // CHECK: Output="" 73 // CHECK: Returned length: [[#LEN]] 74 } 75