From 840f2b035fe0a3392853ba3e24ea85caf7ee3bb5 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Mon, 15 Jul 2013 10:14:36 +0300 Subject: [PATCH] math: improve how casts are handled This is for code like: int x = le16_to_cpu(foo); It is useful to know that x is a number between 0 and u16max, as opposed to being a negative number or something. Signed-off-by: Dan Carpenter --- smatch_math.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/smatch_math.c b/smatch_math.c index a6cbc2b2..3ba47bff 100644 --- a/smatch_math.c +++ b/smatch_math.c @@ -715,6 +715,23 @@ static struct range_list *handle_call_rl(struct expression *expr, int implied) return db_return_vals(expr); } +static struct range_list *handle_cast(struct expression *expr, int implied) +{ + struct range_list *rl; + struct symbol *type; + + type = get_type(expr); + rl = _get_rl(expr->cast_expression, implied); + if (rl) + return cast_rl(type, rl); + if (implied == RL_ABSOLUTE) + return alloc_whole_rl(type); + if (implied == RL_IMPLIED && type && + type->bit_size > 0 && type->bit_size < 32) + return alloc_whole_rl(type); + return NULL; +} + static struct range_list *_get_rl(struct expression *expr, int implied) { struct range_list *rl; @@ -740,8 +757,7 @@ static struct range_list *_get_rl(struct expression *expr, int implied) case EXPR_CAST: case EXPR_FORCE_CAST: case EXPR_IMPLIED_CAST: - rl = _get_rl(expr->cast_expression, implied); - rl = cast_rl(type, rl); + rl = handle_cast(expr, implied); break; case EXPR_BINOP: rl = handle_binop_rl(expr, implied); -- 2.11.4.GIT