49
50 static void match_save_states(struct expression *expr)
51 {
52 push_stree(&saved_stack, start_states);
53 start_states = NULL;
54 }
55
56 static void match_restore_states(struct expression *expr)
57 {
58 free_stree(&start_states);
59 start_states = pop_stree(&saved_stack);
60 }
61
62 static struct smatch_state *unmatched_state(struct sm_state *sm)
63 {
64 struct smatch_state *state;
65
66 if (parent_is_gone_var_sym(sm->name, sm->sym))
67 return alloc_estate_empty();
68
69 state = get_state(SMATCH_EXTRA, sm->name, sm->sym);
70 if (state)
71 return state;
72 return alloc_estate_whole(estate_type(sm->state));
73 }
74
75 static void pre_merge_hook(struct sm_state *sm)
76 {
77 struct smatch_state *extra, *mine;
78 struct range_list *rl;
79
80 if (estate_rl(sm->state))
81 return;
82
83 extra = get_state(SMATCH_EXTRA, sm->name, sm->sym);
84 if (!extra)
85 return;
86 mine = get_state(my_id, sm->name, sm->sym);
87
88 rl = rl_intersection(estate_rl(extra), estate_rl(mine));
89 if (rl_equiv(rl, estate_rl(mine)))
90 return;
91 set_state(my_id, sm->name, sm->sym, alloc_estate_rl(clone_rl(rl)));
92 }
93
94 static void extra_mod_hook(const char *name, struct symbol *sym, struct expression *expr, struct smatch_state *state)
95 {
96 int param;
97
98 if (__in_fake_assign)
99 return;
100
101 param = get_param_num_from_sym(sym);
102 if (param < 0)
103 return;
104
105 /* on stack parameters are handled in smatch_param_limit.c */
106 if (sym->ident && strcmp(sym->ident->name, name) == 0)
107 return;
108
109 set_state(my_id, name, sym, alloc_estate_empty());
110 }
111
|
49
50 static void match_save_states(struct expression *expr)
51 {
52 push_stree(&saved_stack, start_states);
53 start_states = NULL;
54 }
55
56 static void match_restore_states(struct expression *expr)
57 {
58 free_stree(&start_states);
59 start_states = pop_stree(&saved_stack);
60 }
61
62 static struct smatch_state *unmatched_state(struct sm_state *sm)
63 {
64 struct smatch_state *state;
65
66 if (parent_is_gone_var_sym(sm->name, sm->sym))
67 return alloc_estate_empty();
68
69 state = __get_state(SMATCH_EXTRA, sm->name, sm->sym);
70 if (state)
71 return state;
72 return alloc_estate_whole(estate_type(sm->state));
73 }
74
75 static void pre_merge_hook(struct sm_state *cur, struct sm_state *other)
76 {
77 struct smatch_state *extra;
78 struct range_list *rl;
79
80 if (estate_rl(other->state))
81 return;
82
83 extra = get_state(SMATCH_EXTRA, cur->name, cur->sym);
84 if (!extra)
85 return;
86
87 rl = rl_intersection(estate_rl(extra), estate_rl(cur->state));
88 if (rl_equiv(rl, estate_rl(cur->state)))
89 return;
90 set_state(my_id, cur->name, cur->sym, alloc_estate_rl(clone_rl(rl)));
91 }
92
93 static void extra_mod_hook(const char *name, struct symbol *sym, struct expression *expr, struct smatch_state *state)
94 {
95 int param;
96
97 if (__in_fake_assign)
98 return;
99
100 param = get_param_num_from_sym(sym);
101 if (param < 0)
102 return;
103
104 /* on stack parameters are handled in smatch_param_limit.c */
105 if (sym->ident && strcmp(sym->ident->name, name) == 0)
106 return;
107
108 set_state(my_id, name, sym, alloc_estate_empty());
109 }
110
|