Print this page
new smatch

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 ↓ 31 lines elided ↑ open up ↑
  32   32  {
  33   33          char *tmp;
  34   34  
  35   35          if (!str)
  36   36                  return NULL;
  37   37          tmp = malloc(strlen(str) + 1);
  38   38          strcpy(tmp, str);
  39   39          return tmp;
  40   40  }
  41   41  
       42 +char *alloc_string_newline(const char *str)
       43 +{
       44 +        char *tmp;
       45 +        int len;
       46 +
       47 +        if (!str)
       48 +                return NULL;
       49 +        len = strlen(str);
       50 +        tmp = malloc(len + 2);
       51 +        snprintf(tmp, len + 2, "%s\n", str);
       52 +        return tmp;
       53 +}
       54 +
  42   55  void free_string(char *str)
  43   56  {
  44   57          free(str);
  45   58  }
  46   59  
  47   60  void remove_parens(char *str)
  48   61  {
  49   62          char *src, *dst;
  50   63  
  51   64          dst = src = str;
↓ open down ↓ 217 lines elided ↑ open up ↑
 269  282                          __get_variable_from_expr(sym_ptr, buf, expr->left, len, complicated, no_parens);
 270  283                          snprintf(tmp, sizeof(tmp), " %s ", show_special(expr->op));
 271  284                          append(buf, tmp, len);
 272  285                  }
 273  286                  __get_variable_from_expr(NULL, buf, expr->right, len, complicated, no_parens);
 274  287                  if (array_expr)
 275  288                          append(buf, "]", len);
 276  289                  return;
 277  290          }
 278  291          case EXPR_VALUE: {
      292 +                sval_t sval = {};
 279  293                  char tmp[25];
 280  294  
 281  295                  *complicated = 1;
 282      -                snprintf(tmp, 25, "%lld", expr->value);
      296 +                if (!get_value(expr, &sval))
      297 +                        return;
      298 +                snprintf(tmp, 25, "%s", sval_to_numstr(sval));
 283  299                  append(buf, tmp, len);
 284  300                  return;
 285  301          }
 286  302          case EXPR_STRING:
 287  303                  append(buf, "\"", len);
 288  304                  if (expr->string)
 289  305                          append(buf, expr->string->data, len);
 290  306                  append(buf, "\"", len);
 291  307                  return;
 292  308          case EXPR_CALL: {
↓ open down ↓ 289 lines elided ↑ open up ↑
 582  598  {
 583  599          if (!expr)
 584  600                  return 0;
 585  601          if (expr->type != EXPR_SYMBOL)
 586  602                  return 0;
 587  603          if (!strcmp(expr->symbol_name->name, name))
 588  604                  return 1;
 589  605          return 0;
 590  606  }
 591  607  
 592      -int is_zero(struct expression *expr)
      608 +int expr_is_zero(struct expression *expr)
 593  609  {
 594  610          sval_t sval;
 595  611  
 596  612          if (get_value(expr, &sval) && sval.value == 0)
 597  613                  return 1;
 598  614          return 0;
 599  615  }
 600  616  
 601  617  int is_array(struct expression *expr)
 602  618  {
↓ open down ↓ 208 lines elided ↑ open up ↑
 811  827                  return 1;
 812  828          if (!get_implied_value(expr, &sval))
 813  829                  return 0;
 814  830          if (sval.value < 0)
 815  831                  return 1;
 816  832          if (cur_func->type == SYM_PTR && sval.value == 0)
 817  833                  return 1;
 818  834          return 0;
 819  835  }
 820  836  
 821      -int getting_address(void)
      837 +int getting_address(struct expression *expr)
 822  838  {
 823      -        struct expression *tmp;
 824      -        int i = 0;
 825      -        int dot_ops = 0;
      839 +        int deref_count = 0;
 826  840  
 827      -        FOR_EACH_PTR_REVERSE(big_expression_stack, tmp) {
 828      -                if (!i++)
 829      -                        continue;
 830      -                if (tmp->type == EXPR_PREOP && tmp->op == '(')
 831      -                        continue;
 832      -                if (tmp->op == '.' && !dot_ops++)
 833      -                        continue;
 834      -                if (tmp->op == '&')
 835      -                        return 1;
 836      -                return 0;
 837      -        } END_FOR_EACH_PTR_REVERSE(tmp);
 838      -        return 0;
      841 +        while ((expr = expr_get_parent_expr(expr))) {
      842 +                if (expr->type == EXPR_PREOP && expr->op == '*') {
      843 +                        /* &foo->bar->baz dereferences "foo->bar" */
      844 +                        if (deref_count == 0)
      845 +                                deref_count++;
      846 +                        return false;
      847 +                }
      848 +                if (expr->type == EXPR_PREOP && expr->op == '&')
      849 +                        return true;
      850 +        }
      851 +        return false;
 839  852  }
 840  853  
 841  854  int get_struct_and_member(struct expression *expr, const char **type, const char **member)
 842  855  {
 843  856          struct symbol *sym;
 844  857  
 845  858          expr = strip_expr(expr);
 846  859          if (expr->type != EXPR_DEREF)
 847  860                  return 0;
 848  861          if (!expr->member)
↓ open down ↓ 354 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX