33TOOL_BINARY =. /jbmc -binary
44TOOL_NAME = JBMC
55FIND_OPTIONS = "-name '*.java'"
6+ JVM_HOME = /usr /lib /jvm /java -8 -openjdk -amd64
67
78# function to run the tool
89
910run ()
1011{
1112 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"
1672
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"
1874
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
2278
23- timeout 875 bash -c ' \
79+ timeout 875 bash -c ' \
2480\
2581ulimit -v 15000000 ; \
2682\
2783EC=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 \
2985echo "Unwind: $c" > $LOG.latest ; \
3086./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 ; \
3187ec=$? ; \
@@ -47,8 +103,9 @@ esac ; \
47103\
48104done \
49105'
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
52109 fi
53110 eval `tail -n 1 $LOG . ok `
54111}
0 commit comments