Print this page
11506 smatch resync

@@ -289,10 +289,42 @@
 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,6 +341,7 @@
 
         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);
 }