Skip to content

Commit 1a6a422

Browse files
committed
vsp = nondet ? malloc(a) : malloc(b) works correctly
1 parent dfa0154 commit 1a6a422

File tree

10 files changed

+48
-13
lines changed

10 files changed

+48
-13
lines changed
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11

2-
int main() {
3-
int* q = malloc(10);
4-
int* r = malloc(10);
2+
int main()
3+
{
4+
int *q = malloc(10);
5+
int *r = malloc(10);
56

67
int *p = r;
7-
if (nondet())
8+
if(nondet())
89
p = q;
910
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

2-
int main() {
2+
int main()
3+
{
34
int *p = malloc(10);
4-
if (nondet())
5+
if(nondet())
56
++p;
67
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11

2-
int main() {
2+
int main()
3+
{
34
int *q = malloc(10);
45
int r[10];
56

67
int *p = r;
7-
if (nondet())
8+
if(nondet())
89
p = q;
910
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11

2-
int main() {
2+
int main()
3+
{
34
int *q = malloc(10);
45
int r[10];
56

67
int *p = q;
7-
if (nondet())
8+
if(nondet())
89
p = r;
910
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
int main()
3+
{
4+
int *p = malloc(10);
5+
6+
if(non_det())
7+
p = malloc(20);
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--variable-sensitivity --vsd-pointers value-set --show
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::p \(\) -> value-set-begin: ptr ->\(heap-allocation-0\[0\]\), ptr ->\(heap-allocation-1\[0\]\) :value-set-end
7+
--
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
int main()
3+
{
4+
int *p = nondet() ? malloc(10) : malloc(20);
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
main.c
3+
--variable-sensitivity --vsd-pointers value-set --show
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::p \(\) -> value-set-begin: ptr ->\(heap-allocation-0\[0\]\), ptr ->\(heap-allocation-1\[0\]\) :value-set-end
7+
--

regression/goto-analyzer/heap-allocation-write-2/main.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11

2-
int main() {
2+
int main()
3+
{
34
int *p = malloc(sizeof(int) * 5);
4-
int* q = malloc(sizeof(int) * 10);
5+
int *q = malloc(sizeof(int) * 10);
56

6-
int* pp = p;
7+
int *pp = p;
78

89
*p = 10;
910
++p;

src/analyses/variable-sensitivity/value_set_pointer_abstract_object.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ abstract_object_pointert value_set_pointer_abstract_objectt::typecast(
115115
abstract_object_sett new_values;
116116
for(auto value : values)
117117
{
118+
if(value->is_top()) // multiple mallocs in the same scope can cause spurious
119+
continue; // TOP values, which we can safely strip out during the cast
120+
118121
auto pointer =
119122
std::dynamic_pointer_cast<const abstract_pointer_objectt>(value);
120123
new_values.insert(pointer->typecast(new_type, environment, ns));

0 commit comments

Comments
 (0)