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_helper.c
          +++ new/usr/src/tools/smatch/src/smatch_helper.c
↓ open down ↓ 139 lines elided ↑ open up ↑
 140  140                  return NULL;
 141  141  
 142  142          FOR_EACH_PTR(args, expr) {
 143  143                  if (i == num)
 144  144                          return expr;
 145  145                  i++;
 146  146          } END_FOR_EACH_PTR(expr);
 147  147          return NULL;
 148  148  }
 149  149  
 150      -static struct expression *get_array_expr(struct expression *expr)
      150 +struct expression *get_array_expr(struct expression *expr)
 151  151  {
 152  152          struct expression *parent;
 153  153          struct symbol *type;
 154  154  
 155  155          if (expr->type != EXPR_BINOP || expr->op != '+')
 156  156                  return NULL;
 157  157  
 158  158          type = get_type(expr->left);
 159  159          if (!type)
 160  160                  return NULL;
↓ open down ↓ 6 lines elided ↑ open up ↑
 167  167          if (!parent)  /* Sometimes we haven't set up the ->parent yet. FIXME!! */
 168  168                  return expr->left;
 169  169          if (parent->type == EXPR_PREOP && parent->op == '*')
 170  170                  return expr->left;
 171  171  
 172  172          return NULL;
 173  173  }
 174  174  
 175  175  static void __get_variable_from_expr(struct symbol **sym_ptr, char *buf,
 176  176                                       struct expression *expr, int len,
 177      -                                     int *complicated, int no_parens)
      177 +                                     int *complicated)
 178  178  {
 179      -
 180      -
 181  179          if (!expr) {
 182  180                  /* can't happen on valid code */
 183  181                  *complicated = 1;
 184  182                  return;
 185  183          }
 186  184  
 187  185          switch (expr->type) {
 188  186          case EXPR_DEREF: {
 189  187                  struct expression *deref;
 190  188                  int op;
↓ open down ↓ 6 lines elided ↑ open up ↑
 197  195                          if (unop->type == EXPR_PREOP && unop->op == '&') {
 198  196                                  deref = unop->unop;
 199  197                                  op = '.';
 200  198                          } else {
 201  199                                  if (!is_pointer(deref) && !is_pointer(deref->unop))
 202  200                                          op = '.';
 203  201                                  deref = deref->unop;
 204  202                          }
 205  203                  }
 206  204  
 207      -                __get_variable_from_expr(sym_ptr, buf, deref, len, complicated, no_parens);
      205 +                __get_variable_from_expr(sym_ptr, buf, deref, len, complicated);
 208  206  
 209  207                  if (op == '*')
 210  208                          append(buf, "->", len);
 211  209                  else
 212  210                          append(buf, ".", len);
 213  211  
 214  212                  if (expr->member)
 215  213                          append(buf, expr->member->name, len);
 216  214                  else
 217  215                          append(buf, "unknown_member", len);
↓ open down ↓ 11 lines elided ↑ open up ↑
 229  227                  return;
 230  228          case EXPR_PREOP: {
 231  229                  const char *tmp;
 232  230  
 233  231                  if (get_expression_statement(expr)) {
 234  232                          *complicated = 2;
 235  233                          return;
 236  234                  }
 237  235  
 238  236                  if (expr->op == '(') {
 239      -                        if (!no_parens && expr->unop->type != EXPR_SYMBOL)
      237 +                        if (expr->unop->type != EXPR_SYMBOL)
 240  238                                  append(buf, "(", len);
 241  239                  } else if (expr->op != '*' || !get_array_expr(expr->unop)) {
 242  240                          tmp = show_special(expr->op);
 243  241                          append(buf, tmp, len);
 244  242                  }
 245  243                  __get_variable_from_expr(sym_ptr, buf, expr->unop,
 246      -                                                 len, complicated, no_parens);
      244 +                                                 len, complicated);
 247  245  
 248      -                if (expr->op == '(' && !no_parens && expr->unop->type != EXPR_SYMBOL)
      246 +                if (expr->op == '(' && expr->unop->type != EXPR_SYMBOL)
 249  247                          append(buf, ")", len);
 250  248  
 251  249                  if (expr->op == SPECIAL_DECREMENT ||
 252      -                                expr->op == SPECIAL_INCREMENT)
      250 +                    expr->op == SPECIAL_INCREMENT)
 253  251                          *complicated = 1;
 254  252  
 255  253                  return;
 256  254          }
 257  255          case EXPR_POSTOP: {
 258  256                  const char *tmp;
 259  257  
 260  258                  __get_variable_from_expr(sym_ptr, buf, expr->unop,
 261      -                                                 len, complicated, no_parens);
      259 +                                                 len, complicated);
 262  260                  tmp = show_special(expr->op);
 263  261                  append(buf, tmp, len);
 264  262  
 265  263                  if (expr->op == SPECIAL_DECREMENT || expr->op == SPECIAL_INCREMENT)
 266  264                          *complicated = 1;
 267  265                  return;
 268  266          }
 269  267          case EXPR_ASSIGNMENT:
 270  268          case EXPR_COMPARE:
 271  269          case EXPR_LOGICAL:
 272  270          case EXPR_BINOP: {
 273  271                  char tmp[10];
 274  272                  struct expression *array_expr;
 275  273  
 276  274                  *complicated = 1;
 277  275                  array_expr = get_array_expr(expr);
 278  276                  if (array_expr) {
 279      -                        __get_variable_from_expr(sym_ptr, buf, array_expr, len, complicated, no_parens);
      277 +                        __get_variable_from_expr(sym_ptr, buf, array_expr, len, complicated);
 280  278                          append(buf, "[", len);
 281  279                  } else {
 282      -                        __get_variable_from_expr(sym_ptr, buf, expr->left, len, complicated, no_parens);
      280 +                        __get_variable_from_expr(sym_ptr, buf, expr->left, len, complicated);
 283  281                          snprintf(tmp, sizeof(tmp), " %s ", show_special(expr->op));
 284  282                          append(buf, tmp, len);
 285  283                  }
 286      -                __get_variable_from_expr(NULL, buf, expr->right, len, complicated, no_parens);
      284 +                __get_variable_from_expr(NULL, buf, expr->right, len, complicated);
 287  285                  if (array_expr)
 288  286                          append(buf, "]", len);
 289  287                  return;
 290  288          }
 291  289          case EXPR_VALUE: {
 292  290                  sval_t sval = {};
 293  291                  char tmp[25];
 294  292  
 295  293                  *complicated = 1;
 296  294                  if (!get_value(expr, &sval))
↓ open down ↓ 17 lines elided ↑ open up ↑
 314  312                  append(buf, "\"", len);
 315  313                  if (expr->string)
 316  314                          append(buf, expr->string->data, len);
 317  315                  append(buf, "\"", len);
 318  316                  return;
 319  317          case EXPR_CALL: {
 320  318                  struct expression *tmp;
 321  319                  int i;
 322  320  
 323  321                  *complicated = 1;
 324      -                __get_variable_from_expr(NULL, buf, expr->fn, len, complicated, no_parens);
      322 +                __get_variable_from_expr(NULL, buf, expr->fn, len, complicated);
 325  323                  append(buf, "(", len);
 326  324                  i = 0;
 327  325                  FOR_EACH_PTR(expr->args, tmp) {
 328  326                          if (i++)
 329  327                                  append(buf, ", ", len);
 330      -                        __get_variable_from_expr(NULL, buf, tmp, len, complicated, no_parens);
      328 +                        __get_variable_from_expr(NULL, buf, tmp, len, complicated);
 331  329                  } END_FOR_EACH_PTR(tmp);
 332  330                  append(buf, ")", len);
 333  331                  return;
 334  332          }
 335  333          case EXPR_CAST:
 336  334          case EXPR_FORCE_CAST:
 337  335                  __get_variable_from_expr(sym_ptr, buf,
 338  336                                           expr->cast_expression, len,
 339      -                                         complicated, no_parens);
      337 +                                         complicated);
 340  338                  return;
 341  339          case EXPR_SIZEOF: {
 342  340                  sval_t sval;
 343  341                  int size;
 344  342                  char tmp[25];
 345  343  
 346  344                  if (expr->cast_type && get_base_type(expr->cast_type)) {
 347  345                          size = type_bytes(get_base_type(expr->cast_type));
 348  346                          snprintf(tmp, 25, "%d", size);
 349  347                          append(buf, tmp, len);
↓ open down ↓ 1 lines elided ↑ open up ↑
 351  349                          snprintf(tmp, 25, "%s", sval_to_str(sval));
 352  350                          append(buf, tmp, len);
 353  351                  }
 354  352                  return;
 355  353          }
 356  354          case EXPR_IDENTIFIER:
 357  355                  *complicated = 1;
 358  356                  if (expr->expr_ident)
 359  357                          append(buf, expr->expr_ident->name, len);
 360  358                  return;
 361      -        default:
      359 +        case EXPR_SELECT:
      360 +        case EXPR_CONDITIONAL:
 362  361                  *complicated = 1;
 363      -                //printf("unknown type = %d\n", expr->type);
      362 +                append(buf, "(", len);
      363 +                __get_variable_from_expr(NULL, buf, expr->conditional, len, complicated);
      364 +                append(buf, ") ?", len);
      365 +                if (expr->cond_true)
      366 +                        __get_variable_from_expr(NULL, buf, expr->cond_true, len, complicated);
      367 +                append(buf, ":", len);
      368 +                __get_variable_from_expr(NULL, buf, expr->cond_false, len, complicated);
 364  369                  return;
      370 +        default: {
      371 +                        char tmp[64];
      372 +
      373 +                        snprintf(tmp, sizeof(tmp), "$expr_%p(%d)", expr, expr->type);
      374 +                        append(buf, tmp, len);
      375 +                        *complicated = 1;
      376 +                }
      377 +                return;
 365  378          }
 366  379  }
 367  380  
 368  381  struct expr_str_cache_results {
 369  382          struct expression *expr;
 370      -        int no_parens;
 371  383          char str[VAR_LEN];
 372  384          struct symbol *sym;
 373  385          int complicated;
 374  386  };
 375  387  
 376  388  static void get_variable_from_expr(struct symbol **sym_ptr, char *buf,
 377  389                                       struct expression *expr, int len,
 378      -                                     int *complicated, int no_parens)
      390 +                                     int *complicated)
 379  391  {
 380  392          static struct expr_str_cache_results cached[8];
 381  393          struct symbol *tmp_sym = NULL;
 382  394          static int idx;
 383  395          int i;
 384  396  
 385  397          for (i = 0; i < ARRAY_SIZE(cached); i++) {
 386      -                if (expr == cached[i].expr &&
 387      -                    no_parens == cached[i].no_parens) {
      398 +                if (expr == cached[i].expr) {
 388  399                          strncpy(buf, cached[i].str, len);
 389  400                          if (sym_ptr)
 390  401                                  *sym_ptr = cached[i].sym;
 391  402                          *complicated = cached[i].complicated;
 392  403                          return;
 393  404                  }
 394  405          }
 395  406  
 396      -        __get_variable_from_expr(&tmp_sym, buf, expr, len, complicated, no_parens);
      407 +        __get_variable_from_expr(&tmp_sym, buf, expr, len, complicated);
 397  408          if (sym_ptr)
 398  409                  *sym_ptr = tmp_sym;
 399  410  
      411 +        if (expr->smatch_flags & Tmp)
      412 +                return;
      413 +
 400  414          cached[idx].expr = expr;
 401      -        cached[idx].no_parens = no_parens;
 402  415          strncpy(cached[idx].str, buf, VAR_LEN);
 403  416          cached[idx].sym = tmp_sym;
 404  417          cached[idx].complicated = *complicated;
 405  418  
 406  419          idx = (idx + 1) % ARRAY_SIZE(cached);
 407  420  }
 408  421  
 409  422  /*
 410  423   * This is returns a stylized "c looking" representation of the
 411  424   * variable name.
↓ open down ↓ 8 lines elided ↑ open up ↑
 420  433          static char var_name[VAR_LEN];
 421  434          int complicated = 0;
 422  435  
 423  436          if (sym_ptr)
 424  437                  *sym_ptr = NULL;
 425  438          var_name[0] = '\0';
 426  439  
 427  440          if (!expr)
 428  441                  return NULL;
 429  442          get_variable_from_expr(sym_ptr, var_name, expr, sizeof(var_name),
 430      -                                 &complicated, 0);
      443 +                               &complicated);
 431  444          if (complicated < 2)
 432  445                  return alloc_string(var_name);
 433  446          else
 434  447                  return NULL;
 435  448  }
 436  449  
 437  450  char *expr_to_str(struct expression *expr)
 438  451  {
 439  452          return expr_to_str_sym(expr, NULL);
 440  453  }
↓ open down ↓ 10 lines elided ↑ open up ↑
 451  464          int complicated = 0;
 452  465  
 453  466          if (sym_ptr)
 454  467                  *sym_ptr = NULL;
 455  468          var_name[0] = '\0';
 456  469  
 457  470          if (!expr)
 458  471                  return NULL;
 459  472          expr = strip_expr(expr);
 460  473          get_variable_from_expr(sym_ptr, var_name, expr, sizeof(var_name),
 461      -                                 &complicated, 1);
      474 +                               &complicated);
 462  475  
 463  476          if (complicated) {
 464  477                  if (sym_ptr)
 465  478                          *sym_ptr = NULL;
 466  479                  return NULL;
 467  480          }
 468  481          return alloc_string(var_name);
 469  482  }
 470  483  
 471  484  char *expr_to_var(struct expression *expr)
↓ open down ↓ 572 lines elided ↑ open up ↑
1044 1057          if (stmt->type == STMT_EXPRESSION)
1045 1058                  return stmt->expression;
1046 1059          return NULL;
1047 1060  }
1048 1061  
1049 1062  int get_param_num_from_sym(struct symbol *sym)
1050 1063  {
1051 1064          struct symbol *tmp;
1052 1065          int i;
1053 1066  
1054      -        if (!cur_func_sym)
1055      -                return -1;
     1067 +        if (!sym)
     1068 +                return UNKNOWN_SCOPE;
1056 1069  
     1070 +        if (sym->ctype.modifiers & MOD_TOPLEVEL) {
     1071 +                if (sym->ctype.modifiers & MOD_STATIC)
     1072 +                        return FILE_SCOPE;
     1073 +                return GLOBAL_SCOPE;
     1074 +        }
     1075 +
     1076 +        if (!cur_func_sym) {
     1077 +                if (!parse_error) {
     1078 +                        sm_msg("warn: internal.  problem with scope:  %s",
     1079 +                               sym->ident ? sym->ident->name : "<anon var>");
     1080 +                }
     1081 +                return GLOBAL_SCOPE;
     1082 +        }
     1083 +
     1084 +
1057 1085          i = 0;
1058 1086          FOR_EACH_PTR(cur_func_sym->ctype.base_type->arguments, tmp) {
1059 1087                  if (tmp == sym)
1060 1088                          return i;
1061 1089                  i++;
1062 1090          } END_FOR_EACH_PTR(tmp);
1063      -        return -1;
     1091 +        return LOCAL_SCOPE;
1064 1092  }
1065 1093  
1066 1094  int get_param_num(struct expression *expr)
1067 1095  {
1068 1096          struct symbol *sym;
1069 1097          char *name;
1070 1098  
1071 1099          if (!cur_func_sym)
1072      -                return -1;
     1100 +                return UNKNOWN_SCOPE;
1073 1101          name = expr_to_var_sym(expr, &sym);
1074 1102          free_string(name);
1075 1103          if (!sym)
1076      -                return -1;
     1104 +                return UNKNOWN_SCOPE;
1077 1105          return get_param_num_from_sym(sym);
1078 1106  }
1079 1107  
1080 1108  struct symbol *get_param_sym_from_num(int num)
1081 1109  {
1082 1110          struct symbol *sym;
1083 1111          int i;
1084 1112  
1085 1113          if (!cur_func_sym)
1086 1114                  return NULL;
↓ open down ↓ 156 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX