Print this page
11972 resync smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/check_free_strict.c
          +++ new/usr/src/tools/smatch/src/check_free_strict.c
↓ open down ↓ 28 lines elided ↑ open up ↑
  29   29  
  30   30  STATE(freed);
  31   31  STATE(ok);
  32   32  
  33   33  static void ok_to_use(struct sm_state *sm, struct expression *mod_expr)
  34   34  {
  35   35          if (sm->state != &ok)
  36   36                  set_state(my_id, sm->name, sm->sym, &ok);
  37   37  }
  38   38  
  39      -static void pre_merge_hook(struct sm_state *sm)
       39 +static void pre_merge_hook(struct sm_state *cur, struct sm_state *other)
  40   40  {
  41   41          if (is_impossible_path())
  42      -                set_state(my_id, sm->name, sm->sym, &ok);
       42 +                set_state(my_id, cur->name, cur->sym, &ok);
  43   43  }
  44   44  
       45 +static struct smatch_state *unmatched_state(struct sm_state *sm)
       46 +{
       47 +        struct smatch_state *state;
       48 +        sval_t sval;
       49 +
       50 +        if (sm->state != &freed)
       51 +                return &undefined;
       52 +
       53 +        state = get_state(SMATCH_EXTRA, sm->name, sm->sym);
       54 +        if (!state)
       55 +                return &undefined;
       56 +        if (!estate_get_single_value(state, &sval) || sval.value != 0)
       57 +                return &undefined;
       58 +        /* It makes it easier to consider NULL pointers as freed.  */
       59 +        return &freed;
       60 +}
       61 +
  45   62  static int is_freed(struct expression *expr)
  46   63  {
  47   64          struct sm_state *sm;
  48   65  
  49   66          sm = get_sm_state_expr(my_id, expr);
  50   67          if (sm && slist_has_state(sm->possible, &freed))
  51   68                  return 1;
  52   69          return 0;
  53   70  }
  54   71  
↓ open down ↓ 279 lines elided ↑ open up ↑
 334  351          add_function_hook("kmem_cache_free", &match_free, INT_PTR(1));
 335  352  
 336  353          if (option_spammy)
 337  354                  add_hook(&match_symbol, SYM_HOOK);
 338  355          add_hook(&match_dereferences, DEREF_HOOK);
 339  356          add_hook(&match_call, FUNCTION_CALL_HOOK);
 340  357          add_hook(&match_return, RETURN_HOOK);
 341  358  
 342  359          add_modification_hook_late(my_id, &ok_to_use);
 343  360          add_pre_merge_hook(my_id, &pre_merge_hook);
      361 +        add_unmatched_state_hook(my_id, &unmatched_state);
 344  362  
 345  363          select_return_states_hook(PARAM_FREED, &set_param_freed);
 346  364          add_untracked_param_hook(&match_untracked);
 347  365  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX