reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
// RUN: %clang_dfsan %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;
}