Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_parse_call_math.c
          +++ new/usr/src/tools/smatch/src/smatch_parse_call_math.c
↓ open down ↓ 106 lines elided ↑ open up ↑
 107  107  }
 108  108  
 109  109  static void rl_discard_stacks(void)
 110  110  {
 111  111          while (op_list)
 112  112                  pop_op();
 113  113          while (rl_stack)
 114  114                  pop_rl(&rl_stack);
 115  115  }
 116  116  
 117      -static int read_rl_from_var(struct expression *call, char *p, char **end, struct range_list **rl)
      117 +static int read_rl_from_var(struct expression *call, const char *p, const char **end, struct range_list **rl)
 118  118  {
 119  119          struct expression *arg;
 120  120          struct smatch_state *state;
 121  121          long param;
 122  122          char *name;
 123  123          struct symbol *sym;
 124  124          char buf[256];
 125  125          int star;
 126  126  
 127  127          p++;
 128      -        param = strtol(p, &p, 10);
      128 +        param = strtol(p, (char **)&p, 10);
 129  129  
 130  130          arg = get_argument_from_call_expr(call->args, param);
 131  131          if (!arg)
 132  132                  return 0;
 133  133  
 134  134          if (*p != '-' && *p != '.') {
 135  135                  get_absolute_rl(arg, rl);
 136  136                  *end = p;
 137  137                  return 1;
 138  138          }
↓ open down ↓ 19 lines elided ↑ open up ↑
 158  158                  return 0;
 159  159          strncat(buf, p, *end - p);
 160  160  
 161  161          state = get_state(SMATCH_EXTRA, buf, sym);
 162  162          if (!state)
 163  163                  return 0;
 164  164          *rl = estate_rl(state);
 165  165          return 1;
 166  166  }
 167  167  
 168      -static int read_var_num(struct expression *call, char *p, char **end, struct range_list **rl)
      168 +static int read_var_num(struct expression *call, const char *p, const char **end, struct range_list **rl)
 169  169  {
 170  170          sval_t sval;
 171  171  
 172  172          while (*p == ' ')
 173  173                  p++;
 174  174  
 175  175          if (*p == '$')
 176  176                  return read_rl_from_var(call, p, end, rl);
 177  177  
 178  178          sval.type = &llong_ctype;
 179      -        sval.value = strtoll(p, end, 10);
      179 +        sval.value = strtoll(p, (char **)end, 10);
 180  180          if (*end == p)
 181  181                  return 0;
 182  182          *rl = alloc_rl(sval, sval);
 183  183          return 1;
 184  184  }
 185  185  
 186      -static char *read_op(char *p)
      186 +static const char *read_op(const char *p)
 187  187  {
 188  188          while (*p == ' ')
 189  189                  p++;
 190  190  
 191  191          switch (*p) {
 192  192          case '+':
 193  193          case '-':
 194  194          case '*':
 195  195          case '/':
 196  196                  return p;
 197  197          default:
 198  198                  return NULL;
 199  199          }
 200  200  }
 201  201  
 202      -int parse_call_math_rl(struct expression *call, char *math, struct range_list **rl)
      202 +int parse_call_math_rl(struct expression *call, const char *math, struct range_list **rl)
 203  203  {
 204  204          struct range_list *tmp;
 205      -        char *c;
      205 +        const char *c;
 206  206  
 207  207          /* try to implement shunting yard algorithm. */
 208  208  
 209      -        c = (char *)math;
      209 +        c = math;
 210  210          while (1) {
 211  211                  if (option_debug)
 212  212                          sm_msg("parsing %s", c);
 213  213  
 214  214                  /* read a number and push it onto the number stack */
 215  215                  if (!read_var_num(call, c, &c, &tmp))
 216  216                          goto fail;
 217  217                  push_rl(&rl_stack, tmp);
 218  218  
 219  219                  if (option_debug)
↓ open down ↓ 117 lines elided ↑ open up ↑
 337  337  {
 338  338          char *name;
 339  339          struct symbol *sym;
 340  340  
 341  341          name = map_call_to_param_name_sym(expr, &sym);
 342  342          if (param_was_set_var_sym(name, sym))
 343  343                  return 0;
 344  344          return format_name_sym_helper(buf, remaining, name, sym);
 345  345  }
 346  346  
      347 +static int is_mtag_sval(sval_t sval)
      348 +{
      349 +        if (!is_ptr_type(sval.type))
      350 +                return 0;
      351 +        if (sval_cmp(sval, valid_ptr_min_sval) >= 0 &&
      352 +            sval_cmp(sval, valid_ptr_max_sval) <= 0)
      353 +                return 1;
      354 +        return 0;
      355 +}
      356 +
 347  357  static int format_expr_helper(char *buf, int remaining, struct expression *expr)
 348  358  {
 349  359          sval_t sval;
 350  360          int ret;
 351  361          char *cur;
 352  362  
 353  363          if (!expr)
 354  364                  return 0;
 355  365  
 356  366          cur = buf;
↓ open down ↓ 16 lines elided ↑ open up ↑
 373  383                  ret = format_expr_helper(cur, remaining, expr->right);
 374  384                  if (ret == 0)
 375  385                          return 0;
 376  386                  remaining -= ret;
 377  387                  if (remaining <= 0)
 378  388                          return 0;
 379  389                  cur += ret;
 380  390                  return cur - buf;
 381  391          }
 382  392  
 383      -        if (get_implied_value(expr, &sval)) {
      393 +        if (!param_was_set(expr) && get_implied_value(expr, &sval) && !is_mtag_sval(sval)) {
 384  394                  ret = snprintf(cur, remaining, "%s", sval_to_str(sval));
 385  395                  remaining -= ret;
 386  396                  if (remaining <= 0)
 387  397                          return 0;
 388  398                  return ret;
 389  399          }
 390  400  
 391  401          if (expr->type == EXPR_CALL)
 392  402                  return format_call_to_param_mapping(cur, remaining, expr);
 393  403  
↓ open down ↓ 34 lines elided ↑ open up ↑
 428  438  
 429  439          return alloc_sname(buf);
 430  440  }
 431  441  
 432  442  char *get_value_in_terms_of_parameter_math_var_sym(const char *name, struct symbol *sym)
 433  443  {
 434  444          struct expression *tmp, *expr;
 435  445          char buf[256] = "";
 436  446          int ret;
 437  447          int cnt = 0;
      448 +        sval_t sval;
 438  449  
 439  450          expr = get_assigned_expr_name_sym(name, sym);
 440  451          if (!expr)
 441  452                  return NULL;
 442  453          while ((tmp = get_assigned_expr(expr))) {
 443  454                  expr = strip_expr(tmp);
 444  455                  if (++cnt > 3)
 445  456                          break;
 446  457          }
 447  458  
      459 +        if (get_implied_value(expr, &sval))
      460 +                return NULL;
      461 +
 448  462          ret = format_expr_helper(buf, sizeof(buf), expr);
 449  463          if (ret == 0)
 450  464                  return NULL;
 451  465  
 452  466          return alloc_sname(buf);
 453  467  
 454  468  }
 455  469  
 456  470  static void match_alloc(const char *fn, struct expression *expr, void *_size_arg)
 457  471  {
↓ open down ↓ 28 lines elided ↑ open up ↑
 486  500                          return NULL;
 487  501                  return format_expr(arg);
 488  502          }
 489  503  
 490  504          buf[0] = '\0';
 491  505          p = format;
 492  506          out = buf;
 493  507          while (*p) {
 494  508                  if (*p == '$') {
 495  509                          p++;
 496      -                        param = strtol(p, &p, 10);
      510 +                        param = strtol(p, (char **)&p, 10);
 497  511                          arg = get_argument_from_call_expr(call->args, param);
 498  512                          if (!arg)
 499  513                                  return NULL;
 500  514                          param = get_arg_number(arg);
 501  515                          if (param >= 0) {
 502  516                                  ret = snprintf(out, buf + sizeof(buf) - out, "$%ld", param);
 503  517                                  out += ret;
 504  518                                  if (out >= buf + sizeof(buf))
 505  519                                          return NULL;
 506  520                          } else if (get_implied_value(arg, &sval)) {
↓ open down ↓ 129 lines elided ↑ open up ↑
 636  650  free:
 637  651          free_string(name);
 638  652  }
 639  653  
 640  654  void register_parse_call_math(int id)
 641  655  {
 642  656          int i;
 643  657  
 644  658          my_id = id;
 645  659  
      660 +        set_dynamic_states(my_id);
      661 +
 646  662          for (i = 0; i < ARRAY_SIZE(alloc_functions); i++)
 647  663                  add_function_assign_hook(alloc_functions[i].func, &match_alloc,
 648  664                                           INT_PTR(alloc_functions[i].param));
 649  665          add_hook(&match_call_assignment, CALL_ASSIGNMENT_HOOK);
 650  666          add_split_return_callback(print_returned_allocations);
 651  667  }
 652  668  
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX