Skip to content

Commit f70926f

Browse files
CBMC wrapper for SV-COMP
1 parent ff180a5 commit f70926f

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

sv-comp/cbmc

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#!/bin/bash
2+
3+
parse_property_file()
4+
{
5+
local fn=$1
6+
7+
cat $fn | sed 's/[[:space:]]//g' | perl -n -e '
8+
if(/^CHECK\(init\((\S+)\(\)\),LTL\(G(\S+)\)\)$/) {
9+
print "ENTRY=$1\n";
10+
print "PROPERTY=\"--error-label $1\"\n" if($2 =~ /^!label\((\S+)\)$/);
11+
print "PROPERTY=\" \"\n" if($2 =~ /^!call\(__VERIFIER_error\(\)\)$/);
12+
print "PROPERTY=\"--pointer-check --memory-leak-check --bounds-check\"\n" if($2 =~ /^valid-(free|deref|memtrack)$/);
13+
print "PROPERTY=\"--signed-overflow-check\"\n" if($2 =~ /^!overflow$/);
14+
}'
15+
}
16+
17+
parse_result()
18+
{
19+
if tail -n 50 $LOG.ok | grep -q "^[[:space:]]*__CPROVER_memory_leak == NULL$" ; then
20+
echo 'FALSE(valid-memtrack)'
21+
elif tail -n 50 $LOG.ok | grep -q "^[[:space:]]*dereference failure:" ; then
22+
echo 'FALSE(valid-deref)'
23+
elif tail -n 50 $LOG.ok | grep -q "^[[:space:]]*double free$" ; then
24+
echo 'FALSE(valid-free)'
25+
elif tail -n 50 $LOG.ok | grep -q "^[[:space:]]*free argument has offset zero$" ; then
26+
echo 'FALSE(valid-free)'
27+
elif tail -n 50 $LOG.ok | grep -q "^[[:space:]]*arithmetic overflow on signed" ; then
28+
echo 'FALSE(no-overflow)'
29+
else
30+
echo FALSE
31+
fi
32+
}
33+
34+
process_graphml()
35+
{
36+
cat $LOG.cex | perl -p -e "s/(<graph edgedefault=\"directed\">)/\$1\\E
37+
<data key=\"witness-type\">violation_witness<\/data>
38+
<data key=\"producer\">CBMC<\/data>
39+
<data key=\"specification\">$(<$PROP_FILE)<\/data>
40+
<data key=\"programfile\">$(echo $BM | sed 's8/8\\/8g')<\/data>
41+
<data key=\"programhash\">$(sha1sum $BM | awk '{print $1}')<\/data>
42+
<data key=\"architecture\">${BIT_WIDTH##--}bit<\/data>\\Q/"
43+
}
44+
45+
BIT_WIDTH="--64"
46+
BM=""
47+
PROP_FILE=""
48+
CEX_FILE=""
49+
50+
while [ -n "$1" ] ; do
51+
case "$1" in
52+
--32|--64) BIT_WIDTH="$1" ; shift 1 ;;
53+
--propertyfile) PROP_FILE="$2" ; shift 2 ;;
54+
--graphml-cex) CEX_FILE="$2" ; shift 2 ;;
55+
--version) ./cbmc-binary --version ; exit 0 ;;
56+
*) BM="$1" ; shift 1 ;;
57+
esac
58+
done
59+
60+
if [ -z "$BM" ] || [ -z "$PROP_FILE" ] ; then
61+
echo "Missing benchmark or property file"
62+
exit 1
63+
fi
64+
65+
if [ ! -s "$BM" ] || [ ! -s "$PROP_FILE" ] ; then
66+
echo "Empty benchmark or property file"
67+
exit 1
68+
fi
69+
70+
eval `parse_property_file $PROP_FILE`
71+
export ENTRY
72+
export PROPERTY
73+
export BIT_WIDTH
74+
export BM
75+
76+
export LOG=`mktemp -t cbmc-log.XXXXXX`
77+
trap "rm -f $LOG $LOG.latest $LOG.ok $LOG.cex" EXIT
78+
79+
timeout 850 bash -c ' \
80+
\
81+
ulimit -v 15000000 ; \
82+
\
83+
EC=42 ; \
84+
for c in 2 6 12 17 21 40 200 400 1025 2049 268435456 ; do \
85+
echo "Unwind: $c" > $LOG.latest ; \
86+
./cbmc-binary --graphml-cex $LOG.cex --unwind $c --stop-on-fail $BIT_WIDTH $PROPERTY --function $ENTRY $BM >> $LOG.latest 2>&1 ; \
87+
ec=$? ; \
88+
if [ $ec -eq 0 ] ; then \
89+
if ! tail -n 10 $LOG.latest | grep -q "^VERIFICATION SUCCESSFUL$" ; then ec=1 ; fi ; \
90+
fi ; \
91+
if [ $ec -eq 10 ] ; then \
92+
if ! tail -n 10 $LOG.latest | grep -q "^VERIFICATION FAILED$" ; then ec=1 ; fi ; \
93+
fi ; \
94+
\
95+
case $ec in \
96+
0) EC=0 ; mv $LOG.latest $LOG.ok ; echo "EC=$EC" >> $LOG.ok ;; \
97+
10) EC=10 ; mv $LOG.latest $LOG.ok ; echo "EC=$EC" >> $LOG.ok ; break ;; \
98+
*) if [ $EC -ne 0 ] ; then EC=$ec ; mv $LOG.latest $LOG.ok ; fi ; echo "EC=$EC" >> $LOG.ok ; break ;; \
99+
esac ; \
100+
\
101+
done \
102+
'
103+
104+
if [ ! -s $LOG.ok ] ; then
105+
exit 1
106+
fi
107+
108+
eval `tail -n 1 $LOG.ok`
109+
cat $LOG.ok
110+
case $EC in
111+
0) echo "TRUE" ;;
112+
10) if [ "x$CEX_FILE" = x ] ; then process_graphml ; else process_graphml > $CEX_FILE ; fi ; parse_result ;;
113+
*) echo "UNKNOWN" ;;
114+
esac
115+
exit $EC
116+

0 commit comments

Comments
 (0)