aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2017-05-31 15:00:49 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-08-09 16:06:18 +0200
commit6ed98066f6d184f2f0f918570aaa6a1934668ac2 (patch)
tree37df8e0fa77c972a6ab8528e18df5b64d86e204d
parent13252024246cc03fc8cc0d812c61421f96faa3c7 (diff)
downloadsparse-6ed98066f6d184f2f0f918570aaa6a1934668ac2.tar.gz
force to 0 expressions which are erroneously non-constant
When an expression that needs to be constant but is, in fact, not constant, sparse throws an error and leaves it as-is. But some code makes the assumption that the expression is constant and uses its value, with some random result. One situation where this happens is in code like: switch (x) { case <some non-const expression>: ... In this case, the linearization of the switch/case statement will unconditionally use the value of the case expression but the expression has no value. One way to avoid this would be to add defensive checks each time a value is retrieved but this is a lot of work and time for no benefits. So, change this by forcing the expression to be a constant value of 0 just after the error message has been issued. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--expand.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/expand.c b/expand.c
index 623b1800..c4f806de 100644
--- a/expand.c
+++ b/expand.c
@@ -1177,8 +1177,12 @@ static void expand_const_expression(struct expression *expr, const char *where)
{
if (expr) {
expand_expression(expr);
- if (expr->type != EXPR_VALUE)
+ if (expr->type != EXPR_VALUE) {
expression_error(expr, "Expected constant expression in %s", where);
+ expr->ctype = &int_ctype;
+ expr->type = EXPR_VALUE;
+ expr->value = 0;
+ }
}
}