Skip to content

Commit e28beab

Browse files
author
Daniel Kroening
committed
smt2_solver: implement array operators
1 parent 5adf584 commit e28beab

File tree

5 files changed

+54
-61
lines changed

5 files changed

+54
-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: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,31 @@ exprt smt2_parsert::function_application()
658658
{
659659
return binary(ID_implies, op);
660660
}
661+
else if(id == "select")
662+
{
663+
// array index
664+
if(op.size() != 2)
665+
throw error("select takes two operands");
666+
667+
if(op[0].type().id() != ID_array)
668+
throw error("select expects array operand");
669+
670+
return index_exprt(op[0], op[1]);
671+
}
672+
else if(id == "store")
673+
{
674+
// array update
675+
if(op.size() != 3)
676+
throw error("store takes three operands");
677+
678+
if(op[0].type().id() != ID_array)
679+
throw error("store expects array operand");
680+
681+
if(to_array_type(op[0].type()).subtype() != op[2].type())
682+
throw error("store expects value that matches array element type");
683+
684+
return with_exprt(op[0], op[1], op[2]);
685+
}
661686
else
662687
{
663688
// rummage through id_map
@@ -958,10 +983,7 @@ typet smt2_parsert::sort()
958983
// we can turn arrays that map an unsigned bitvector type
959984
// to something else into our 'array_typet'
960985
if(domain.id() == ID_unsignedbv)
961-
{
962-
const auto size = to_unsignedbv_type(domain).largest_expr();
963-
return array_typet(range, size);
964-
}
986+
return array_typet(range, infinity_exprt(domain));
965987
else
966988
throw error("unsupported array sort");
967989
}

0 commit comments

Comments
 (0)