Skip to content

Commit 3b238c7

Browse files
Merge pull request #56 from peterschrammel/dynamic-pre-analysis
Dynamic pre-analysis used in Java track of SV-COMP'20
2 parents 7abb07f + 260ad08 commit 3b238c7

File tree

1 file changed

+69
-12
lines changed

1 file changed

+69
-12
lines changed

jbmc.inc

Lines changed: 69 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,85 @@
33
TOOL_BINARY=./jbmc-binary
44
TOOL_NAME=JBMC
55
FIND_OPTIONS="-name '*.java'"
6+
JVM_HOME=/usr/lib/jvm/java-8-openjdk-amd64
67

78
# function to run the tool
89

910
run()
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
\
2581
ulimit -v 15000000 ; \
2682
\
2783
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 \
2985
echo "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 ; \
3187
ec=$? ; \
@@ -47,8 +103,9 @@ esac ; \
47103
\
48104
done \
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

Comments
 (0)