Skip to content

Commit 10b07f8

Browse files
committed
Add nondet assignment to non-zero'd allocations in symex
1 parent 41d7a45 commit 10b07f8

File tree

12 files changed

+158
-2
lines changed

12 files changed

+158
-2
lines changed
Binary file not shown.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
public class PhiMergeUninitialized {
2+
3+
public int dynamicAllocationUninitialized(Boolean trigger) {
4+
5+
Ephemeral obj;
6+
if (trigger) {
7+
obj = new Ephemeral(42);
8+
} else {
9+
obj = new Aetherial(20);
10+
}
11+
12+
assert obj.val == 20;
13+
return obj.val;
14+
}
15+
16+
private Ephemeral local;
17+
18+
public int localUninitialized(Boolean trigger) {
19+
if (trigger) {
20+
local = new Ephemeral(42);
21+
} else {
22+
local = new Aetherial(50);
23+
}
24+
25+
assert local.val == 42;
26+
return local.val;
27+
}
28+
29+
private static Ephemeral staticLocal;
30+
31+
public int staticLocalUninitialized(Boolean trigger) {
32+
if (trigger) {
33+
staticLocal = new Ephemeral(42);
34+
} else {
35+
staticLocal = new Aetherial(76);
36+
}
37+
38+
assert staticLocal.val == 76;
39+
return staticLocal.val;
40+
}
41+
42+
class Ephemeral {
43+
Ephemeral(int value) {
44+
val = value;
45+
}
46+
47+
int val;
48+
}
49+
50+
class Aetherial extends Ephemeral {
51+
Aetherial(int value) {
52+
super(value);
53+
}
54+
}
55+
}
56+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
PhiMergeUninitialized.class
3+
--function PhiMergeUninitialized.dynamicAllocationUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*: (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0\)
9+
^.*\? (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
PhiMergeUninitialized.class
3+
--function PhiMergeUninitialized.localUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*: (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0\)
9+
^.*\? (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
PhiMergeUninitialized.class
3+
--function PhiMergeUninitialized.staticLocalUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*: (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0\)
9+
^.*\? (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
test.c
3+
--function dynamicAllocationUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*: (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0\)
9+
^.*\? (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
test.c
3+
--function staticLocalUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*: (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0\)
9+
^.*\? (dynamic_object|new_tmp[0-9]+(@[0-9]+)?)[0-9]+#0
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <stdlib.h>
2+
#include <assert.h>
3+
4+
void dynamicAllocationUninitialized(int trigger)
5+
{
6+
int *obj;
7+
obj = malloc(sizeof(int));
8+
if (trigger) {
9+
*obj = 42;
10+
} else {
11+
*obj = 20;
12+
}
13+
14+
assert(*obj == 20);
15+
}
16+
17+
int *staticLocal;
18+
int staticLocalUninitialized(int trigger)
19+
{
20+
staticLocal = malloc(sizeof(int));
21+
if (trigger) {
22+
*staticLocal = 42;
23+
} else {
24+
*staticLocal = 76;
25+
}
26+
27+
assert(*staticLocal == 76);
28+
}
29+

src/goto-symex/goto_symex.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@ void goto_symext::do_simplify(exprt &expr)
2222
simplify(expr, ns);
2323
}
2424

25+
nondet_symbol_exprt goto_symext::build_symex_nondet(typet &type)
26+
{
27+
irep_idt identifier = "symex::nondet" + std::to_string(nondet_count++);
28+
nondet_symbol_exprt new_expr(identifier, type);
29+
return new_expr;
30+
}
31+
2532
void goto_symext::replace_nondet(exprt &expr)
2633
{
2734
if(expr.id()==ID_side_effect &&
2835
expr.get(ID_statement)==ID_nondet)
2936
{
30-
irep_idt identifier="symex::nondet"+std::to_string(nondet_count++);
31-
nondet_symbol_exprt new_expr(identifier, expr.type());
37+
nondet_symbol_exprt new_expr = build_symex_nondet(expr.type());
3238
new_expr.add_source_location()=expr.source_location();
3339
expr.swap(new_expr);
3440
}

src/goto-symex/goto_symex.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ class goto_symext
376376
exprt &code,
377377
const irep_idt &identifier);
378378

379+
nondet_symbol_exprt build_symex_nondet(typet &type);
380+
379381
// exceptions
380382
void symex_throw(statet &);
381383
void symex_catch(statet &);

0 commit comments

Comments
 (0)