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

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_extra.c
          +++ new/usr/src/tools/smatch/src/smatch_extra.c
↓ open down ↓ 28 lines elided ↑ open up ↑
  29   29  #define __USE_ISOC99
  30   30  #endif
  31   31  #include <limits.h>
  32   32  #include "parse.h"
  33   33  #include "smatch.h"
  34   34  #include "smatch_slist.h"
  35   35  #include "smatch_extra.h"
  36   36  
  37   37  static int my_id;
  38   38  static int link_id;
  39      -extern int check_assigned_expr_id;
  40   39  
  41   40  static void match_link_modify(struct sm_state *sm, struct expression *mod_expr);
  42   41  
  43   42  struct string_list *__ignored_macros = NULL;
  44   43  int in_warn_on_macro(void)
  45   44  {
  46   45          struct statement *stmt;
  47   46          char *tmp;
  48   47          char *macro;
  49   48  
↓ open down ↓ 115 lines elided ↑ open up ↑
 165  164                  } END_FOR_EACH_PTR(inner);
 166  165          } END_FOR_EACH_PTR(tmp);
 167  166  
 168  167  done:
 169  168          in_recurse = false;
 170  169  }
 171  170  
 172  171  static bool in_param_set;
 173  172  void set_extra_mod_helper(const char *name, struct symbol *sym, struct expression *expr, struct smatch_state *state)
 174  173  {
      174 +        struct expression *faked;
      175 +
 175  176          if (!expr)
 176  177                  expr = gen_expression_from_name_sym(name, sym);
 177  178          remove_from_equiv(name, sym);
 178  179          set_union_info(name, sym, expr, state);
 179  180          call_extra_mod_hooks(name, sym, expr, state);
 180      -        update_mtag_data(expr, state);
      181 +        faked = get_faked_expression();
      182 +        if (!faked ||
      183 +            (faked->type == EXPR_ASSIGNMENT && is_fresh_alloc(faked->right)))
      184 +                update_mtag_data(expr, state);
 181  185          if (in_param_set &&
 182  186              estate_is_unknown(state) && !get_state(SMATCH_EXTRA, name, sym))
 183  187                  return;
 184  188          set_state(SMATCH_EXTRA, name, sym, state);
 185  189  }
 186  190  
 187  191  static void set_extra_nomod_helper(const char *name, struct symbol *sym, struct expression *expr, struct smatch_state *state)
 188  192  {
 189  193          call_extra_nomod_hooks(name, sym, expr, state);
 190  194          set_state(SMATCH_EXTRA, name, sym, state);
↓ open down ↓ 2602 lines elided ↑ open up ↑
2793 2797                  i++;
2794 2798          } END_FOR_EACH_PTR(arg);
2795 2799  }
2796 2800  
2797 2801  static void set_param_value(const char *name, struct symbol *sym, char *key, char *value)
2798 2802  {
2799 2803          struct expression *expr;
2800 2804          struct range_list *rl = NULL;
2801 2805          struct smatch_state *state;
2802 2806          struct symbol *type;
2803      -        char fullname[256];
2804 2807          char *key_orig = key;
2805      -        bool add_star = false;
     2808 +        char *fullname;
2806 2809          sval_t dummy;
2807 2810  
2808      -        if (key[0] == '*') {
2809      -                add_star = true;
2810      -                key++;
2811      -        }
2812      -
2813      -        snprintf(fullname, 256, "%s%s%s", add_star ? "*" : "", name, key + 1);
2814      -
2815 2811          expr = symbol_expression(sym);
     2812 +        fullname = get_variable_from_key(expr, key, NULL);
     2813 +        if (!fullname)
     2814 +                return;
     2815 +
2816 2816          type = get_member_type_from_key(expr, key_orig);
2817 2817          str_to_rl(type, value, &rl);
2818 2818          state = alloc_estate_rl(rl);
2819 2819          if (estate_get_single_value(state, &dummy))
2820 2820                  estate_set_hard_max(state);
2821 2821          set_state(SMATCH_EXTRA, fullname, sym, state);
2822 2822  }
2823 2823  
2824 2824  static void set_param_fuzzy_max(const char *name, struct symbol *sym, char *key, char *value)
2825 2825  {
     2826 +        struct expression *expr;
2826 2827          struct range_list *rl = NULL;
2827 2828          struct smatch_state *state;
2828 2829          struct symbol *type;
2829      -        char fullname[256];
     2830 +        char *fullname;
2830 2831          sval_t max;
2831 2832  
2832      -        if (strcmp(key, "*$") == 0)
2833      -                snprintf(fullname, sizeof(fullname), "*%s", name);
2834      -        else if (strncmp(key, "$", 1) == 0)
2835      -                snprintf(fullname, 256, "%s%s", name, key + 1);
2836      -        else
     2833 +        expr = symbol_expression(sym);
     2834 +        fullname = get_variable_from_key(expr, key, NULL);
     2835 +        if (!fullname)
2837 2836                  return;
2838 2837  
2839 2838          state = get_state(SMATCH_EXTRA, fullname, sym);
2840 2839          if (!state)
2841 2840                  return;
2842 2841          type = estate_type(state);
2843 2842          str_to_rl(type, value, &rl);
2844 2843          if (!rl_to_sval(rl, &max))
2845 2844                  return;
2846 2845          estate_set_fuzzy_max(state, max);
2847 2846  }
2848 2847  
2849 2848  static void set_param_hard_max(const char *name, struct symbol *sym, char *key, char *value)
2850 2849  {
2851 2850          struct smatch_state *state;
2852      -        char fullname[256];
     2851 +        struct expression *expr;
     2852 +        char *fullname;
2853 2853  
2854      -        if (strcmp(key, "*$") == 0)
2855      -                snprintf(fullname, sizeof(fullname), "*%s", name);
2856      -        else if (strncmp(key, "$", 1) == 0)
2857      -                snprintf(fullname, 256, "%s%s", name, key + 1);
2858      -        else
     2854 +        expr = symbol_expression(sym);
     2855 +        fullname = get_variable_from_key(expr, key, NULL);
     2856 +        if (!fullname)
2859 2857                  return;
2860 2858  
2861 2859          state = get_state(SMATCH_EXTRA, fullname, sym);
2862 2860          if (!state)
2863 2861                  return;
2864 2862          estate_set_hard_max(state);
2865 2863  }
2866 2864  
2867 2865  struct sm_state *get_extra_sm_state(struct expression *expr)
2868 2866  {
↓ open down ↓ 89 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX