Print this page
11506 smatch resync

@@ -26,12 +26,16 @@
 
 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,10 +57,11 @@
         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,10 +75,16 @@
                         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,25 +127,28 @@
                 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);
 }