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