Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_return_to_param.c
          +++ new/usr/src/tools/smatch/src/smatch_return_to_param.c
↓ open down ↓ 48 lines elided ↑ open up ↑
  49   49          set_state(my_id, sm->name, sm->sym, &undefined);
  50   50  }
  51   51  
  52   52  char *map_call_to_other_name_sym(const char *name, struct symbol *sym, struct symbol **new_sym)
  53   53  {
  54   54          struct smatch_state *state;
  55   55          int skip;
  56   56          char buf[256];
  57   57  
  58   58          /* skip 'foo->'.  This was checked in the caller. */
  59      -        skip = strlen(sym->ident->name) + 2;
       59 +        skip = sym->ident->len + 2;
  60   60  
  61   61          state = get_state(my_id, sym->ident->name, sym);
  62   62          if (!state || !state->data)
  63   63                  return NULL;
  64   64  
  65   65          snprintf(buf, sizeof(buf), "%s->%s", state->name, name + skip);
  66   66          *new_sym = state->data;
  67   67          return alloc_string(buf);
  68   68  }
  69   69  
↓ open down ↓ 10 lines elided ↑ open up ↑
  80   80  
  81   81          if (name[len] == '.')
  82   82                  return NULL;
  83   83          if (!stack && name[len] != '-')
  84   84                  return NULL;
  85   85          snprintf(buf, sizeof(buf), "%s%s", sm->name, name + len);
  86   86          *new_sym = sm->sym;
  87   87          return alloc_string(buf);
  88   88  }
  89   89  
  90      -static char *map_assignment_long_to_short(struct sm_state *sm, const char *name, struct symbol *sym, struct symbol **new_sym, bool stack)
  91      -{
  92      -        struct expression *orig_expr;
  93      -        struct symbol *orig_sym;
  94      -        int len;
  95      -        char buf[256];
  96      -
  97      -        orig_expr = sm->state->data;
  98      -        if (!orig_expr)
  99      -                return NULL;
 100      -
 101      -        /*
 102      -         * Say we have an assignment like:
 103      -         *     foo->bar->my_ptr = my_ptr;
 104      -         * We still expect the function to carry on using "my_ptr" as the
 105      -         * shorter name.  That's not a long to short mapping.
 106      -         *
 107      -         */
 108      -        if (orig_expr->type == EXPR_SYMBOL)
 109      -                return NULL;
 110      -
 111      -        orig_sym = expr_to_sym(orig_expr);
 112      -        if (!orig_sym)
 113      -                return NULL;
 114      -        if (sym != orig_sym)
 115      -                return NULL;
 116      -
 117      -        len = strlen(sm->state->name);
 118      -        if (strncmp(name, sm->state->name, len) != 0)
 119      -                return NULL;
 120      -
 121      -        if (name[len] == '.')
 122      -                return NULL;
 123      -        if (!stack && name[len] != '-')
 124      -                return NULL;
 125      -        snprintf(buf, sizeof(buf), "%s%s", sm->name, name + len);
 126      -        *new_sym = sm->sym;
 127      -        return alloc_string(buf);
 128      -}
 129      -
 130   90  /*
 131   91   * Normally, we expect people to consistently refer to variables by the shortest
 132   92   * name.  So they use "b->a" instead of "foo->bar.a" when both point to the
 133   93   * same memory location.  However, when we're dealing across function boundaries
 134   94   * then sometimes we pass frob(foo) which sets foo->bar.a.  In that case, we
 135   95   * translate it to the shorter name.  Smatch extra updates the shorter name,
 136   96   * which in turn updates the longer name.
 137   97   *
 138   98   */
 139      -static char *map_long_to_short_name_sym_helper(const char *name, struct symbol *sym, struct symbol **new_sym, bool stack)
       99 +char *map_long_to_short_name_sym(const char *name, struct symbol *sym, struct symbol **new_sym, bool use_stack)
 140  100  {
 141  101          char *ret;
 142  102          struct sm_state *sm;
 143  103  
 144  104          *new_sym = NULL;
 145  105  
 146  106          FOR_EACH_SM(__get_cur_stree(), sm) {
 147  107                  if (sm->owner == my_id) {
 148      -                        ret = map_my_state_long_to_short(sm, name, sym, new_sym, stack);
 149      -                        if (ret)
      108 +                        ret = map_my_state_long_to_short(sm, name, sym, new_sym, use_stack);
      109 +                        if (ret) {
      110 +                                if (local_debug)
      111 +                                        sm_msg("%s: my_state: name = '%s' sm = '%s'",
      112 +                                               __func__, name, show_sm(sm));
 150  113                                  return ret;
      114 +                        }
 151  115                          continue;
 152  116                  }
 153      -                if (sm->owner == check_assigned_expr_id) {
 154      -                        ret = map_assignment_long_to_short(sm, name, sym, new_sym, stack);
 155      -                        if (ret)
 156      -                                return ret;
 157      -                        continue;
 158      -                }
 159  117          } END_FOR_EACH_SM(sm);
 160  118  
 161  119          return NULL;
 162  120  }
 163  121  
 164      -char *map_long_to_short_name_sym(const char *name, struct symbol *sym, struct symbol **new_sym)
 165      -{
 166      -        return map_long_to_short_name_sym_helper(name, sym, new_sym, 1);
 167      -}
 168      -
 169      -char *map_long_to_short_name_sym_nostack(const char *name, struct symbol *sym, struct symbol **new_sym)
 170      -{
 171      -        return map_long_to_short_name_sym_helper(name, sym, new_sym, 0);
 172      -}
 173      -
 174  122  char *map_call_to_param_name_sym(struct expression *expr, struct symbol **sym)
 175  123  {
 176  124          char *name;
 177  125          struct symbol *start_sym;
 178  126          struct smatch_state *state;
 179  127  
 180  128          *sym = NULL;
 181  129  
 182  130          name = expr_to_str_sym(expr, &start_sym);
 183  131          if (!name)
↓ open down ↓ 89 lines elided ↑ open up ↑
 273  221  
 274  222          }
 275  223  
 276  224  free:
 277  225          free_string(left_name);
 278  226  }
 279  227  
 280  228  void register_return_to_param(int id)
 281  229  {
 282  230          my_id = id;
      231 +        set_dynamic_states(my_id);
 283  232          add_modification_hook(my_id, &undef);
 284  233  }
 285  234  
 286  235  void register_return_to_param_links(int id)
 287  236  {
 288  237          link_id = id;
 289  238          set_up_link_functions(my_id, link_id);
 290  239  }
 291  240  
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX