3
3
TOOL_BINARY =. /jbmc -binary
4
4
TOOL_NAME = JBMC
5
5
FIND_OPTIONS = "-name '*.java'"
6
+ JVM_HOME = /usr /lib /jvm /java -8 -openjdk -amd64
6
7
7
8
# function to run the tool
8
9
9
10
run ()
10
11
{
11
12
mkdir -p $BM_DIR /classes
12
- /usr /lib /jvm /java -8 -openjdk -amd64 /bin /javac -g -cp $BM_DIR /classes -d $BM_DIR /classes "${BM[@]} "
13
- rm $BM_DIR /classes /org /sosy_lab /sv_benchmarks /Verifier . class
14
- jar -cfe $BM_DIR /task . jar Main -C $BM_DIR /classes .
15
- export TASK = "$BM_DIR/task.jar"
13
+ mkdir -p $BM_DIR /src /org /sosy_lab /sv_benchmarks
14
+ HAS_NONDET = 0
15
+ # We have to patch the Verifier interface.
16
+ # Should be upstreamed to sv-benchmarks to make witness checking easier.
17
+ # Make a copy of Verifier.java.
18
+ for f in "${!BM[@]} " ; do
19
+ echo "${BM[$f]} " | grep Verifier . java > /dev /null
20
+ if [ $? -eq 0 ] ; then
21
+ VERIFIER_FILE = "$BM_DIR/src/org/sosy_lab/sv_benchmarks/Verifier.java"
22
+ cp "${BM[$f]} " $VERIFIER_FILE
23
+ BM [$f ]= "$VERIFIER_FILE"
24
+ else
25
+ grep "Verifier.nondet" "${BM[$f]} " > /dev /null
26
+ if [ $? -eq 0 ] ; then
27
+ HAS_NONDET = 1
28
+ fi
29
+ fi
30
+ done
31
+ # We have to distinguish assumption from assertion failures.
32
+ sed -i 's/Runtime.getRuntime().halt(1);/Runtime.getRuntime().halt(2);/g' $VERIFIER_FILE
33
+ # Let's determinize (uses same inputs for all benchmarks).
34
+ sed -i 's/new Random().nextInt()/11/g' $VERIFIER_FILE
35
+ sed -i 's/new Random().nextBoolean()/false/g' $VERIFIER_FILE
36
+ sed -i 's/new Random().nextLong()/11/g' $VERIFIER_FILE
37
+ sed -i 's/new Random().nextFloat()/11.0f/g' $VERIFIER_FILE
38
+ sed -i 's/new Random().nextDouble()/11.0/g' $VERIFIER_FILE
39
+ sed -i 's/int size = random.nextInt();/int size = 1;/g' $VERIFIER_FILE
40
+ sed -i 's/return new String(bytes);/return "JBMC at SV-COMP 2020";/g' $VERIFIER_FILE
41
+ # Compile
42
+ $JVM_HOME /bin /javac -g -cp $BM_DIR /classes -d $BM_DIR /classes "${BM[@]} "
43
+ # Check whether the file runs
44
+ timeout 10 $JVM_HOME /bin /java -ea -cp $BM_DIR /classes Main >> $LOG . latest 2 >&1
45
+ ECR = $?
46
+ EC = 42
47
+ # Filter out memouts and other errors
48
+ if [ $ECR -eq 1 ] ; then
49
+ grep -E "java\.lang\.StackOverflowError|java\.lang\.OutOfMemoryError|Error: Could not find or load main class|Error: Main method not found in class" $LOG . latest > /dev /null
50
+ if [ $? -eq 0 ] ; then
51
+ ECR = 42
52
+ fi
53
+ fi
54
+ # Assertion failure found
55
+ if [ $ECR -eq 1 ] ; then
56
+ EC = 10
57
+ mv $LOG . latest $LOG . ok
58
+ echo "EC=$EC" >> $LOG . ok
59
+ fi
60
+ # No assertion failure, but deterministic
61
+ if [ $ECR -eq 0 ] ; then
62
+ if [ $HAS_NONDET -eq 0 ] ; then
63
+ EC = 0
64
+ mv $LOG . latest $LOG . ok
65
+ echo "EC=$EC" >> $LOG . ok
66
+ fi
67
+ fi
68
+ if [ $EC -eq 42 ]; then
69
+ rm $BM_DIR /classes /org /sosy_lab /sv_benchmarks /Verifier . class
70
+ jar -cfe $BM_DIR /task . jar Main -C $BM_DIR /classes .
71
+ export TASK = "$BM_DIR/task.jar"
16
72
17
- export MORE_OPTIONS = "--java-threading --throw-runtime-exceptions --max-nondet-string-length 100 --classpath core-models.jar"
73
+ export MORE_OPTIONS = "--java-threading --throw-runtime-exceptions --max-nondet-string-length 100 --classpath core-models.jar"
18
74
19
- if [ "$PROP" = "termination" ] ; then
20
- PROPERTY = "$PROPERTY --no-assertions --no-self-loops-to-assumptions"
21
- fi
75
+ if [ "$PROP" = "termination" ] ; then
76
+ PROPERTY = "$PROPERTY --no-assertions --no-self-loops-to-assumptions"
77
+ fi
22
78
23
- timeout 875 bash -c ' \
79
+ timeout 875 bash -c ' \
24
80
\
25
81
ulimit -v 15000000 ; \
26
82
\
27
83
EC=42 ; \
28
- for c in 2 6 12 17 21 40 200 400 1025 2049 268435456 ; do \
84
+ for c in 2 6 10 15 20 25 30 35 45 60 100 150 200 300 400 500 1025 2049 268435456 ; do \
29
85
echo "Unwind: $c" > $LOG.latest ; \
30
86
./jbmc-binary $MORE_OPTIONS --graphml-witness $LOG.witness --unwind $c --stop-on-fail --$BIT_WIDTH --object-bits $OBJ_BITS $PROPERTY --function $ENTRY $TASK >> $LOG.latest 2>&1 ; \
31
87
ec=$? ; \
@@ -47,8 +103,9 @@ esac ; \
47
103
\
48
104
done \
49
105
'
50
- if [ ! -s $LOG . ok ] ; then
51
- mv $LOG . latest $LOG . ok ; echo "EC=42" >> $LOG . ok
106
+ if [ ! -s $LOG . ok ] ; then
107
+ mv $LOG . latest $LOG . ok ; echo "EC=42" >> $LOG . ok
108
+ fi
52
109
fi
53
110
eval `tail -n 1 $LOG . ok `
54
111
}
0 commit comments