Skip to content

Commit 38a3772

Browse files
committed
Use get_subexpression_at_offset in pointer_logict
We now support pointers into structs with zero-sized members, which is a GCC extension that we otherwise do support.
1 parent 12823a8 commit 38a3772

File tree

4 files changed

+56
-70
lines changed

4 files changed

+56
-70
lines changed

regression/cbmc/Empty_struct2/main.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <assert.h>
2+
3+
struct empty
4+
{
5+
};
6+
7+
#pragma pack(1)
8+
struct S
9+
{
10+
int x;
11+
struct empty e;
12+
int y;
13+
};
14+
#pragma pack()
15+
16+
int main()
17+
{
18+
struct S s;
19+
struct empty *p = &s.e;
20+
21+
assert(p == (char*)&s + sizeof(int));
22+
23+
return 0;
24+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.c
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
^warning: ignoring

src/solvers/flattening/pointer_logic.cpp

Lines changed: 24 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -108,75 +108,34 @@ exprt pointer_logict::pointer_expr(
108108

109109
const exprt &object_expr=objects[pointer.object];
110110

111-
exprt deep_object=object_rec(pointer.offset, type, object_expr);
112-
113-
return address_of_exprt(deep_object, type);
114-
}
115-
116-
exprt pointer_logict::object_rec(
117-
const mp_integer &offset,
118-
const typet &pointer_type,
119-
const exprt &src) const
120-
{
121-
if(src.type().id()==ID_array)
111+
typet subtype = type.subtype();
112+
if(subtype.id() == ID_empty)
113+
subtype = char_type();
114+
exprt deep_object = get_subexpression_at_offset(
115+
object_expr, pointer.offset, subtype, ID_unknown, ns);
116+
CHECK_RETURN(deep_object.is_not_nil());
117+
if(deep_object.id() != ID_unknown)
118+
return address_of_exprt(deep_object, type);
119+
120+
if(deep_object.op1().is_zero())
121+
return address_of_exprt(deep_object.op0(), type);
122+
123+
const mp_integer subtype_bytes = pointer_offset_size(subtype, ns);
124+
CHECK_RETURN(subtype_bytes > 0);
125+
if(subtype_bytes > pointer.offset)
122126
{
123-
mp_integer size=
124-
pointer_offset_size(src.type().subtype(), ns);
125-
126-
if(size<=0)
127-
return src;
128-
129-
mp_integer index=offset/size;
130-
mp_integer rest=offset%size;
131-
if(rest<0)
132-
rest=-rest;
133-
134-
index_exprt tmp(src.type().subtype());
135-
tmp.index()=from_integer(index, typet(ID_integer));
136-
tmp.array()=src;
137-
138-
return object_rec(rest, pointer_type, tmp);
127+
return
128+
plus_exprt(
129+
address_of_exprt(deep_object.op0(), pointer_type(char_type())),
130+
from_integer(pointer.offset, index_type()));
139131
}
140-
else if(src.type().id()==ID_struct)
132+
else
141133
{
142-
const struct_typet::componentst &components=
143-
to_struct_type(src.type()).components();
144-
145-
if(offset<0)
146-
return src;
147-
148-
mp_integer current_offset=0;
149-
150-
for(const auto &c : components)
151-
{
152-
assert(offset>=current_offset);
153-
154-
const typet &subtype=c.type();
155-
156-
mp_integer sub_size=pointer_offset_size(subtype, ns);
157-
assert(sub_size>0);
158-
mp_integer new_offset=current_offset+sub_size;
159-
160-
if(new_offset>offset)
161-
{
162-
// found it
163-
member_exprt tmp(src, c);
164-
165-
return object_rec(
166-
offset-current_offset, pointer_type, tmp);
167-
}
168-
169-
assert(new_offset<=offset);
170-
current_offset=new_offset;
171-
assert(current_offset<=offset);
172-
}
173-
174-
return src;
134+
return
135+
plus_exprt(
136+
address_of_exprt(deep_object.op0(), pointer_type(char_type())),
137+
from_integer(pointer.offset / subtype_bytes, index_type()));
175138
}
176-
else if(src.type().id()==ID_union)
177-
return src;
178-
179-
return src;
180139
}
181140

182141
pointer_logict::pointer_logict(const namespacet &_ns):ns(_ns)

src/solvers/flattening/pointer_logic.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@ class pointer_logict
7878
exprt pointer_expr(
7979
const mp_integer &offset,
8080
const exprt &object) const;
81-
82-
exprt object_rec(
83-
const mp_integer &offset,
84-
const typet &pointer_type,
85-
const exprt &src) const;
8681
};
8782

8883
#endif // CPROVER_SOLVERS_FLATTENING_POINTER_LOGIC_H

0 commit comments

Comments
 (0)