Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/check_precedence.c
          +++ new/usr/src/tools/smatch/src/check_precedence.c
↓ open down ↓ 112 lines elided ↑ open up ↑
 113  113          if (expr->op != '&')
 114  114                  return;
 115  115          if (expr->right->type != EXPR_BINOP)
 116  116                  return;
 117  117          if (expr->right->op != SPECIAL_RIGHTSHIFT)
 118  118                  return;
 119  119  
 120  120          sm_warning("shift has higher precedence than mask");
 121  121  }
 122  122  
      123 +static void match_mask_compare(struct expression *expr)
      124 +{
      125 +        if (expr->op != '&')
      126 +                return;
      127 +        if (expr->right->type != EXPR_COMPARE)
      128 +                return;
      129 +
      130 +        sm_warning("compare has higher precedence than mask");
      131 +}
      132 +
 123  133  static void match_subtract_shift(struct expression *expr)
 124  134  {
 125  135          if (expr->op != SPECIAL_LEFTSHIFT)
 126  136                  return;
 127  137          if (expr->right->type != EXPR_BINOP)
 128  138                  return;
 129  139          if (expr->right->op != '-')
 130  140                  return;
 131  141          sm_warning("subtract is higher precedence than shift");
 132  142  }
 133  143  
 134  144  void check_precedence(int id)
 135  145  {
 136  146          my_id = id;
 137  147  
 138  148          add_hook(&match_condition, CONDITION_HOOK);
 139  149          add_hook(&match_binop, BINOP_HOOK);
 140  150          add_hook(&match_mask, BINOP_HOOK);
      151 +        add_hook(&match_mask_compare, BINOP_HOOK);
 141  152          add_hook(&match_subtract_shift, BINOP_HOOK);
 142  153  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX