diff --git a/compiler-rt/test/dfsan/origin_stack_trace.c b/compiler-rt/test/dfsan/origin_stack_trace.c --- a/compiler-rt/test/dfsan/origin_stack_trace.c +++ b/compiler-rt/test/dfsan/origin_stack_trace.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #define NOINLINE __attribute__((noinline)) @@ -43,19 +45,24 @@ // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-22]] // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_stack_trace.c:[[@LINE-16]] - char buf[3000]; - size_t length = dfsan_sprint_origin_trace(&c, NULL, buf, sizeof(buf)); + // Test logic expects this buffer to be large enough. + // String contains current paths, which could vary in length. + // Make this buffer much larger than necessary to accomodate variation. + const size_t kBufSize = 8192; + char *buf = (char*) malloc(kBufSize); + size_t length = dfsan_sprint_origin_trace(&c, NULL, buf, kBufSize); + assert(kBufSize > length); printf("==OUTPUT==\n\n%s==EOS==\n", buf); // CHECK: ==OUTPUT== // CHECK: Taint value 0x1 {{.*}} origin tracking () // CHECK: Origin value: {{.*}}, Taint value was stored to memory at - // CHECK: #0 {{.*}} in main {{.*}}origin_stack_trace.c:[[@LINE-18]] + // CHECK: #0 {{.*}} in main {{.*}}origin_stack_trace.c:[[@LINE-23]] // CHECK: Origin value: {{.*}}, Taint value was created at - // CHECK: #0 {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-33]] - // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-36]] - // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_stack_trace.c:[[@LINE-30]] + // CHECK: #0 {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-38]] + // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-41]] + // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_stack_trace.c:[[@LINE-35]] // CHECK: ==EOS== char tinybuf[18]; @@ -73,18 +80,19 @@ // CHECK: Actual length: [[#LEN]] // CHECK: Returned length with truncation: [[#LEN]] - size_t length_with_desc = dfsan_sprint_origin_trace(&c, "DESCRIPTION", buf, sizeof(buf)); + size_t length_with_desc = dfsan_sprint_origin_trace(&c, "DESCRIPTION", buf, kBufSize); + assert(kBufSize > length_with_desc); printf("==OUTPUT==\n\n%s==EOS==\n", buf); // CHECK: ==OUTPUT== // CHECK: Taint value 0x1 {{.*}} origin tracking (DESCRIPTION) // CHECK: Origin value: {{.*}}, Taint value was stored to memory at - // CHECK: #0 {{.*}} in main {{.*}}origin_stack_trace.c:[[@LINE-47]] + // CHECK: #0 {{.*}} in main {{.*}}origin_stack_trace.c:[[@LINE-53]] // CHECK: Origin value: {{.*}}, Taint value was created at - // CHECK: #0 {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-62]] - // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-65]] - // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_stack_trace.c:[[@LINE-59]] + // CHECK: #0 {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-68]] + // CHECK-COUNT-8: #{{[0-9]+}} {{.*}} in bar.dfsan {{.*}}origin_stack_trace.c:[[@LINE-71]] + // CHECK: #9 {{.*}} in baz.dfsan {{.*}}origin_stack_trace.c:[[@LINE-65]] // CHECK: ==EOS== printf("Returned length: %zu\n", length_with_desc); @@ -97,4 +105,6 @@ printf("Returned length: %zu\n", length); // CHECK: Output="" // CHECK: Returned length: [[#LEN]] + + free(buf); }