2015-03-03 03:34:06 +08:00
|
|
|
// RUN: %clang_dfsan %s -o %t
|
2014-11-20 18:01:08 +08:00
|
|
|
// 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;
|
|
|
|
}
|