Skip to content

Commit 5a1dec1

Browse files
authored
Merge pull request #7310 from tautschnig/bugfixes/7308-smt-trace
SMT back-end: Extend trace value evaluation
2 parents b47a7b2 + f89af9d commit 5a1dec1

File tree

7 files changed

+43
-18
lines changed

7 files changed

+43
-18
lines changed

regression/cbmc/Empty_struct3/main.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <assert.h>
2+
3+
struct Unit
4+
{
5+
};
6+
7+
int main()
8+
{
9+
struct Unit var_0;
10+
int x;
11+
int y = x;
12+
assert(0);
13+
assert(y == x);
14+
return 0;
15+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.c
3+
--json-ui
4+
VERIFICATION FAILED
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
--
8+
^warning: ignoring

regression/cbmc/trace-values/trace-values.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
trace-values.c
33
--trace
44
^EXIT=10$

regression/cbmc/trace_options_json_extended/extended.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
test.c
33
--trace --json-ui --trace-json-extended
44
^EXIT=10$

regression/cbmc/trace_options_json_extended/non-extended.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE
22
test.c
33
--trace --json-ui
44
^EXIT=10$

regression/validate-trace-xml-schema/check.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
# this uses json-ui (fails for a different reason actually, but should also
5757
# fail because of command line incompatibility)
5858
['json1', 'test.desc'],
59+
['Empty_struct3', 'test.desc'],
5960
# uses show-goto-functions
6061
['reachability-slice', 'test.desc'],
6162
['reachability-slice', 'test2.desc'],

src/solvers/smt2/smt2_conv.cpp

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,6 @@ exprt smt2_convt::get(const exprt &expr) const
296296
if(it!=identifier_map.end())
297297
return it->second.value;
298298
}
299-
else if(expr.id()==ID_member)
300-
{
301-
const member_exprt &member_expr=to_member_expr(expr);
302-
exprt tmp=get(member_expr.struct_op());
303-
if(tmp.is_nil())
304-
return nil_exprt();
305-
return member_exprt(tmp, member_expr.get_component_name(), expr.type());
306-
}
307299
else if(expr.id() == ID_literal)
308300
{
309301
auto l = to_literal_expr(expr).get_literal();
@@ -320,16 +312,23 @@ exprt smt2_convt::get(const exprt &expr) const
320312
else if(op.is_false())
321313
return true_exprt();
322314
}
323-
else if(expr.is_constant())
315+
else if(
316+
expr.is_constant() || expr.id() == ID_empty_union ||
317+
(!expr.has_operands() && (expr.id() == ID_struct || expr.id() == ID_array)))
318+
{
324319
return expr;
325-
else if(const auto &array = expr_try_dynamic_cast<array_exprt>(expr))
320+
}
321+
else if(expr.has_operands())
326322
{
327-
exprt array_copy = *array;
328-
for(auto &element : array_copy.operands())
323+
exprt copy = expr;
324+
for(auto &op : copy.operands())
329325
{
330-
element = get(element);
326+
exprt eval_op = get(op);
327+
if(eval_op.is_nil())
328+
return nil_exprt{};
329+
op = std::move(eval_op);
331330
}
332-
return array_copy;
331+
return copy;
333332
}
334333

335334
return nil_exprt();
@@ -4793,7 +4792,9 @@ void smt2_convt::set_to(const exprt &expr, bool value)
47934792
const irep_idt &identifier=
47944793
to_symbol_expr(equal_expr.lhs()).get_identifier();
47954794

4796-
if(identifier_map.find(identifier)==identifier_map.end())
4795+
if(
4796+
identifier_map.find(identifier) == identifier_map.end() &&
4797+
equal_expr.lhs() != equal_expr.rhs())
47974798
{
47984799
identifiert &id=identifier_map[identifier];
47994800
CHECK_RETURN(id.type.is_nil());

0 commit comments

Comments
 (0)