smatch: misreported 'mask and shift to zero'

Toomas Soome <[email protected]>
Newsgroups org.kernel.vger.smatch
Message-ID <[email protected]>
hi!

The smatch check with illumos code has warning:

/code/illumos-gate/usr/src/tools/proto/root_sparc-nd/opt/onbld/bin/sparc/smatch: /code/illumos-gate/usr/src/common/bignum/bignumimpl.c:1410 big_mul_add_vec() warn: mask and shift to zero

The code itself is perfectly legal:

http://src.illumos.org/source/xref/illumos-gate/usr/src/common/bignum/bignumimpl.c#1410

Investigating the issue, I think, I have found the issue:

match_binop2() is testing expressions having the form: (mask & value) >> shift
and the failure case is 'variable >> shift’.

What does happen is, we get incoming expression set to: '(mask & ) >> shift’

and the mask value is not correct.

In our specific error case we do have 64-bit lhs for >> operator, and we do shift 32 bits; the mask value is set to 0xFFFFFFFF, and shifting it by 32 bits, we do end up with match_binop2() reporting the warning.

Since this incoming expression is missing rhs for & expression, the fix is also obvious - add check to make sure we do have both hands for & expression.

diff --git a/usr/src/tools/smatch/src/check_shift_to_zero.c b/usr/src/tools/smatch/src/check_shift_to_zero.c
index 019b06fb75..14cfdc2258 100644
--- a/usr/src/tools/smatch/src/check_shift_to_zero.c
+++ b/usr/src/tools/smatch/src/check_shift_to_zero.c
@@ -44,7 +44,7 @@ static void match_binop2(struct expression *expr)
 {
        struct expression *left;
        struct expression *tmp;
-       sval_t mask, shift;
+       sval_t value, mask, shift;
 
        if (expr->op != SPECIAL_RIGHTSHIFT)
                return;
@@ -58,6 +58,13 @@ static void match_binop2(struct expression *expr)
 
        if (!get_implied_value(expr->right, &shift))
                return;
+       /*
+        * The LHS for expr is assumed to be (mask & value), make sure
+        * we do have both hands.
+        */
+       if (!get_implied_value(left->left, &value))
+               return;
+
        if (!get_implied_value(left->right, &mask))
                return;
 
thanks,
toomas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.