Print this page
11972 resync smatch


  91 }
  92 
  93 static void match_normal_assign(struct expression *expr)
  94 {
  95         if (get_state_expr(my_max_id, expr->left)) {
  96                 set_state_expr(my_max_id, expr->left, &capped);
  97                 set_state_expr(my_min_id, expr->left, &capped);
  98         }
  99 }
 100 
 101 static void match_assign(struct expression *expr)
 102 {
 103         char *name;
 104 
 105         name = get_macro_name(expr->pos);
 106         if (!name || strcmp(name, "get_user") != 0) {
 107                 match_normal_assign(expr);
 108                 return;
 109         }
 110         name = expr_to_var(expr->right);
 111         if (!name || strcmp(name, "__val_gu") != 0)
 112                 goto free;
 113         set_state_expr(my_max_id, expr->left, &user_data);
 114         set_state_expr(my_min_id, expr->left, &user_data);
 115 free:
 116         free_string(name);
 117 }
 118 
 119 static void check_expr(struct expression *expr)
 120 {
 121         struct sm_state *sm;
 122         sval_t max;
 123         sval_t sval;
 124         char *name;
 125         int overflow = 0;
 126         int underflow = 0;
 127 
 128         sm = get_sm_state_expr(my_max_id, expr);
 129         if (sm && slist_has_state(sm->possible, &user_data)) {
 130                 if (!get_absolute_max(expr, &max) || sval_cmp_val(max, 20000) > 0)

 131                         overflow = 1;
 132         }
 133 
 134         sm = get_sm_state_expr(my_min_id, expr);
 135         if (sm && slist_has_state(sm->possible, &user_data)) {
 136                 if (!get_absolute_min(expr, &sval) ||
 137                     (sval_is_negative(sval) && sval_cmp_val(sval, -20000) < 0))
 138                         underflow = 1;
 139         }
 140 
 141         if (!overflow && !underflow)
 142                 return;
 143 
 144         name = expr_to_var_sym(expr, NULL);
 145         if (overflow && underflow)
 146                 sm_warning("check for integer over/underflow '%s'", name);
 147         else if (underflow)
 148                 sm_warning("check for integer underflow '%s'", name);
 149         else
 150                 sm_warning("check for integer overflow '%s'", name);
 151         free_string(name);
 152 
 153         set_state_expr(my_max_id, expr, &capped);
 154         set_state_expr(my_min_id, expr, &capped);
 155 }
 156 
 157 static void match_binop(struct expression *expr)




  91 }
  92 
  93 static void match_normal_assign(struct expression *expr)
  94 {
  95         if (get_state_expr(my_max_id, expr->left)) {
  96                 set_state_expr(my_max_id, expr->left, &capped);
  97                 set_state_expr(my_min_id, expr->left, &capped);
  98         }
  99 }
 100 
 101 static void match_assign(struct expression *expr)
 102 {
 103         char *name;
 104 
 105         name = get_macro_name(expr->pos);
 106         if (!name || strcmp(name, "get_user") != 0) {
 107                 match_normal_assign(expr);
 108                 return;
 109         }
 110         name = expr_to_var(expr->right);
 111         if (!name || (strcmp(name, "__val_gu") != 0 && strcmp(name, "__gu_val")))
 112                 goto free;
 113         set_state_expr(my_max_id, expr->left, &user_data);
 114         set_state_expr(my_min_id, expr->left, &user_data);
 115 free:
 116         free_string(name);
 117 }
 118 
 119 static void check_expr(struct expression *expr)
 120 {
 121         struct sm_state *sm;
 122         sval_t max;
 123         sval_t sval;
 124         char *name;
 125         int overflow = 0;
 126         int underflow = 0;
 127 
 128         sm = get_sm_state_expr(my_max_id, expr);
 129         if (sm && slist_has_state(sm->possible, &user_data)) {
 130                 get_absolute_max(expr, &max);
 131                 if (sval_cmp_val(max, 20000) > 0)
 132                         overflow = 1;
 133         }
 134 
 135         sm = get_sm_state_expr(my_min_id, expr);
 136         if (sm && slist_has_state(sm->possible, &user_data)) {
 137                 get_absolute_min(expr, &sval);
 138                 if (sval_is_negative(sval) && sval_cmp_val(sval, -20000) < 0)
 139                         underflow = 1;
 140         }
 141 
 142         if (!overflow && !underflow)
 143                 return;
 144 
 145         name = expr_to_var_sym(expr, NULL);
 146         if (overflow && underflow)
 147                 sm_warning("check for integer over/underflow '%s'", name);
 148         else if (underflow)
 149                 sm_warning("check for integer underflow '%s'", name);
 150         else
 151                 sm_warning("check for integer overflow '%s'", name);
 152         free_string(name);
 153 
 154         set_state_expr(my_max_id, expr, &capped);
 155         set_state_expr(my_min_id, expr, &capped);
 156 }
 157 
 158 static void match_binop(struct expression *expr)