Skip to content

Commit 0a21a31

Browse files
authored
Merge pull request #3570 from smowton/smowton/fix/value-set-member-type-safety
Fix value-set make_member function
2 parents ffb3f61 + 8d88c97 commit 0a21a31

File tree

5 files changed

+17
-34
lines changed

5 files changed

+17
-34
lines changed
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
KNOWNBUG
1+
CORE
22
main.c
33
module2.c
44
^EXIT=10$
55
^SIGNAL=0$
66
^VERIFICATION FAILED$
7+
line 21 assertion \*g\.a == 42: SUCCESS
8+
line 22 assertion \*g\.c == 41: FAILURE
79
^\*\* 1 of 2 failed
810
--
911
^warning: ignoring
10-
--
11-
This is either a bug in goto-symex or value_sett (where the invariant fails).

regression/cbmc/Linking7/test.desc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ module.c
55
^SIGNAL=0$
66
^VERIFICATION FAILED$
77
^\*\* 1 of 2 failed
8+
line 21 assertion \*g\.a == 42: SUCCESS
9+
line 22 assertion \*g\.b == 41: FAILURE
810
--
911
^warning: ignoring

scripts/delete_failing_smt2_solver_tests

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ rm Float6/test.desc
3636
rm Float8/test.desc
3737
rm Linking4/test.desc
3838
rm Linking7/test.desc
39+
rm Linking7/member-name-mismatch.desc
3940
rm Malloc19/test.desc
4041
rm Malloc23/test.desc
4142
rm Malloc24/test.desc

src/pointer-analysis/value_set.cpp

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,37 +1630,10 @@ exprt value_sett::make_member(
16301630
const struct_union_typet &struct_union_type=
16311631
to_struct_union_type(ns.follow(src.type()));
16321632

1633-
if(src.id()==ID_struct ||
1634-
src.id()==ID_constant)
1635-
{
1636-
std::size_t no=struct_union_type.component_number(component_name);
1637-
assert(no<src.operands().size());
1638-
return src.operands()[no];
1639-
}
1640-
else if(src.id()==ID_with)
1641-
{
1642-
assert(src.operands().size()==3);
1643-
1644-
// see if op1 is the member we want
1645-
const exprt &member_operand=src.op1();
1646-
1647-
if(component_name==member_operand.get(ID_component_name))
1648-
// yes! just take op2
1649-
return src.op2();
1650-
else
1651-
// no! do this recursively
1652-
return make_member(src.op0(), component_name, ns);
1653-
}
1654-
else if(src.id()==ID_typecast)
1655-
{
1656-
// push through typecast
1657-
assert(src.operands().size()==1);
1658-
return make_member(src.op0(), component_name, ns);
1659-
}
1660-
1661-
// give up
16621633
const typet &subtype = struct_union_type.component_type(component_name);
1663-
member_exprt member_expr(src, component_name, subtype);
1634+
exprt member_expr = member_exprt(src, component_name, subtype);
1635+
1636+
simplify(member_expr, ns);
16641637

1665-
return std::move(member_expr);
1638+
return member_expr;
16661639
}

src/util/pointer_offset_size.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,13 @@ exprt get_subexpression_at_offset(
655655
return result;
656656
}
657657

658+
if(
659+
offset_bytes == 0 && expr.type().id() == ID_pointer &&
660+
target_type_raw.id() == ID_pointer)
661+
{
662+
return typecast_exprt(expr, target_type_raw);
663+
}
664+
658665
const typet &source_type = ns.follow(expr.type());
659666
const auto target_size_bits = pointer_offset_bits(target_type_raw, ns);
660667
if(!target_size_bits.has_value())

0 commit comments

Comments
 (0)