aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-05 03:35:13 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-12-10 23:26:23 +0100
commit9e1c8ec13686b2c9ca726066501f5988b78a0504 (patch)
treee7f12c2b2a014396070db52b1c5f872e43b25e30
parent41ba12bf8e76ee2c69222c1c3dfb1a3d420a73d9 (diff)
downloadsparse-9e1c8ec13686b2c9ca726066501f5988b78a0504.tar.gz
fix expansion of initializer (mismatching size)
Currently, the expansion of constant initializers is done whenever the offset in the initializer match the one we're expanding. However, it's not correct to do this expansion if their size doesn't match since in this case the value of one doesn't represent the value of the other. Fix this by adding a check for the size. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--expand.c8
-rw-r--r--validation/expand/constant-union-size.c1
2 files changed, 4 insertions, 5 deletions
diff --git a/expand.c b/expand.c
index ae764153..04b072c5 100644
--- a/expand.c
+++ b/expand.c
@@ -625,8 +625,6 @@ static int expand_addressof(struct expression *expr)
* Look up a trustable initializer value at the requested offset.
*
* Return NULL if no such value can be found or statically trusted.
- *
- * FIXME!! We should check that the size is right!
*/
static struct expression *constant_symbol_value(struct symbol *sym, int offset)
{
@@ -688,11 +686,13 @@ static int expand_dereference(struct expression *expr)
if (unop->type == EXPR_SYMBOL) {
struct symbol *sym = unop->symbol;
+ struct symbol *ctype = expr->ctype;
struct expression *value = constant_symbol_value(sym, offset);
/* Const symbol with a constant initializer? */
- if (value) {
- /* FIXME! We should check that the size is right! */
+ if (value && value->ctype) {
+ if (ctype->bit_size != value->ctype->bit_size)
+ return UNSAFE;
if (value->type == EXPR_VALUE) {
if (is_bitfield_type(value->ctype))
return UNSAFE;
diff --git a/validation/expand/constant-union-size.c b/validation/expand/constant-union-size.c
index b6c3ac75..8a16bf3e 100644
--- a/validation/expand/constant-union-size.c
+++ b/validation/expand/constant-union-size.c
@@ -13,7 +13,6 @@ static int foo(void)
* check-name: constant-union-size
* check description: the size of the initializer doesn't match
* check-command: test-linearize -fdump-ir $file
- * check-known-to-fail
*
* check-output-ignore
* check-output-contains: load\\.