Print this page
11506 smatch resync
*** 289,298 ****
--- 289,330 ----
free:
free_string(var);
return ret;
}
+ static void match_untracked(struct expression *call, int param)
+ {
+ struct state_list *slist = NULL;
+ struct expression *arg;
+ struct sm_state *sm;
+ char *name;
+ char buf[64];
+ int len;
+
+ arg = get_argument_from_call_expr(call->args, param);
+ if (!arg)
+ return;
+
+ name = expr_to_var(arg);
+ if (!name)
+ return;
+ snprintf(buf, sizeof(buf), "%s->", name);
+ free_string(name);
+ len = strlen(buf);
+
+ FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
+ if (strncmp(sm->name, buf, len) == 0)
+ add_ptr_list(&slist, sm);
+ } END_FOR_EACH_SM(sm);
+
+ FOR_EACH_PTR(slist, sm) {
+ set_state(sm->owner, sm->name, sm->sym, &ok);
+ } END_FOR_EACH_PTR(sm);
+
+ free_slist(&slist);
+ }
+
void check_free_strict(int id)
{
my_id = id;
if (option_project != PROJ_KERNEL)
*** 309,314 ****
--- 341,347 ----
add_modification_hook_late(my_id, &ok_to_use);
add_pre_merge_hook(my_id, &pre_merge_hook);
select_return_states_hook(PARAM_FREED, &set_param_freed);
+ add_untracked_param_hook(&match_untracked);
}