Print this page
12724 update smatch to 0.6.1-rc1-il-5
*** 72,81 ****
--- 72,99 ----
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,98 ****
--- 107,155 ----
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,121 ****
--- 169,180 ----
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);