Print this page
12724 update smatch to 0.6.1-rc1-il-5

@@ -34,11 +34,10 @@
 #include "smatch_slist.h"
 #include "smatch_extra.h"
 
 static int my_id;
 static int link_id;
-extern int check_assigned_expr_id;
 
 static void match_link_modify(struct sm_state *sm, struct expression *mod_expr);
 
 struct string_list *__ignored_macros = NULL;
 int in_warn_on_macro(void)

@@ -170,15 +169,20 @@
 }
 
 static bool in_param_set;
 void set_extra_mod_helper(const char *name, struct symbol *sym, struct expression *expr, struct smatch_state *state)
 {
+        struct expression *faked;
+
         if (!expr)
                 expr = gen_expression_from_name_sym(name, sym);
         remove_from_equiv(name, sym);
         set_union_info(name, sym, expr, state);
         call_extra_mod_hooks(name, sym, expr, state);
+        faked = get_faked_expression();
+        if (!faked ||
+            (faked->type == EXPR_ASSIGNMENT && is_fresh_alloc(faked->right)))
         update_mtag_data(expr, state);
         if (in_param_set &&
             estate_is_unknown(state) && !get_state(SMATCH_EXTRA, name, sym))
                 return;
         set_state(SMATCH_EXTRA, name, sym, state);

@@ -2798,23 +2802,19 @@
 {
         struct expression *expr;
         struct range_list *rl = NULL;
         struct smatch_state *state;
         struct symbol *type;
-        char fullname[256];
         char *key_orig = key;
-        bool add_star = false;
+        char *fullname;
         sval_t dummy;
 
-        if (key[0] == '*') {
-                add_star = true;
-                key++;
-        }
-
-        snprintf(fullname, 256, "%s%s%s", add_star ? "*" : "", name, key + 1);
-
         expr = symbol_expression(sym);
+        fullname = get_variable_from_key(expr, key, NULL);
+        if (!fullname)
+                return;
+
         type = get_member_type_from_key(expr, key_orig);
         str_to_rl(type, value, &rl);
         state = alloc_estate_rl(rl);
         if (estate_get_single_value(state, &dummy))
                 estate_set_hard_max(state);

@@ -2821,21 +2821,20 @@
         set_state(SMATCH_EXTRA, fullname, sym, state);
 }
 
 static void set_param_fuzzy_max(const char *name, struct symbol *sym, char *key, char *value)
 {
+        struct expression *expr;
         struct range_list *rl = NULL;
         struct smatch_state *state;
         struct symbol *type;
-        char fullname[256];
+        char *fullname;
         sval_t max;
 
-        if (strcmp(key, "*$") == 0)
-                snprintf(fullname, sizeof(fullname), "*%s", name);
-        else if (strncmp(key, "$", 1) == 0)
-                snprintf(fullname, 256, "%s%s", name, key + 1);
-        else
+        expr = symbol_expression(sym);
+        fullname = get_variable_from_key(expr, key, NULL);
+        if (!fullname)
                 return;
 
         state = get_state(SMATCH_EXTRA, fullname, sym);
         if (!state)
                 return;

@@ -2847,17 +2846,16 @@
 }
 
 static void set_param_hard_max(const char *name, struct symbol *sym, char *key, char *value)
 {
         struct smatch_state *state;
-        char fullname[256];
+        struct expression *expr;
+        char *fullname;
 
-        if (strcmp(key, "*$") == 0)
-                snprintf(fullname, sizeof(fullname), "*%s", name);
-        else if (strncmp(key, "$", 1) == 0)
-                snprintf(fullname, 256, "%s%s", name, key + 1);
-        else
+        expr = symbol_expression(sym);
+        fullname = get_variable_from_key(expr, key, NULL);
+        if (!fullname)
                 return;
 
         state = get_state(SMATCH_EXTRA, fullname, sym);
         if (!state)
                 return;