[PATCH] force to 0 expressions which are erroneously non-constant

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Wher some expression that need to be constant but in fact is not
constant, sparse throw an error and leave the expression as-is.

But some code may make the explicit or implicit assumption that
the expression is constant and use its value, resulting in some
random value, which is not desirable.

One situation where this happen 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
benefit.

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@xxxxxxxxx>
---
 expand.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/expand.c b/expand.c
index dacee7a76..8ee52cfd5 100644
--- a/expand.c
+++ b/expand.c
@@ -1054,8 +1054,11 @@ 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->type = EXPR_VALUE;
+			expr->value = 0;
+		}
 	}
 }
 
-- 
2.13.0

--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux