Support typecast from bv_typet to pointer_typet

The fixes in 848e633b67 result in type casts from bv_typet to various
other bitvector types being generated. Most cases were addressed in that
commit, but support for casting to pointers was omitted. This follow-up
commit fixes this, and adds a test specifically covering this case.
This commit is contained in:
Michael Tautschnig 2019-04-12 06:07:32 +00:00 committed by Daniel Kroening
parent 2a0cb4e314
commit e7a4733116
3 changed files with 40 additions and 5 deletions

View File

@ -0,0 +1,15 @@
#include <assert.h>
#include <stdlib.h>
int main()
{
int **s = malloc(sizeof(int *));
for(int i = 0; i < sizeof(int *); ++i)
{
// A correct program would use (char *)s, but updating the pointer allows us
// to reproduce a bug in CBMC (missing support for typecasts from bv_typet
// to pointers).
*((char *)&s + i) = 0;
}
assert(s[0] == 0);
}

View File

@ -0,0 +1,21 @@
CORE
main.c
^EXIT=10$
^SIGNAL=0$
^VERIFICATION FAILED$
--
^warning: ignoring
--
This test makes sure we support bv_typet -> pointer type casts, avoiding
warnings like:
warning: ignoring typecast
* type: pointer
* width: 64
0: signedbv
* width: 32
* #c_type: signed_int
0: typecast
* type: bv
* width: 64

View File

@ -253,11 +253,10 @@ bvt bv_pointerst::convert_pointer_type(const exprt &expr)
if(op_type.id()==ID_pointer)
return convert_bv(op);
else if(op_type.id()==ID_signedbv ||
op_type.id()==ID_unsignedbv ||
op_type.id()==ID_bool ||
op_type.id()==ID_c_enum ||
op_type.id()==ID_c_enum_tag)
else if(
op_type.id() == ID_signedbv || op_type.id() == ID_unsignedbv ||
op_type.id() == ID_bool || op_type.id() == ID_c_enum ||
op_type.id() == ID_c_enum_tag || op_type.id() == ID_bv)
{
// Cast from integer to pointer.
// We just do a zero extension.