Print this page
11506 smatch resync
*** 26,37 ****
--- 26,41 ----
int check_assigned_expr_id;
static int my_id;
static int link_id;
+ static struct expression *skip_mod;
+
static void undef(struct sm_state *sm, struct expression *mod_expr)
{
+ if (mod_expr == skip_mod)
+ return;
set_state(my_id, sm->name, sm->sym, &undefined);
}
struct expression *get_assigned_expr(struct expression *expr)
{
*** 53,62 ****
--- 57,67 ----
return (struct expression *)state->data;
}
static void match_assignment(struct expression *expr)
{
+ static struct expression *ignored_expr;
struct symbol *left_sym, *right_sym;
char *left_name = NULL;
char *right_name = NULL;
if (expr->op != '=')
*** 70,79 ****
--- 75,90 ----
return;
if (is_whole_rl(rl))
return;
}
+ if (expr->left == ignored_expr)
+ return;
+ ignored_expr = NULL;
+ if (__in_fake_parameter_assign)
+ ignored_expr = expr->left;
+
left_name = expr_to_var_sym(expr->left, &left_sym);
if (!left_name || !left_sym)
goto free;
set_state(my_id, left_name, left_sym, alloc_state_expr(strip_expr(expr->right)));
*** 116,140 ****
--- 127,154 ----
return;
name = get_variable_from_key(arg, key, &sym);
if (!name || !sym)
goto free;
+ skip_mod = expr;
set_state(my_id, name, sym, alloc_state_expr(right));
free:
free_string(name);
}
void register_assigned_expr(int id)
{
my_id = check_assigned_expr_id = id;
+ set_dynamic_states(check_assigned_expr_id);
add_hook(&match_assignment, ASSIGNMENT_HOOK_AFTER);
add_modification_hook(my_id, &undef);
select_return_states_hook(PARAM_SET, &record_param_assignment);
}
void register_assigned_expr_links(int id)
{
link_id = id;
+ set_dynamic_states(link_id);
db_ignore_states(link_id);
set_up_link_functions(my_id, link_id);
}