Skip to content

Commit 689df79

Browse files
committed
Typecasting value-set of pointers needs to propagate down
1 parent 786e2a2 commit 689df79

File tree

5 files changed

+38
-7
lines changed

5 files changed

+38
-7
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--variable-sensitivity --vsd-pointers value-set --vsd-arrays every-element --verify
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
\[main.assertion.1\] .*p\[.*0\] == 10: SUCCESS
7+
\[main.assertion.2\] .*p\[.*1\] == 20: SUCCESS
8+
\[main.assertion.3\] .*q\[.*0\] == 100: SUCCESS
9+
\[main.assertion.4\] .*q\[.*99\] == 101: SUCCESS
10+
--
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--variable-sensitivity --vsd-pointers value-set --vsd-arrays every-element --verify
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
\[main.assertion.1\] .*alias == 99: SUCCESS
7+
\[main.assertion.2\] .*alias == 100: SUCCESS
8+
\[main.assertion.3\] .*i_was_malloced\[.*0\] == 101: SUCCESS
9+
\[main.assertion.4\] .*alias\[.*1\] == 102: SUCCESS
10+
--

regression/goto-analyzer/heap-allocation/test-value-set-pointers.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ main.c
33
--variable-sensitivity --vsd-pointers value-set --show
44
^EXIT=0$
55
^SIGNAL=0$
6-
main::1::p \(\) -> value-set-begin: ptr ->\(heap-allocation-0\) :value-set-end
7-
main::1::q \(\) -> value-set-begin: ptr ->\(heap-allocation-1\) :value-set-end
6+
main::1::p \(\) -> value-set-begin: ptr ->\(heap-allocation-0\[0\]\) :value-set-end
7+
main::1::q \(\) -> value-set-begin: ptr ->\(heap-allocation-1\[0\]\) :value-set-end
88
--

src/analyses/variable-sensitivity/value_set_pointer_abstract_object.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ value_set_pointer_abstract_objectt::value_set_pointer_abstract_objectt(
3434

3535
value_set_pointer_abstract_objectt::value_set_pointer_abstract_objectt(
3636
const typet &new_type,
37-
const value_set_pointer_abstract_objectt &old)
38-
: abstract_pointer_objectt(new_type, old.is_top(), old.is_bottom()),
39-
values(old.values)
37+
bool top,
38+
bool bottom,
39+
const abstract_object_sett &new_values)
40+
: abstract_pointer_objectt(new_type, top, bottom), values(new_values)
4041
{
4142
}
4243

@@ -111,7 +112,15 @@ abstract_object_pointert value_set_pointer_abstract_objectt::typecast(
111112
const namespacet &ns) const
112113
{
113114
INVARIANT(is_void_pointer(type()), "Only allow pointer casting from void*");
114-
return std::make_shared<value_set_pointer_abstract_objectt>(new_type, *this);
115+
abstract_object_sett new_values;
116+
for(auto value : values)
117+
{
118+
auto pointer =
119+
std::dynamic_pointer_cast<const abstract_pointer_objectt>(value);
120+
new_values.insert(pointer->typecast(new_type, environment, ns));
121+
}
122+
return std::make_shared<value_set_pointer_abstract_objectt>(
123+
new_type, is_top(), is_bottom(), new_values);
115124
}
116125

117126
abstract_object_pointert value_set_pointer_abstract_objectt::resolve_values(

src/analyses/variable-sensitivity/value_set_pointer_abstract_object.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ class value_set_pointer_abstract_objectt : public abstract_pointer_objectt,
2424

2525
value_set_pointer_abstract_objectt(
2626
const typet &new_type,
27-
const value_set_pointer_abstract_objectt &old);
27+
bool top,
28+
bool bottom,
29+
const abstract_object_sett &new_values);
2830

2931
/// \copydoc abstract_objectt::abstract_objectt(const typet &, bool, bool)
3032
value_set_pointer_abstract_objectt(const typet &type, bool top, bool bottom);

0 commit comments

Comments
 (0)