Skip to content

Commit df41607

Browse files
committed
Write through a value-set-pointer
Tests determinate and indeterminate write through a pointer
1 parent 62e5320 commit df41607

File tree

11 files changed

+101
-1
lines changed

11 files changed

+101
-1
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include <assert.h>
2+
3+
int main()
4+
{
5+
int unknown;
6+
int a = 10;
7+
int b = 10;
8+
int *p = &a;
9+
10+
if(unknown)
11+
{
12+
b = 15;
13+
*p = 15;
14+
}
15+
16+
assert(*p == b);
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--verify --variable-sensitivity --vsd-values intervals --vsd-pointers constants
4+
^\[main.assertion.1\] line 16 assertion \*p == b: SUCCESS
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--verify --variable-sensitivity --vsd-values intervals --vsd-pointers top-bottom
4+
^\[main.assertion.1\] line 16 assertion \*p == b: UNKNOWN
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--verify --variable-sensitivity --vsd-values intervals --vsd-pointers value-set
4+
^\[main.assertion.1\] line 16 assertion \*p == b: SUCCESS
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <assert.h>
2+
3+
int main()
4+
{
5+
int a = 10;
6+
int *p = &a;
7+
8+
*p = 15;
9+
10+
assert(a == 15);
11+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--verify --variable-sensitivity --vsd-pointers constants
4+
^\[main.assertion.1\] line 10 assertion a == 15: SUCCESS
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--verify --variable-sensitivity --vsd-pointers top-bottom
4+
^\[main.assertion.1\] line 10 assertion a == 15: UNKNOWN
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--verify --variable-sensitivity --vsd-pointers value-set
4+
^\[main.assertion.1\] line 10 assertion a == 15: SUCCESS
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--

src/analyses/variable-sensitivity/abstract_pointer_object.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class abstract_pointer_objectt : public abstract_objectt,
7373
const abstract_environmentt &env,
7474
const namespacet &ns) const;
7575

76-
protected:
7776
/// Evaluate writing to a pointer's value. More precise abstractions
7877
/// may override this provide more precise results.
7978
///

src/analyses/variable-sensitivity/value_set_pointer_abstract_object.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,30 @@ abstract_object_pointert value_set_pointer_abstract_objectt::read_dereference(
115115
return results.first();
116116
}
117117

118+
abstract_object_pointert value_set_pointer_abstract_objectt::write_dereference(
119+
abstract_environmentt &environment,
120+
const namespacet &ns,
121+
const std::stack<exprt> &stack,
122+
const abstract_object_pointert &new_value,
123+
bool merging_write) const
124+
{
125+
if(is_top() || is_bottom())
126+
{
127+
return abstract_pointer_objectt::write_dereference(
128+
environment, ns, stack, new_value, merging_write);
129+
}
130+
131+
for(auto value : values)
132+
{
133+
auto pointer =
134+
std::dynamic_pointer_cast<const abstract_pointer_objectt>(value);
135+
pointer->write_dereference(
136+
environment, ns, stack, new_value, merging_write);
137+
}
138+
139+
return shared_from_this();
140+
}
141+
118142
abstract_object_pointert value_set_pointer_abstract_objectt::resolve_new_values(
119143
const abstract_object_sett &new_values,
120144
const abstract_environmentt &environment) const

src/analyses/variable-sensitivity/value_set_pointer_abstract_object.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ class value_set_pointer_abstract_objectt : public abstract_pointer_objectt,
5757
const abstract_environmentt &env,
5858
const namespacet &ns) const override;
5959

60+
abstract_object_pointert write_dereference(
61+
abstract_environmentt &environment,
62+
const namespacet &ns,
63+
const std::stack<exprt> &stack,
64+
const abstract_object_pointert &new_value,
65+
bool merging_write) const override;
66+
6067
void output(std::ostream &out, const ai_baset &ai, const namespacet &ns)
6168
const override;
6269

0 commit comments

Comments
 (0)