math: be more ambitious handling right shifts
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 29 May 2014 10:12:27 +0000 (29 13:12 +0300)
committerDan Carpenter <dan.carpenter@oracle.com>
Thu, 29 May 2014 10:12:27 +0000 (29 13:12 +0300)
We can at least say that the number is not negative.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch_math.c

index 31696ae..ed49dbd 100644 (file)
@@ -340,9 +340,7 @@ static struct range_list *handle_right_shift(struct expression *expr, int implie
 
        if (implied == RL_EXACT || implied == RL_HARD)
                return NULL;
-       /* this is hopeless without the right side */
-       if (!get_implied_value(expr->right, &right))
-               return NULL;
+
        left_rl = _get_rl(expr->left, implied);
        if (left_rl) {
                max = rl_max(left_rl);
@@ -354,8 +352,16 @@ static struct range_list *handle_right_shift(struct expression *expr, int implie
                min = sval_type_val(get_type(expr->left), 0);
        }
 
-       max = sval_binop(max, SPECIAL_RIGHTSHIFT, right);
-       min = sval_binop(min, SPECIAL_RIGHTSHIFT, right);
+       if (get_implied_value(expr->right, &right)) {
+               min = sval_binop(min, SPECIAL_RIGHTSHIFT, right);
+               max = sval_binop(max, SPECIAL_RIGHTSHIFT, right);
+       } else if (!sval_is_negative(min)) {
+               min.value = 0;
+               max = sval_type_max(max.type);
+       } else {
+               return NULL;
+       }
+
        return alloc_rl(min, max);
 }