Skip to content

Commit ced2d39

Browse files
authored
Merge pull request diffblue#5825 from jezhiggins/vsd-value-set-of-pointers
Vsd value set of pointers
2 parents e317683 + df41607 commit ced2d39

37 files changed

+724
-342
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include <assert.h>
2+
3+
int main()
4+
{
5+
int unknown;
6+
int a = 10;
7+
8+
int *p = &a;
9+
10+
if(unknown)
11+
a = 15;
12+
13+
int q = *p;
14+
15+
assert(q == a);
16+
}
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 15 assertion q == a: 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 15 assertion q == a: 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 15 assertion q == a: 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+
int q = *p;
9+
10+
assert(q == a);
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 q == a: 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 q == a: 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 q == a: SUCCESS
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
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+
--

scripts/expected_doxygen_warnings.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,6 @@ warning: Included by graph for 'pointer_expr.h' not generated, too many nodes (1
9696
warning: Included by graph for 'prefix.h' not generated, too many nodes (86), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
9797
warning: Included by graph for 'simplify_expr.h' not generated, too many nodes (77), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
9898
warning: Included by graph for 'std_code.h' not generated, too many nodes (78), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
99-
warning: Included by graph for 'std_expr.h' not generated, too many nodes (245), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
100-
warning: Included by graph for 'std_types.h' not generated, too many nodes (122), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
99+
warning: Included by graph for 'std_expr.h' not generated, too many nodes (244), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
100+
warning: Included by graph for 'std_types.h' not generated, too many nodes (121), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.
101101
warning: Included by graph for 'symbol_table.h' not generated, too many nodes (95), threshold is 60. Consider increasing DOT_GRAPH_MAX_NODES.

src/analyses/Makefile

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,29 @@ SRC = ai.cpp \
3333
static_analysis.cpp \
3434
uncaught_exceptions_analysis.cpp \
3535
uninitialized_domain.cpp \
36-
variable-sensitivity/abstract_object.cpp \
3736
variable-sensitivity/abstract_environment.cpp \
37+
variable-sensitivity/abstract_object.cpp \
38+
variable-sensitivity/abstract_object_set.cpp \
39+
variable-sensitivity/abstract_pointer_object.cpp \
3840
variable-sensitivity/abstract_value_object.cpp \
3941
variable-sensitivity/constant_abstract_value.cpp \
4042
variable-sensitivity/constant_pointer_abstract_object.cpp \
4143
variable-sensitivity/context_abstract_object.cpp \
42-
variable-sensitivity/write_location_context.cpp \
43-
variable-sensitivity/pointer_abstract_object.cpp \
44-
variable-sensitivity/variable_sensitivity_domain.cpp \
45-
variable-sensitivity/variable_sensitivity_object_factory.cpp \
46-
variable-sensitivity/full_struct_abstract_object.cpp \
47-
variable-sensitivity/full_array_abstract_object.cpp \
48-
variable-sensitivity/write_stack.cpp \
49-
variable-sensitivity/write_stack_entry.cpp \
5044
variable-sensitivity/data_dependency_context.cpp \
51-
variable-sensitivity/value_set_abstract_object.cpp \
52-
variable-sensitivity/variable_sensitivity_dependence_graph.cpp \
45+
variable-sensitivity/full_array_abstract_object.cpp \
46+
variable-sensitivity/full_struct_abstract_object.cpp \
5347
variable-sensitivity/interval_abstract_value.cpp \
48+
variable-sensitivity/three_way_merge_abstract_interpreter.cpp \
5449
variable-sensitivity/value_set_abstract_object.cpp \
5550
variable-sensitivity/value_set_abstract_value.cpp \
5651
variable-sensitivity/value_set_pointer_abstract_object.cpp \
57-
variable-sensitivity/three_way_merge_abstract_interpreter.cpp \
5852
variable-sensitivity/variable_sensitivity_configuration.cpp \
53+
variable-sensitivity/variable_sensitivity_dependence_graph.cpp \
54+
variable-sensitivity/variable_sensitivity_domain.cpp \
55+
variable-sensitivity/variable_sensitivity_object_factory.cpp \
56+
variable-sensitivity/write_location_context.cpp \
57+
variable-sensitivity/write_stack.cpp \
58+
variable-sensitivity/write_stack_entry.cpp \
5959
# Empty last line
6060

6161
INCLUDES= -I ..

src/analyses/variable-sensitivity/abstract_environment.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#include <analyses/variable-sensitivity/abstract_object.h>
1212
#include <analyses/variable-sensitivity/abstract_object_statistics.h>
1313
#include <analyses/variable-sensitivity/constant_abstract_value.h>
14-
#include <analyses/variable-sensitivity/pointer_abstract_object.h>
1514
#include <analyses/variable-sensitivity/two_value_array_abstract_object.h>
15+
#include <analyses/variable-sensitivity/two_value_pointer_abstract_object.h>
1616
#include <analyses/variable-sensitivity/two_value_struct_abstract_object.h>
1717
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
1818
#include <util/pointer_expr.h>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*******************************************************************\
2+
3+
Module: analyses variable-sensitivity
4+
5+
Author: Jez Higgins, [email protected]
6+
7+
\*******************************************************************/
8+
9+
#include <analyses/variable-sensitivity/abstract_object_set.h>
10+
#include <util/string_utils.h>
11+
12+
static bool by_length(const std::string &lhs, const std::string &rhs)
13+
{
14+
if(lhs.size() < rhs.size())
15+
return true;
16+
if(lhs.size() > rhs.size())
17+
return false;
18+
return lhs < rhs;
19+
}
20+
21+
void abstract_object_sett::output(
22+
std::ostream &out,
23+
const ai_baset &ai,
24+
const namespacet &ns) const
25+
{
26+
std::vector<std::string> output_values;
27+
for(const auto &value : values)
28+
{
29+
std::ostringstream ss;
30+
value->output(ss, ai, ns);
31+
output_values.emplace_back(ss.str());
32+
}
33+
std::sort(output_values.begin(), output_values.end(), by_length);
34+
35+
join_strings(out, output_values.begin(), output_values.end(), ", ");
36+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*******************************************************************\
2+
3+
Module: analyses variable-sensitivity
4+
5+
Author: Jez Higgins, [email protected]
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// an unordered set of value objects
11+
12+
#ifndef CBMC_ABSTRACT_OBJECT_SET_H
13+
#define CBMC_ABSTRACT_OBJECT_SET_H
14+
15+
#include <analyses/variable-sensitivity/abstract_value_object.h>
16+
#include <unordered_set>
17+
18+
class abstract_object_sett
19+
{
20+
public:
21+
using value_sett = std::unordered_set<
22+
abstract_object_pointert,
23+
abstract_hashert,
24+
abstract_equalert>;
25+
using const_iterator = value_sett::const_iterator;
26+
using value_type = value_sett::value_type;
27+
using size_type = value_sett::size_type;
28+
29+
void insert(const abstract_object_pointert &o)
30+
{
31+
values.insert(o);
32+
}
33+
void insert(abstract_object_pointert &&o)
34+
{
35+
values.insert(std::move(o));
36+
}
37+
void insert(const abstract_object_sett &rhs)
38+
{
39+
values.insert(rhs.begin(), rhs.end());
40+
}
41+
42+
abstract_object_pointert first() const
43+
{
44+
return *begin();
45+
}
46+
47+
const_iterator begin() const
48+
{
49+
return values.begin();
50+
}
51+
const_iterator end() const
52+
{
53+
return values.end();
54+
}
55+
56+
value_sett::size_type size() const
57+
{
58+
return values.size();
59+
}
60+
bool empty() const
61+
{
62+
return values.empty();
63+
}
64+
65+
bool operator==(const abstract_object_sett &rhs) const
66+
{
67+
return values == rhs.values;
68+
}
69+
70+
void
71+
output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const;
72+
73+
private:
74+
value_sett values;
75+
};
76+
77+
class value_set_tag
78+
{
79+
public:
80+
virtual const abstract_object_sett &get_values() const = 0;
81+
};
82+
83+
#endif //CBMC_ABSTRACT_OBJECT_SET_H

0 commit comments

Comments
 (0)