aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-08-15 09:38:40 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2018-06-23 07:46:40 +0200
commitff7f001bef9aa88ff951d61ec10772e7d2143180 (patch)
treedc9f33aea66424b69f017843a24b096238493f0e
parent0d19a077e74ce523f05b64708517bd657721a68e (diff)
downloadsparse-dev-ff7f001bef9aa88ff951d61ec10772e7d2143180.tar.gz
cast: temporary simplify handling cast to/from void*
Currently pointer casts from/to void are treated as casts to/from integer. The rationale being that a void pointer can't anyway be dereferenced. Allow to continue to do so by using a new 'machine type' for void pointers which then allow to select the right type of cast: OP_PTRCAST or OP_[S]CAST. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--linearize.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/linearize.c b/linearize.c
index 413b8ab5..01bd68d2 100644
--- a/linearize.c
+++ b/linearize.c
@@ -1167,6 +1167,7 @@ enum mtype {
MTYPE_UINT,
MTYPE_SINT,
MTYPE_PTR,
+ MTYPE_VPTR, // TODO: must be removed ?
MTYPE_FLOAT,
MTYPE_BAD,
};
@@ -1181,8 +1182,7 @@ retry: switch (s->type) {
goto retry;
case SYM_PTR:
if (s->ctype.base_type == &void_ctype)
- // handle void pointer like an uint
- goto case_int;
+ return MTYPE_VPTR;
return MTYPE_PTR;
case SYM_BITFIELD:
case SYM_RESTRICT:
@@ -1226,14 +1226,25 @@ static int get_cast_opcode(struct symbol *dst, struct symbol *src)
switch (stype) {
case MTYPE_UINT:
case MTYPE_SINT:
- if (is_ptr_type(src)) // must be a void pointer
- return OP_PTRCAST;// FIXME: to be removed?
return OP_UTPTR;
case MTYPE_PTR:
+ case MTYPE_VPTR:
return OP_PTRCAST;
default:
return OP_BADOP;
}
+ case MTYPE_VPTR:
+ switch (stype) {
+ case MTYPE_PTR:
+ case MTYPE_VPTR:
+ case MTYPE_UINT:
+ return OP_CAST;
+ case MTYPE_SINT:
+ return OP_SCAST;
+ default:
+ return OP_BADOP;
+ break;
+ }
case MTYPE_UINT:
case MTYPE_SINT:
switch (stype) {