Print this page
12724 update smatch to 0.6.1-rc1-il-5

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/check_kernel.c
          +++ new/usr/src/tools/smatch/src/check_kernel.c
↓ open down ↓ 24 lines elided ↑ open up ↑
  25   25  
  26   26  static sval_t err_ptr_min;
  27   27  static sval_t err_ptr_max;
  28   28  static sval_t null_ptr;
  29   29  
  30   30  static int implied_err_cast_return(struct expression *call, void *unused, struct range_list **rl)
  31   31  {
  32   32          struct expression *arg;
  33   33  
  34   34          arg = get_argument_from_call_expr(call->args, 0);
  35      -        if (!get_implied_rl(arg, rl)) {
       35 +        if (!get_implied_rl(arg, rl))
  36   36                  *rl = alloc_rl(err_ptr_min, err_ptr_max);
  37      -                *rl = cast_rl(get_type(arg), *rl);
  38      -        }
       37 +
       38 +        *rl = cast_rl(get_type(call), *rl);
  39   39          return 1;
  40   40  }
  41   41  
  42   42  static void hack_ERR_PTR(struct symbol *sym)
  43   43  {
  44   44          struct symbol *arg;
  45   45          struct smatch_state *estate;
  46   46          struct range_list *after;
  47   47          sval_t low_error;
  48   48          sval_t minus_one;
↓ open down ↓ 74 lines elided ↑ open up ↑
 123  123  
 124  124  static void match_not_err(const char *fn, struct expression *call_expr,
 125  125                          struct expression *assign_expr, void *unused)
 126  126  {
 127  127          struct expression *arg;
 128  128          struct smatch_state *pre_state;
 129  129          struct range_list *rl;
 130  130  
 131  131          arg = get_argument_from_call_expr(call_expr->args, 0);
 132  132          pre_state = get_state_expr(SMATCH_EXTRA, arg);
 133      -        if (estate_rl(pre_state)) {
 134      -                rl = estate_rl(pre_state);
 135      -                rl = remove_range(rl, err_ptr_min, err_ptr_max);
 136      -        } else {
 137      -                rl = alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval);
 138      -        }
      133 +        if (pre_state)
      134 +                return;
      135 +        rl = alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval);
 139  136          rl = cast_rl(get_type(arg), rl);
 140  137          set_extra_expr_nomod(arg, alloc_estate_rl(rl));
 141  138  }
 142  139  
 143  140  static void match_err(const char *fn, struct expression *call_expr,
 144  141                          struct expression *assign_expr, void *unused)
 145  142  {
 146  143          struct expression *arg;
 147  144          struct smatch_state *pre_state;
 148  145          struct range_list *rl;
 149  146  
 150  147          arg = get_argument_from_call_expr(call_expr->args, 0);
 151  148          pre_state = get_state_expr(SMATCH_EXTRA, arg);
 152  149          rl = estate_rl(pre_state);
 153  150          if (!rl)
 154  151                  rl = alloc_rl(err_ptr_min, err_ptr_max);
 155  152          rl = rl_intersection(rl, alloc_rl(err_ptr_min, err_ptr_max));
 156  153          rl = cast_rl(get_type(arg), rl);
      154 +        if (pre_state && rl) {
      155 +                /*
      156 +                 * Ideally this would all be handled by smatch_implied.c
      157 +                 * but it doesn't work very well for impossible paths.
      158 +                 *
      159 +                 */
      160 +                return;
      161 +        }
 157  162          set_extra_expr_nomod(arg, alloc_estate_rl(rl));
 158  163  }
 159  164  
 160  165  static void match_container_of_macro(const char *fn, struct expression *expr, void *unused)
 161  166  {
 162  167          set_extra_expr_mod(expr->left, alloc_estate_range(valid_ptr_min_sval, valid_ptr_max_sval));
 163  168  }
 164  169  
 165  170  static void match_container_of(struct expression *expr)
 166  171  {
↓ open down ↓ 83 lines elided ↑ open up ↑
 250  255                  *rl = alloc_rl(sval, sval);
 251  256                  return 1;
 252  257          }
 253  258          zero.type = rl_type(arg_rl);
 254  259          if (!rl_has_sval(arg_rl, zero))
 255  260                  start.value = 1;
 256  261          *rl = alloc_rl(start, end);
 257  262          return 1;
 258  263  }
 259  264  
 260      -
 261      -
 262  265  static void find_module_init_exit(struct symbol_list *sym_list)
 263  266  {
 264  267          struct symbol *sym;
 265  268          struct symbol *fn;
 266  269          struct statement *stmt;
 267  270          char *name;
 268  271          int init;
 269  272          int count;
 270  273  
 271  274          /*
↓ open down ↓ 127 lines elided ↑ open up ↑
 399  402                  return;
 400  403          val_sym = first_ptr_list((struct ptr_list *)type->symbol_list);
 401  404          dest = member_expression(dest, '.', val_sym->ident);
 402  405  
 403  406          assign = assign_expression(dest, '=', data);
 404  407          __in_fake_assign++;
 405  408          __split_expr(assign);
 406  409          __in_fake_assign--;
 407  410  }
 408  411  
      412 +static void match_closure_call(const char *name, struct expression *call,
      413 +                               void *unused)
      414 +{
      415 +        struct expression *cl, *fn, *fake_call;
      416 +        struct expression_list *args = NULL;
      417 +
      418 +        cl = get_argument_from_call_expr(call->args, 0);
      419 +        fn = get_argument_from_call_expr(call->args, 1);
      420 +        if (!fn || !cl)
      421 +                return;
      422 +
      423 +        add_ptr_list(&args, cl);
      424 +        fake_call = call_expression(fn, args);
      425 +        __split_expr(fake_call);
      426 +}
      427 +
 409  428  bool is_ignored_kernel_data(const char *name)
 410  429  {
 411  430          if (option_project != PROJ_KERNEL)
 412  431                  return false;
 413  432  
 414  433          /*
 415  434           * On the file I was looking at lockdep was 25% of the DB.
 416  435           */
 417  436          if (strstr(name, ".dep_map."))
 418  437                  return true;
↓ open down ↓ 37 lines elided ↑ open up ↑
 456  475  
 457  476          add_implied_return_hook("fls", &match_fls, NULL);
 458  477          add_implied_return_hook("fls64", &match_fls, NULL);
 459  478  
 460  479          add_function_hook("__ftrace_bad_type", &__match_nullify_path_hook, NULL);
 461  480          add_function_hook("__write_once_size", &match__write_once_size, NULL);
 462  481  
 463  482          add_function_hook("__read_once_size", &match__read_once_size, NULL);
 464  483          add_function_hook("__read_once_size_nocheck", &match__read_once_size, NULL);
 465  484  
      485 +        add_function_hook("closure_call", &match_closure_call, NULL);
      486 +
 466  487          if (option_info)
 467  488                  add_hook(match_end_file, END_FILE_HOOK);
 468  489  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX