Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_assigned_expr.c
          +++ new/usr/src/tools/smatch/src/smatch_assigned_expr.c
↓ open down ↓ 20 lines elided ↑ open up ↑
  21   21   */
  22   22  
  23   23  #include "smatch.h"
  24   24  #include "smatch_slist.h"
  25   25  #include "smatch_extra.h"
  26   26  
  27   27  int check_assigned_expr_id;
  28   28  static int my_id;
  29   29  static int link_id;
  30   30  
       31 +static struct expression *skip_mod;
       32 +
  31   33  static void undef(struct sm_state *sm, struct expression *mod_expr)
  32   34  {
       35 +        if (mod_expr == skip_mod)
       36 +                return;
  33   37          set_state(my_id, sm->name, sm->sym, &undefined);
  34   38  }
  35   39  
  36   40  struct expression *get_assigned_expr(struct expression *expr)
  37   41  {
  38   42          struct smatch_state *state;
  39   43  
  40   44          state = get_state_expr(my_id, expr);
  41   45          if (!state)
  42   46                  return NULL;
↓ open down ↓ 5 lines elided ↑ open up ↑
  48   52          struct smatch_state *state;
  49   53  
  50   54          state = get_state(my_id, name, sym);
  51   55          if (!state)
  52   56                  return NULL;
  53   57          return (struct expression *)state->data;
  54   58  }
  55   59  
  56   60  static void match_assignment(struct expression *expr)
  57   61  {
       62 +        static struct expression *ignored_expr;
  58   63          struct symbol *left_sym, *right_sym;
  59   64          char *left_name = NULL;
  60   65          char *right_name = NULL;
  61   66  
  62   67          if (expr->op != '=')
  63   68                  return;
  64   69          if (is_fake_call(expr->right))
  65   70                  return;
  66   71          if (__in_fake_struct_assign) {
  67   72                  struct range_list *rl;
  68   73  
  69   74                  if (!get_implied_rl(expr->right, &rl))
  70   75                          return;
  71   76                  if (is_whole_rl(rl))
  72   77                          return;
  73   78          }
  74   79  
       80 +        if (expr->left == ignored_expr)
       81 +                return;
       82 +        ignored_expr = NULL;
       83 +        if (__in_fake_parameter_assign)
       84 +                ignored_expr = expr->left;
       85 +
  75   86          left_name = expr_to_var_sym(expr->left, &left_sym);
  76   87          if (!left_name || !left_sym)
  77   88                  goto free;
  78   89          set_state(my_id, left_name, left_sym, alloc_state_expr(strip_expr(expr->right)));
  79   90  
  80   91          right_name = expr_to_var_sym(expr->right, &right_sym);
  81   92          if (!right_name || !right_sym)
  82   93                  goto free;
  83   94  
  84   95          store_link(link_id, right_name, right_sym, left_name, left_sym);
↓ open down ↓ 26 lines elided ↑ open up ↑
 111  122                  return;
 112  123  
 113  124          arg = get_argument_from_call_expr(expr->args, param);
 114  125          right = get_argument_from_call_expr(expr->args, right_param);
 115  126          if (!right || !arg)
 116  127                  return;
 117  128          name = get_variable_from_key(arg, key, &sym);
 118  129          if (!name || !sym)
 119  130                  goto free;
 120  131  
      132 +        skip_mod = expr;
 121  133          set_state(my_id, name, sym, alloc_state_expr(right));
 122  134  free:
 123  135          free_string(name);
 124  136  }
 125  137  
 126  138  void register_assigned_expr(int id)
 127  139  {
 128  140          my_id = check_assigned_expr_id = id;
      141 +        set_dynamic_states(check_assigned_expr_id);
 129  142          add_hook(&match_assignment, ASSIGNMENT_HOOK_AFTER);
 130  143          add_modification_hook(my_id, &undef);
 131  144          select_return_states_hook(PARAM_SET, &record_param_assignment);
 132  145  }
 133  146  
 134  147  void register_assigned_expr_links(int id)
 135  148  {
 136  149          link_id = id;
      150 +        set_dynamic_states(link_id);
 137  151          db_ignore_states(link_id);
 138  152          set_up_link_functions(my_id, link_id);
 139  153  }
 140  154  
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX