Skip to content

Commit 6fbd59c

Browse files
authored
Merge pull request diffblue#1631 from tautschnig/fix-pointer-minus
Pointer difference over void* is difference over char*
2 parents 7c04b5c + 5e0f186 commit 6fbd59c

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

regression/cbmc/void_pointer3/main.c

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include <stddef.h>
2+
3+
int main()
4+
{
5+
// make sure they are NULL objects
6+
void *p=0, *q=0;
7+
// with the object:offset encoding we need to make sure the address arithmetic
8+
// below will only touch the offset part
9+
__CPROVER_assume(sizeof(unsigned char)<sizeof(void*));
10+
unsigned char o1, o2;
11+
// there is ample undefined behaviour here, but the goal of this test solely
12+
// is exercising CBMC's pointer subtraction encoding
13+
p+=o1;
14+
q+=o2;
15+
16+
ptrdiff_t d=p-q;
17+
__CPROVER_assert(p-d==q, "");
18+
return 0;
19+
}
+8
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/bv_pointers.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -412,9 +412,11 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
412412

413413
bv=convert_bv(expr.op0());
414414

415-
mp_integer element_size=
416-
pointer_offset_size(expr.op0().type().subtype(), ns);
417-
DATA_INVARIANT(element_size>0, "object size expected to be non-zero");
415+
typet pointer_sub_type=expr.op0().type().subtype();
416+
if(pointer_sub_type.id()==ID_empty)
417+
pointer_sub_type=char_type();
418+
mp_integer element_size=pointer_offset_size(pointer_sub_type, ns);
419+
DATA_INVARIANT(element_size>0, "object size expected to be positive");
418420

419421
offset_arithmetic(bv, element_size, neg_op1);
420422

@@ -469,9 +471,11 @@ bvt bv_pointerst::convert_bitvector(const exprt &expr)
469471

470472
bvt bv=bv_utils.sub(op0, op1);
471473

472-
mp_integer element_size=
473-
pointer_offset_size(expr.op0().type().subtype(), ns);
474-
DATA_INVARIANT(element_size>0, "object size expected to be non-zero");
474+
typet pointer_sub_type=expr.op0().type().subtype();
475+
if(pointer_sub_type.id()==ID_empty)
476+
pointer_sub_type=char_type();
477+
mp_integer element_size=pointer_offset_size(pointer_sub_type, ns);
478+
DATA_INVARIANT(element_size>0, "object size expected to be positive");
475479

476480
if(element_size!=1)
477481
{

0 commit comments

Comments
 (0)