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);