Skip to content

Commit 8a6e9d2

Browse files
author
Daniel Kroening
authored
Merge pull request #3521 from diffblue/smt2_solver_arrays
smt2_solver: arrays
2 parents b4cd9cc + e62c0ea commit 8a6e9d2

File tree

6 files changed

+93
-61
lines changed

6 files changed

+93
-61
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
arrays1.smt2
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^sat$
7+
^\(\(array2 \(store .* \(_ bv1 16\) \(_ bv16 8\)\)\)\)$
8+
--
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
(set-logic QF_ABV)
2+
3+
(declare-const array1 (Array (_ BitVec 16) (_ BitVec 8)))
4+
(define-const array2 (Array (_ BitVec 16) (_ BitVec 8)) (store array1 #x0001 #x10))
5+
6+
(check-sat)
7+
(get-value (array2))

scripts/delete_failing_smt2_solver_tests

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
cd regression/cbmc
44
rm Anonymous_Struct3/test.desc
5-
rm Array_Initialization2/test.desc
65
rm Array_operations1/test.desc
76
rm Bitfields1/test.desc
87
rm Bitfields3/test.desc
9-
rm Boolean_Guards1/test.desc
10-
rm Computed-Goto1/test.desc
118
rm Empty_struct1/test.desc
129
rm Endianness4/test.desc
1310
rm Endianness6/test.desc
@@ -39,35 +36,19 @@ rm Float4/test.desc
3936
rm Float5/test.desc
4037
rm Float6/test.desc
4138
rm Float8/test.desc
42-
rm Function1/test.desc
43-
rm Initialization6/test.desc
4439
rm Linking4/test.desc
4540
rm Linking7/test.desc
46-
rm Local_out_of_scope3/test.desc
47-
rm Malloc17/test.desc
48-
rm Malloc18/test.desc
4941
rm Malloc19/test.desc
50-
rm Malloc21/test.desc
5142
rm Malloc23/test.desc
5243
rm Malloc24/test.desc
5344
rm Memory_leak2/test.desc
54-
rm Multi_Dimensional_Array1/test.desc
5545
rm Multi_Dimensional_Array2/test.desc
56-
rm Multi_Dimensional_Array3/test.desc
57-
rm Multi_Dimensional_Array4/test.desc
58-
rm Multi_Dimensional_Array6/test.desc
5946
rm Overflow_Leftshift1/test.desc
6047
rm Overflow_Multiplication1/test.desc
6148
rm Overflow_Subtraction1/test.desc
62-
rm Pointer_Arithmetic1/test.desc
6349
rm Pointer_Arithmetic10/test.desc
6450
rm Pointer_Arithmetic11/test.desc
6551
rm Pointer_Arithmetic12/test.desc
66-
rm Pointer_Arithmetic6/test.desc
67-
rm Pointer_array3/test.desc
68-
rm Pointer_array4/test.desc
69-
rm Pointer_array5/test.desc
70-
rm Pointer_array6/test.desc
7152
rm Pointer_byte_extract2/test.desc
7253
rm Pointer_byte_extract3/test.desc
7354
rm Pointer_byte_extract4/test.desc
@@ -76,34 +57,22 @@ rm Pointer_byte_extract5/test.desc
7657
rm Pointer_byte_extract7/test.desc
7758
rm Pointer_byte_extract9/test.desc
7859
rm Promotion3/test.desc
79-
rm Promotion4/test.desc
8060
rm Quantifiers-assertion/test.desc
8161
rm Quantifiers-assignment/test.desc
82-
rm Quantifiers-copy/test.desc
8362
rm Quantifiers-if/test.desc
84-
rm Quantifiers-initialisation/test.desc
8563
rm Quantifiers-initialisation2/test.desc
8664
rm Quantifiers-invalid-var-range/test.desc
8765
rm Quantifiers-not/test.desc
8866
rm Quantifiers-not-exists/test.desc
8967
rm Quantifiers-two-dimension-array/test.desc
9068
rm Quantifiers-type/test.desc
91-
rm Quantifiers1/test.desc
92-
rm String2/test.desc
93-
rm Struct_Bytewise1/test.desc
9469
rm Struct_Bytewise2/test.desc
95-
rm Struct_Initialization2/test.desc
96-
rm Struct_Padding1/test.desc
9770
rm Typecast1/test.desc
9871
rm Union_Initialization1/test.desc
99-
rm Unwinding_Locality1/test.desc
10072
rm address_space_size_limit1/test.desc
10173
rm address_space_size_limit3/test.desc
102-
rm argv1/test.desc
10374
rm array-tests/test.desc
104-
rm big-endian-array1/test.desc
10575
rm bounds_check1/test.desc
106-
rm byte_update1/test.desc
10776
rm byte_update2/test.desc
10877
rm byte_update3/test.desc
10978
rm byte_update4/test.desc
@@ -114,61 +83,35 @@ rm byte_update8/test.desc
11483
rm byte_update9/test.desc
11584
rm compact-trace/test.desc
11685
rm dynamic_size1/stack_object.desc
117-
rm equality_through_array1/test.desc
118-
rm equality_through_array2/test.desc
119-
rm equality_through_array3/test.desc
120-
rm equality_through_array4/test.desc
121-
rm equality_through_array5/test.desc
122-
rm equality_through_array6/test.desc
123-
rm equality_through_array_of_struct1/test.desc
124-
rm equality_through_array_of_struct2/test.desc
125-
rm equality_through_array_of_struct3/test.desc
126-
rm equality_through_array_of_struct4/test.desc
12786
rm equality_through_struct_containing_arrays1/test.desc
12887
rm equality_through_struct_containing_arrays2/test.desc
12988
rm equality_through_union1/test.desc
13089
rm equality_through_union2/test.desc
13190
rm equality_through_union3/test.desc
13291
rm gcc_bswap1/test.desc
133-
rm gcc_c99-bool-1/test.desc
134-
rm gcc_statement_expression4/test.desc
13592
rm gcc_vector1/test.desc
136-
rm gcc_vector2/test.desc
13793
rm graphml_witness1/test.desc
138-
rm havoc_object1/test.desc
139-
rm little-endian-array1/test.desc
140-
rm memcpy/memcpy4.desc
14194
rm memory_allocation1/test.desc
142-
rm memset1/test.desc
143-
rm mm_io1/test.desc
144-
rm no_nondet_static/test.desc
145-
rm null1/test.desc
14695
rm pointer-function-parameters-struct-mutual-recursion/test.desc
14796
rm pointer-function-parameters-struct-simple-recursion/test.desc
14897
rm pointer-function-parameters-struct-simple-recursion-2/test.desc
14998
rm pointer-function-parameters-struct-simple-recursion-3/test.desc
15099
rm scanf1/test.desc
151-
rm simple_assert/test.desc
152100
rm stack-trace/test.desc
153101
rm struct10/test.desc
154102
rm struct6/test.desc
155103
rm struct7/test.desc
156104
rm struct9/test.desc
157105
rm trace-values/trace-values.desc
158106
rm trace_address_arithmetic1/test.desc
159-
rm trace_options_json_extended/extended.desc
160-
rm trace_options_json_extended/non-extended.desc
161107
rm trace_show_function_calls/test.desc
162-
rm uniform_array1/test.desc
163108
rm union11/union_list.desc
164109
rm union5/test.desc
165110
rm union6/test.desc
166111
rm union7/test.desc
167112
rm union8/test.desc
168113
rm union9/test.desc
169-
rm unsigned___int128/test.desc
170114
rm variable-access-to-constant-array/test.desc
171115
rm void_pointer2/test.desc
172116
rm void_pointer3/test.desc
173117
rm void_pointer4/test.desc
174-
rm while1/test.desc

src/solvers/smt2/smt2_format.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ std::ostream &smt2_format_rec(std::ostream &out, const typet &type)
2222
out << "Int";
2323
else if(type.id() == ID_real)
2424
out << "Real";
25+
else if(type.id() == ID_array)
26+
{
27+
const auto &array_type = to_array_type(type);
28+
out << "(Array " << smt2_format(array_type.size().type()) << ' '
29+
<< smt2_format(array_type.subtype()) << ')';
30+
}
2531
else
2632
out << "? " << type.id();
2733

@@ -87,6 +93,13 @@ std::ostream &smt2_format_rec(std::ostream &out, const exprt &expr)
8793
else
8894
out << identifier;
8995
}
96+
else if(expr.id() == ID_with && expr.type().id() == ID_array)
97+
{
98+
const auto &with_expr = to_with_expr(expr);
99+
out << "(store " << smt2_format(with_expr.old()) << ' '
100+
<< smt2_format(with_expr.where()) << ' '
101+
<< smt2_format(with_expr.new_value()) << ')';
102+
}
90103
else
91104
out << "? " << expr.id();
92105

src/solvers/smt2/smt2_parser.cpp

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,31 @@ exprt smt2_parsert::function_application()
644644
{
645645
return binary(ID_implies, op);
646646
}
647+
else if(id == "select")
648+
{
649+
// array index
650+
if(op.size() != 2)
651+
throw error("select takes two operands");
652+
653+
if(op[0].type().id() != ID_array)
654+
throw error("select expects array operand");
655+
656+
return index_exprt(op[0], op[1]);
657+
}
658+
else if(id == "store")
659+
{
660+
// array update
661+
if(op.size() != 3)
662+
throw error("store takes three operands");
663+
664+
if(op[0].type().id() != ID_array)
665+
throw error("store expects array operand");
666+
667+
if(to_array_type(op[0].type()).subtype() != op[2].type())
668+
throw error("store expects value that matches array element type");
669+
670+
return with_exprt(op[0], op[1], op[2]);
671+
}
647672
else
648673
{
649674
// rummage through id_map
@@ -944,10 +969,7 @@ typet smt2_parsert::sort()
944969
// we can turn arrays that map an unsigned bitvector type
945970
// to something else into our 'array_typet'
946971
if(domain.id() == ID_unsignedbv)
947-
{
948-
const auto size = to_unsignedbv_type(domain).largest_expr();
949-
return array_typet(range, size);
950-
}
972+
return array_typet(range, infinity_exprt(domain));
951973
else
952974
throw error("unsupported array sort");
953975
}
@@ -1089,6 +1111,38 @@ void smt2_parsert::command(const std::string &c)
10891111
entry.type = type;
10901112
entry.definition = nil_exprt();
10911113
}
1114+
else if(c == "define-const")
1115+
{
1116+
if(next_token() != SYMBOL)
1117+
throw error("expected a symbol after define-const");
1118+
1119+
const irep_idt id = buffer;
1120+
1121+
if(id_map.find(id) != id_map.end())
1122+
{
1123+
std::ostringstream msg;
1124+
msg << "identifier `" << id << "' defined twice";
1125+
throw error(msg.str());
1126+
}
1127+
1128+
const auto type = sort();
1129+
const auto value = expression();
1130+
1131+
// check type of value
1132+
if(value.type() != type)
1133+
{
1134+
std::ostringstream msg;
1135+
msg << "type mismatch in constant definition: expected `"
1136+
<< smt2_format(type) << "' but got `" << smt2_format(value.type())
1137+
<< '\'';
1138+
throw error(msg.str());
1139+
}
1140+
1141+
// create the entry
1142+
auto &entry = id_map[id];
1143+
entry.type = type;
1144+
entry.definition = value;
1145+
}
10921146
else if(c=="define-fun")
10931147
{
10941148
if(next_token()!=SYMBOL)

src/solvers/smt2/smt2_solver.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,13 @@ int solver(std::istream &in)
401401
message.error().source_location.set_line(error.get_line_no());
402402
message.error() << error.what() << messaget::eom;
403403
}
404+
catch(const analysis_exceptiont &error)
405+
{
406+
smt2_solver.skip_to_end_of_list();
407+
error_found = true;
408+
messaget message(message_handler);
409+
message.error() << error.what() << messaget::eom;
410+
}
404411
}
405412

406413
if(error_found)

0 commit comments

Comments
 (0)