summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-01-21 01:23:17 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2019-09-26 18:10:44 +0200
commit233e61d2cfe5fbdaf6de482afebc483ac196f353 (patch)
tree85c0750a9fc5f2139656a24b19e8e9a7d0a7890b
parent7a3cc9608ed2531f7fa0b6704c27bdddaa5053b7 (diff)
downloadsparse-233e61d2cfe5fbdaf6de482afebc483ac196f353.tar.gz
expand: add missing expansion of compound literals
Compound literals, like all other expressions, need to be be expanded before linearization, but this is currently not done. As consequence, some builtins are unexpectedly still present, same for EXPR_TYPEs, ... with error messages like: warning: unknown expression at linearization. Fix this by adding the missing expansion of compound literals. Note: as explained in the code itself, it's not totally clear how compound literals can be identified after evaluation. The code here consider all anonymous symbols with an initializer as being a compound literal. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--evaluate.c1
-rw-r--r--expand.c8
-rw-r--r--validation/expand/compound-literal.c1
-rw-r--r--validation/linear/compound-literal02.c1
4 files changed, 9 insertions, 2 deletions
diff --git a/evaluate.c b/evaluate.c
index f6dfcced..70d76523 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -2935,6 +2935,7 @@ static struct symbol *evaluate_cast(struct expression *expr)
* initializer, in which case we need to pass
* the type value down to that initializer rather
* than trying to evaluate it as an expression
+ * (cfr. compound literals: C99 & C11 6.5.2.5).
*
* A more complex case is when the initializer is
* dereferenced as part of a post-fix expression.
diff --git a/expand.c b/expand.c
index e8e50b08..aba20b8c 100644
--- a/expand.c
+++ b/expand.c
@@ -61,6 +61,14 @@ static int expand_symbol_expression(struct expression *expr)
expr->taint = 0;
return 0;
}
+
+ // expand compound literals (C99 & C11 6.5.2.5)
+ // FIXME: is this the correct way to identify them?
+ // All compound literals are anonymous but is
+ // the reverse true?
+ if (sym->initializer && !expr->symbol_name)
+ return expand_expression(sym->initializer);
+
/* The cost of a symbol expression is lower for on-stack symbols */
return (sym->ctype.modifiers & (MOD_STATIC | MOD_EXTERN)) ? 2 : 1;
}
diff --git a/validation/expand/compound-literal.c b/validation/expand/compound-literal.c
index 7401b019..034164bc 100644
--- a/validation/expand/compound-literal.c
+++ b/validation/expand/compound-literal.c
@@ -13,7 +13,6 @@ static void foo(struct s *p)
/*
* check-name: compound-literal
* check-command: test-linearize $file
- * check-known-to-fail
*
* check-output-start
foo:
diff --git a/validation/linear/compound-literal02.c b/validation/linear/compound-literal02.c
index 87b98d76..6ed5809e 100644
--- a/validation/linear/compound-literal02.c
+++ b/validation/linear/compound-literal02.c
@@ -13,7 +13,6 @@ int bar(void)
* check-name: compound-literal02.c
* check-command: test-linearize -Wno-decl $file
*
- * check-known-to-fail
* check-output-ignore
* check-output-contains: ret\\..*\\$6
*/