Skip to content

Commit 1abdf1a

Browse files
committed
Add nondet assignment to non-zero'd allocations in symex
This change means that if a generation zero symex variable is seen it can be assumed to not have been allocated at any point and still have its default values. We use this knowledge to then not add a guard on a phi merge that has a gen zero on its lhs or rhs, instead just simply assigning the other side directly.
1 parent 41d7a45 commit 1abdf1a

File tree

14 files changed

+250
-2
lines changed

14 files changed

+250
-2
lines changed
1.46 KB
Binary file not shown.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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 field;
17+
18+
public int fieldUninitialized(Boolean trigger) {
19+
if (trigger) {
20+
field = new Ephemeral(42);
21+
}
22+
23+
assert field.val == 42;
24+
return field.val;
25+
}
26+
27+
private static Ephemeral staticField;
28+
29+
public int staticFieldUninitialized(Boolean trigger) {
30+
if (trigger) {
31+
staticField = new Ephemeral(42);
32+
} else {
33+
staticField = new Aetherial(76);
34+
}
35+
36+
assert staticField.val == 76;
37+
return staticField.val;
38+
}
39+
40+
class Ephemeral {
41+
Ephemeral(int value) {
42+
val = value;
43+
}
44+
45+
int val;
46+
}
47+
48+
class Aetherial extends Ephemeral {
49+
Aetherial(int value) {
50+
super(value);
51+
}
52+
}
53+
}
54+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
PhiMergeUninitialized.class
3+
--function PhiMergeUninitialized.fieldUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+(dynamic_object|new_tmp)[0-9]+(@[0-9]+)?#0\)
9+
^.*\?\s+(dynamic_object|new_tmp)[0-9]+(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? dynamic_object2@3#1 : dynamic_object3@3#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
PhiMergeUninitialized.class
3+
--function PhiMergeUninitialized.dynamicAllocationUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+(dynamic_object|new_tmp)[0-9]+(@[0-9]+)?#0\)
9+
^.*\?\s+(dynamic_object|new_tmp)[0-9]+(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? dynamic_object2@3#1 : dynamic_object3@3#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
PhiMergeUninitialized.class
3+
--function PhiMergeUninitialized.staticFieldUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+(dynamic_object|new_tmp)[0-9]+(@[0-9]+)?#0\)
9+
^.*\?\s+(dynamic_object|new_tmp)[0-9]+(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? dynamic_object2@3#1 : dynamic_object3@3#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
test.c
3+
--function dynamicAllocationUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+dynamic_object[0-9]+(@[0-9]+)?#0\)
9+
^.*\?\s+dynamic_object[0-9]+(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? dynamic_object2@3#1 : dynamic_object3@3#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
test.c
3+
--function globalUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+global(@[0-9]+)?#0\)
9+
^.*\?\s+global(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? global#1 : global#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
test.c
3+
--function localUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+local(@[0-9]+)?#0\)
9+
^.*\?\s+local(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? local#1 : local#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
test.c
3+
--function staticLocalUninitialized --show-vcc
4+
activate-multi-line-match
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^.*:\s+staticLocal(@[0-9]+)?#0\)
9+
^.*\?\s+staticLocal(@[0-9]+)?#0\s+:
10+
--
11+
These regexes are making sure that a variable of generation 0 dosen't appear in a phi merge, so the below
12+
statement:
13+
14+
(guard ? staticLocal#1 : dynamic_object#0)
15+
16+
Should not appear. First regex deals with when the gen zero is the latter position, second when it's in the former.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include <assert.h>
2+
#include <stdlib.h>
3+
4+
void dynamicAllocationUninitialized(int trigger)
5+
{
6+
int *obj;
7+
if(trigger)
8+
{
9+
obj = (int*)malloc(sizeof(int));
10+
*obj = 42;
11+
}
12+
else
13+
{
14+
obj = (int*)malloc(sizeof(int));
15+
*obj = 76;
16+
}
17+
18+
assert(*obj == 42);
19+
}
20+
21+
int global;
22+
void globalUninitialized(int trigger)
23+
{
24+
if(trigger)
25+
{
26+
global = 44;
27+
}
28+
else
29+
{
30+
global = 20;
31+
}
32+
33+
assert(global == 44);
34+
}
35+
36+
void staticLocalUninitialized(int trigger)
37+
{
38+
static int staticLocal;
39+
if(trigger)
40+
{
41+
staticLocal = 43;
42+
}
43+
44+
assert(staticLocal == 43);
45+
}
46+
47+
void localUninitialized(int trigger)
48+
{
49+
int local;
50+
if(trigger)
51+
{
52+
local = 24;
53+
}
54+
55+
assert(local == 24);
56+
}

0 commit comments

Comments
 (0)