Print this page
11506 smatch resync

@@ -74,10 +74,22 @@
                 return s1;
 
         return &merged;
 }
 
+static bool is_local_var(struct expression *expr)
+{
+        struct symbol *sym;
+
+        if (!expr || expr->type != EXPR_SYMBOL)
+                return false;
+        sym = expr->symbol;
+        if (!(sym->ctype.modifiers & MOD_TOPLEVEL))
+                return true;
+        return false;
+}
+
 static void match_assign(struct expression *expr)
 {
         struct expression *left;
         struct symbol *right_sym;
         char *name;

@@ -86,10 +98,12 @@
         int param;
 
         if (expr->op != '=')
                 return;
         left = strip_expr(expr->left);
+        if (is_local_var(left))
+                return;
         right_sym = expr_to_sym(expr->right);
         if (!right_sym)
                 return;
 
         param = get_param_num_from_sym(right_sym);

@@ -103,32 +117,10 @@
                 return;
         set_state_expr(my_id, expr->right, alloc_tag_data_state(tag, name, offset));
         free_string(name);
 }
 
-#if 0
-static void save_mtag_to_map(struct expression *expr, mtag_t tag, int offset, int param, char *key, char *value)
-{
-        struct expression *arg, *gen_expr;
-        mtag_t arg_tag;
-
-        arg = get_argument_from_call_expr(expr->args, param);
-        if (!arg)
-                return;
-
-        gen_expr = gen_expression_from_key(arg, key);
-        if (!gen_expr)
-                return;
-
-        if (!get_mtag(gen_expr, &arg_tag))
-                arg_tag = 0;
-
-        if (local_debug)
-                sm_msg("finding mtag for '%s' %lld", expr_to_str(gen_expr), arg_tag);
-}
-#endif
-
 static void propogate_assignment(struct expression *expr, mtag_t tag, int offset, int param, char *key)
 {
         struct expression *arg;
         int orig_param;
         char buf[32];

@@ -156,10 +148,11 @@
 {
         struct expression *arg, *gen_expr;
         struct range_list *rl;
         mtag_t arg_tag;
         mtag_t alias;
+        int arg_offset;
 
         arg = get_argument_from_call_expr(expr->args, param);
         if (!arg)
                 return;
 

@@ -172,11 +165,12 @@
         if (!create_mtag_alias(tag, expr, &alias))
                 return;
 
 //      insert_mtag_data(alias, offset, rl);
 
-        if (get_mtag(gen_expr, &arg_tag))
+        // FIXME:  is arg_offset handled correctly?
+        if (expr_to_mtag_offset(gen_expr, &arg_tag, &arg_offset) && arg_offset == 0)
                 sql_insert_mtag_map(arg_tag, -offset, alias);
 }
 
 static void call_does_mtag_assign(struct expression *expr, int param, char *key, char *value)
 {

@@ -227,10 +221,11 @@
 
 void register_param_to_mtag_data(int id)
 {
         my_id = id;
 
+        set_dynamic_states(my_id);
         add_hook(&match_assign, ASSIGNMENT_HOOK);
         select_return_states_hook(MTAG_ASSIGN, &call_does_mtag_assign);
         add_merge_hook(my_id, &merge_tag_info);
         add_split_return_callback(&print_stored_to_mtag);
 }