aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-05 03:36:26 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-10 23:26:23 +0100
commitc0123a2f917241e52c5844655abbd83f56ff1017 (patch)
treeb33eb179f2eb0f1dfc07a0e9f7c864398760f53f
parent9e1c8ec13686b2c9ca726066501f5988b78a0504 (diff)
downloadsparse-c0123a2f917241e52c5844655abbd83f56ff1017.tar.gz
fix expansion of initializer (mismatching type)
Currently, the expansion of constant initializers is done whenever the offset in the initializer match the one being expanded. However, it's not correct to do this expansion of an integer with the initializer for a float and vice-versa. Fix this by adding the corresponding tests to the other tests of the value. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--expand.c4
-rw-r--r--validation/expand/constant-union-flt2int.c1
-rw-r--r--validation/expand/constant-union-int2flt.c1
3 files changed, 4 insertions, 2 deletions
diff --git a/expand.c b/expand.c
index 04b072c5..9ab259b1 100644
--- a/expand.c
+++ b/expand.c
@@ -694,6 +694,8 @@ static int expand_dereference(struct expression *expr)
if (ctype->bit_size != value->ctype->bit_size)
return UNSAFE;
if (value->type == EXPR_VALUE) {
+ if (!is_integral_type(ctype))
+ return UNSAFE;
if (is_bitfield_type(value->ctype))
return UNSAFE;
expr->type = EXPR_VALUE;
@@ -701,6 +703,8 @@ static int expand_dereference(struct expression *expr)
expr->taint = 0;
return 0;
} else if (value->type == EXPR_FVALUE) {
+ if (!is_float_type(ctype))
+ return UNSAFE;
expr->type = EXPR_FVALUE;
expr->fvalue = value->fvalue;
return 0;
diff --git a/validation/expand/constant-union-flt2int.c b/validation/expand/constant-union-flt2int.c
index 1c8f480b..5e25b592 100644
--- a/validation/expand/constant-union-flt2int.c
+++ b/validation/expand/constant-union-flt2int.c
@@ -13,7 +13,6 @@ static int foo(void)
* check-name: constant-union-float-to-int
* check description: must not infer the int value from the float
* check-command: test-linearize -fdump-ir $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-pattern(1): setfval\\.
diff --git a/validation/expand/constant-union-int2flt.c b/validation/expand/constant-union-int2flt.c
index ff0a642a..16ce1c6f 100644
--- a/validation/expand/constant-union-int2flt.c
+++ b/validation/expand/constant-union-int2flt.c
@@ -13,7 +13,6 @@ static float foo(void)
* check-name: constant-union-int-to-float
* check description: must not infer the float value from the int
* check-command: test-linearize -fdump-ir $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-pattern(1): load\\.