about summary refs log tree commit diff homepage
path: root/test/Feature/StatesCoveringNew.c
blob: e372e89e2cc69eebedd8d1975708d8c39d6f8010 (plain) (blame)
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
// Check that we properly detect states covering new instructions.
//
// RUN: %llvmgcc -I../../../include %s -emit-llvm -O0 -c -o %t1.bc
// RUN: rm -rf %t.klee-out
// RUN: %klee --output-dir=%t.klee-out --only-output-states-covering-new %t1.bc

// We expect 4 different output states, one for each named value and one "other"
// one with the prefered CEX. We verify this by using ktest-tool to dump the
// values, and then checking the output.
//
// RUN: /bin/sh -c "ktest-tool --write-int %t.klee-out/*.ktest" | sort > %t.data-values
// RUN: FileCheck < %t.data-values %s

// CHECK: object 0: data: 0
// CHECK: object 0: data: 17
// CHECK: object 0: data: 32
// CHECK: object 0: data: 99

#include <klee/klee.h>

void f0(void) {}
void f1(void) {}
void f2(void) {}
void f3(void) {}

int main() {
  int x = klee_range(0, 256, "x");

  if (x == 17) {
    f0();
  } else if (x == 32) {
    f1();
  } else if (x == 99) {
    f2();
  } else {
    klee_prefer_cex(&x, x == 0);
    f3();
  }

  return 0;
}