Print this page
11506 smatch resync

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 ↓ 283 lines elided ↑ open up ↑
 284  284          expr = strip_expr(expr);
 285  285          var = expr_to_var_sym(expr, &sym);
 286  286          if (!var || !sym)
 287  287                  goto free;
 288  288          ret = parent_is_free_var_sym_strict(var, sym);
 289  289  free:
 290  290          free_string(var);
 291  291          return ret;
 292  292  }
 293  293  
      294 +static void match_untracked(struct expression *call, int param)
      295 +{
      296 +        struct state_list *slist = NULL;
      297 +        struct expression *arg;
      298 +        struct sm_state *sm;
      299 +        char *name;
      300 +        char buf[64];
      301 +        int len;
      302 +
      303 +        arg = get_argument_from_call_expr(call->args, param);
      304 +        if (!arg)
      305 +                return;
      306 +
      307 +        name = expr_to_var(arg);
      308 +        if (!name)
      309 +                return;
      310 +        snprintf(buf, sizeof(buf), "%s->", name);
      311 +        free_string(name);
      312 +        len = strlen(buf);
      313 +
      314 +        FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
      315 +                if (strncmp(sm->name, buf, len) == 0)
      316 +                        add_ptr_list(&slist, sm);
      317 +        } END_FOR_EACH_SM(sm);
      318 +
      319 +        FOR_EACH_PTR(slist, sm) {
      320 +                set_state(sm->owner, sm->name, sm->sym, &ok);
      321 +        } END_FOR_EACH_PTR(sm);
      322 +
      323 +        free_slist(&slist);
      324 +}
      325 +
 294  326  void check_free_strict(int id)
 295  327  {
 296  328          my_id = id;
 297  329  
 298  330          if (option_project != PROJ_KERNEL)
 299  331                  return;
 300  332  
 301  333          add_function_hook("kfree", &match_free, INT_PTR(0));
 302  334          add_function_hook("kmem_cache_free", &match_free, INT_PTR(1));
 303  335  
 304  336          if (option_spammy)
 305  337                  add_hook(&match_symbol, SYM_HOOK);
 306  338          add_hook(&match_dereferences, DEREF_HOOK);
 307  339          add_hook(&match_call, FUNCTION_CALL_HOOK);
 308  340          add_hook(&match_return, RETURN_HOOK);
 309  341  
 310  342          add_modification_hook_late(my_id, &ok_to_use);
 311  343          add_pre_merge_hook(my_id, &pre_merge_hook);
 312  344  
 313  345          select_return_states_hook(PARAM_FREED, &set_param_freed);
      346 +        add_untracked_param_hook(&match_untracked);
 314  347  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX