Skip to content

Commit 9df769a

Browse files
committed
Byte offset to array index translation must use array type
When dereferencing a void* pointer, the dereferenced type would always be considered compatible with the underlying object type. Nevertheless they are not actually the same. If the object was an array and the byte offset non-zero, the use of void* would yield the wrong index. The correct way to compute the index is using the actual (array) object type. Fixes: #1857
1 parent f4fb099 commit 9df769a

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

regression/cbmc/memcpy3/main.c

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include <assert.h>
2+
#include <string.h>
3+
4+
int main()
5+
{
6+
int A[3] = {1, 2, 3};
7+
int *p = A;
8+
int v1, v2;
9+
10+
memcpy(&v1, p, sizeof(int));
11+
++p;
12+
memcpy(&v2, p, sizeof(int));
13+
14+
assert(v1 == 1);
15+
assert(v2 == 2);
16+
17+
return 0;
18+
}

regression/cbmc/memcpy3/test.desc

+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/pointer-analysis/value_set_dereference.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -508,10 +508,8 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
508508
exprt adjusted_offset;
509509

510510
// are we doing a byte?
511-
mp_integer element_size=
512-
dereference_type.id()==ID_empty?
513-
pointer_offset_size(char_type(), ns):
514-
pointer_offset_size(dereference_type, ns);
511+
mp_integer element_size =
512+
pointer_offset_size(root_object_type.subtype(), ns);
515513

516514
if(element_size==1)
517515
{
@@ -520,7 +518,8 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
520518
}
521519
else if(element_size<=0)
522520
{
523-
throw "unknown or invalid type size of:\n"+dereference_type.pretty();
521+
throw "unknown or invalid type size of:\n" +
522+
root_object_type.subtype().pretty();
524523
}
525524
else
526525
{

0 commit comments

Comments
 (0)