Skip to content

Commit be0c338

Browse files
author
Daniel Kroening
committed
smt2 parser: check type of body of function definition
1 parent 457e405 commit be0c338

File tree

6 files changed

+63
-0
lines changed

6 files changed

+63
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
function-application1.smt2
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^unsat$
7+
--
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
(set-logic QF_BV)
2+
3+
(define-fun min ((a (_ BitVec 8)) (b (_ BitVec 8))) (_ BitVec 8)
4+
(ite (bvule a b) a b))
5+
6+
(define-fun p1 () Bool (= (min #x01 #x02) #x01))
7+
(define-fun p2 () Bool (= (min #xff #xfe) #xfe))
8+
9+
; all must be true
10+
11+
(assert (not (and p1 p2)))
12+
13+
(check-sat)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
function-application2.smt2
3+
4+
^EXIT=134$
5+
^SIGNAL=0$
6+
^line 5: type mismatch in function definition: expected `\(_ BitVec 16\)' but got `\(_ BitVec 8\)'$
7+
--
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
(set-logic QF_BV)
2+
3+
; the range type doesn't match!
4+
(define-fun min ((a (_ BitVec 8)) (b (_ BitVec 8))) (_ BitVec 16)
5+
(ite (bvule a b) a b))
6+
7+
(define-fun p1 () Bool (= (min #x01 #x02) #x01))
8+
(define-fun p2 () Bool (= (min #xff #xfe) #xfe))
9+
10+
; all must be true
11+
12+
(assert (not (and p1 p2)))
13+
14+
(check-sat)

scripts/delete_failing_smt2_solver_tests

+2
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,14 @@ rm Float8/test.desc
5858
rm Free2/test.desc
5959
rm Function1/test.desc
6060
rm Function_Pointer3/test.desc
61+
rm Initialization6/test.desc
6162
rm Linking4/test.desc
6263
rm Linking7/test.desc
6364
rm Malloc17/test.desc
6465
rm Malloc18/test.desc
6566
rm Malloc19/test.desc
6667
rm Malloc20/test.desc
68+
rm Malloc21/test.desc
6769
rm Malloc23/test.desc
6870
rm Malloc24/test.desc
6971
rm Memmove1/test.desc

src/solvers/smt2/smt2_parser.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,26 @@ void smt2_parsert::command(const std::string &c)
12031203
auto signature=function_signature_definition();
12041204
exprt body=expression();
12051205

1206+
// check type of body
1207+
if(signature.id() == ID_mathematical_function)
1208+
{
1209+
const auto &f_signature = to_mathematical_function_type(signature);
1210+
if(body.type() != f_signature.codomain())
1211+
{
1212+
error() << "type mismatch in function definition: expected `"
1213+
<< smt2_format(f_signature.codomain()) << "' but got `"
1214+
<< smt2_format(body.type()) << '\'' << eom;
1215+
return;
1216+
}
1217+
}
1218+
else if(body.type() != signature)
1219+
{
1220+
error() << "type mismatch in function definition: expected `"
1221+
<< smt2_format(signature) << "' but got `"
1222+
<< smt2_format(body.type()) << '\'' << eom;
1223+
return;
1224+
}
1225+
12061226
// set up the entry
12071227
auto &entry=id_map[id];
12081228
entry.type=signature;

0 commit comments

Comments
 (0)