Pirama Arumuga Nainar | 7c91505 | 2015-04-08 08:58:29 -0700 | [diff] [blame] | 1 | // RUN: %clang_dfsan %s -o %t |
Stephen Hines | 6d18623 | 2014-11-26 17:56:19 -0800 | [diff] [blame] | 2 | // RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout %run %t 2>&1 | FileCheck %s |
| 3 | // RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout not %run %t c 2>&1 | FileCheck %s --check-prefix=CHECK-OOL |
| 4 | // RUN: DFSAN_OPTIONS=dump_labels_at_exit=/dev/stdout not %run %t u 2>&1 | FileCheck %s --check-prefix=CHECK-OOL |
| 5 | |
| 6 | // Tests that labels are properly dumped at program termination. |
| 7 | |
| 8 | #include <sanitizer/dfsan_interface.h> |
| 9 | #include <assert.h> |
| 10 | #include <stdio.h> |
| 11 | |
| 12 | int main(int argc, char** argv) { |
| 13 | int i = 1; |
| 14 | dfsan_label i_label = dfsan_create_label("i", 0); |
| 15 | dfsan_set_label(i_label, &i, sizeof(i)); |
| 16 | |
| 17 | int j = 2; |
| 18 | dfsan_label j_label = dfsan_create_label("j", 0); |
| 19 | dfsan_set_label(j_label, &j, sizeof(j)); |
| 20 | |
| 21 | int k = 3; |
| 22 | dfsan_label k_label = dfsan_create_label("k", 0); |
| 23 | dfsan_set_label(k_label, &k, sizeof(k)); |
| 24 | |
| 25 | dfsan_label ij_label = dfsan_get_label(i + j); |
| 26 | dfsan_label ijk_label = dfsan_get_label(i + j + k); |
| 27 | |
| 28 | fprintf(stderr, "i %d j %d k %d ij %d ijk %d\n", i_label, j_label, k_label, |
| 29 | ij_label, ijk_label); |
| 30 | |
| 31 | // CHECK: 1 0 0 i |
| 32 | // CHECK: 2 0 0 j |
| 33 | // CHECK: 3 0 0 k |
| 34 | // CHECK: 4 1 2 |
| 35 | // CHECK: 5 3 4 |
| 36 | |
| 37 | if (argc > 1) { |
| 38 | // Exhaust the labels. |
| 39 | unsigned long num_labels = 1 << (sizeof(dfsan_label) * 8); |
| 40 | for (unsigned long i = ijk_label + 1; i < num_labels - 2; ++i) { |
| 41 | dfsan_label l = dfsan_create_label("l", 0); |
| 42 | assert(l == i); |
| 43 | } |
| 44 | |
| 45 | // Consume the last available label. |
| 46 | dfsan_label l = dfsan_union(5, 6); |
| 47 | assert(l == num_labels - 2); |
| 48 | |
| 49 | // Try to allocate another label (either explicitly or by unioning two |
| 50 | // existing labels), but expect a crash. |
| 51 | if (argv[1][0] == 'c') { |
| 52 | l = dfsan_create_label("l", 0); |
| 53 | } else { |
| 54 | l = dfsan_union(6, 7); |
| 55 | } |
| 56 | |
| 57 | // CHECK-OOL: FATAL: DataFlowSanitizer: out of labels |
| 58 | // CHECK-OOL: 1 0 0 i |
| 59 | // CHECK-OOL: 2 0 0 j |
| 60 | // CHECK-OOL: 3 0 0 k |
| 61 | // CHECK-OOL: 4 1 2 |
| 62 | // CHECK-OOL: 5 3 4 |
| 63 | // CHECK-OOL: 6 0 0 |
| 64 | // CHECK-OOL: 65534 5 6 |
| 65 | // CHECK-OOL: 65535 0 0 <init label> |
| 66 | } |
| 67 | |
| 68 | return 0; |
| 69 | } |