diff options
Diffstat (limited to 'test/dfsan/dump_labels.c')
-rw-r--r-- | test/dfsan/dump_labels.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/test/dfsan/dump_labels.c b/test/dfsan/dump_labels.c new file mode 100644 index 000000000000..67801af1838f --- /dev/null +++ b/test/dfsan/dump_labels.c @@ -0,0 +1,69 @@ +// RUN: %clang_dfsan -m64 %s -o %t +// RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout %run %t 2>&1 | FileCheck %s +// RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout not %run %t c 2>&1 | FileCheck %s --check-prefix=CHECK-OOL +// RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout not %run %t u 2>&1 | FileCheck %s --check-prefix=CHECK-OOL + +// Tests that labels are properly dumped at program termination. + +#include <sanitizer/dfsan_interface.h> +#include <assert.h> +#include <stdio.h> + +int main(int argc, char** argv) { + int i = 1; + dfsan_label i_label = dfsan_create_label("i", 0); + dfsan_set_label(i_label, &i, sizeof(i)); + + int j = 2; + dfsan_label j_label = dfsan_create_label("j", 0); + dfsan_set_label(j_label, &j, sizeof(j)); + + int k = 3; + dfsan_label k_label = dfsan_create_label("k", 0); + dfsan_set_label(k_label, &k, sizeof(k)); + + dfsan_label ij_label = dfsan_get_label(i + j); + dfsan_label ijk_label = dfsan_get_label(i + j + k); + + fprintf(stderr, "i %d j %d k %d ij %d ijk %d\n", i_label, j_label, k_label, + ij_label, ijk_label); + + // CHECK: 1 0 0 i + // CHECK: 2 0 0 j + // CHECK: 3 0 0 k + // CHECK: 4 1 2 + // CHECK: 5 3 4 + + if (argc > 1) { + // Exhaust the labels. + unsigned long num_labels = 1 << (sizeof(dfsan_label) * 8); + for (unsigned long i = ijk_label + 1; i < num_labels - 2; ++i) { + dfsan_label l = dfsan_create_label("l", 0); + assert(l == i); + } + + // Consume the last available label. + dfsan_label l = dfsan_union(5, 6); + assert(l == num_labels - 2); + + // Try to allocate another label (either explicitly or by unioning two + // existing labels), but expect a crash. + if (argv[1][0] == 'c') { + l = dfsan_create_label("l", 0); + } else { + l = dfsan_union(6, 7); + } + + // CHECK-OOL: FATAL: DataFlowSanitizer: out of labels + // CHECK-OOL: 1 0 0 i + // CHECK-OOL: 2 0 0 j + // CHECK-OOL: 3 0 0 k + // CHECK-OOL: 4 1 2 + // CHECK-OOL: 5 3 4 + // CHECK-OOL: 6 0 0 + // CHECK-OOL: 65534 5 6 + // CHECK-OOL: 65535 0 0 <init label> + } + + return 0; +} |