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

@@ -72,10 +72,28 @@
 void __print_cur_stree(void)
 {
         __print_stree(cur_stree);
 }
 
+bool __print_states(const char *owner)
+{
+        struct sm_state *sm;
+        bool found = false;
+
+        if (!owner)
+                return false;
+
+        FOR_EACH_SM(__get_cur_stree(), sm) {
+                if (!strstr(check_name(sm->owner), owner))
+                        continue;
+                sm_msg("%s", show_sm(sm));
+                found = true;
+        } END_FOR_EACH_SM(sm);
+
+        return found;
+}
+
 int unreachable(void)
 {
         if (!cur_stree)
                 return 1;
         return 0;

@@ -89,10 +107,49 @@
 void __set_cur_stree_writable(void)
 {
         read_only--;
 }
 
+DECLARE_PTR_LIST(check_tracker_list, check_tracker_hook *);
+static struct check_tracker_list **tracker_hooks;
+
+void add_check_tracker(const char *check_name, check_tracker_hook *fn)
+{
+        check_tracker_hook **p;
+        int owner;
+
+        owner = id_from_name(check_name);
+        if (!owner) {
+                printf("check not found.  '%s'\n", check_name);
+                return;
+        }
+
+        p = malloc(sizeof(check_tracker_hook *));
+        *p = fn;
+        add_ptr_list(&tracker_hooks[owner], p);
+}
+
+static void call_tracker_hooks(int owner, const char *name, struct symbol *sym, struct smatch_state *state)
+{
+        struct check_tracker_list *hooks;
+        check_tracker_hook **fn;
+
+        if ((unsigned short)owner == USHRT_MAX)
+                return;
+
+        hooks = tracker_hooks[owner];
+        FOR_EACH_PTR(hooks, fn) {
+                (*fn)(owner, name, sym, state);
+        } END_FOR_EACH_PTR(fn);
+}
+
+void allocate_tracker_array(int num_checks)
+{
+        tracker_hooks = malloc(num_checks * sizeof(void *));
+        memset(tracker_hooks, 0, num_checks * sizeof(void *));
+}
+
 struct sm_state *set_state(int owner, const char *name, struct symbol *sym, struct smatch_state *state)
 {
         struct sm_state *ret;
 
         if (!name || !state)

@@ -112,10 +169,12 @@
                         sm_msg("%s change [%s] '%s' %s => %s",
                                 __func__, check_name(owner), name, show_state(s),
                                 show_state(state));
         }
 
+        call_tracker_hooks(owner, name, sym, state);
+
         if (owner != -1 && unreachable())
                 return NULL;
 
         if (fake_cur_stree_stack)
                 set_state_stree_stack(&fake_cur_stree_stack, owner, name, sym, state);