From: Dan Carpenter Date: Mon, 15 Jul 2013 07:14:36 +0000 (+0300) Subject: math: improve how casts are handled X-Git-Tag: 1.60~545 X-Git-Url: https://repo.or.cz/w/smatch.git/commitdiff_plain/840f2b035fe0a3392853ba3e24ea85caf7ee3bb5 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 --- 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);