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_type.c
          +++ new/usr/src/tools/smatch/src/smatch_type.c
↓ open down ↓ 543 lines elided ↑ open up ↑
 544  544  int is_string(struct expression *expr)
 545  545  {
 546  546          expr = strip_expr(expr);
 547  547          if (!expr || expr->type != EXPR_STRING)
 548  548                  return 0;
 549  549          if (expr->string)
 550  550                  return 1;
 551  551          return 0;
 552  552  }
 553  553  
      554 +bool is_struct_ptr(struct symbol *type)
      555 +{
      556 +        if (!type || type->type != SYM_PTR)
      557 +                return false;
      558 +        type = get_real_base_type(type);
      559 +        if (!type || type->type != SYM_STRUCT)
      560 +                return false;
      561 +        return true;
      562 +}
      563 +
 554  564  int is_static(struct expression *expr)
 555  565  {
 556  566          char *name;
 557  567          struct symbol *sym;
 558  568          int ret = 0;
 559  569  
 560  570          name = expr_to_str_sym(expr, &sym);
 561  571          if (!name || !sym)
 562  572                  goto free;
 563  573  
↓ open down ↓ 24 lines elided ↑ open up ↑
 588  598                  return 0;
 589  599          if (one->type != two->type)
 590  600                  return 0;
 591  601          if (one->type == SYM_PTR)
 592  602                  return types_equiv(get_real_base_type(one), get_real_base_type(two));
 593  603          if (type_positive_bits(one) != type_positive_bits(two))
 594  604                  return 0;
 595  605          return 1;
 596  606  }
 597  607  
      608 +bool type_fits(struct symbol *type, struct symbol *test)
      609 +{
      610 +        if (!type || !test)
      611 +                return false;
      612 +
      613 +        if (type == test)
      614 +                return true;
      615 +
      616 +        if (type_bits(test) > type_bits(type))
      617 +                return false;
      618 +        if (type_signed(test) && !type_signed(type))
      619 +                return false;
      620 +        if (type_positive_bits(test) > type_positive_bits(type))
      621 +                return false;
      622 +        return true;
      623 +}
      624 +
 598  625  int fn_static(void)
 599  626  {
 600  627          return !!(cur_func_sym->ctype.modifiers & MOD_STATIC);
 601  628  }
 602  629  
 603  630  const char *global_static(void)
 604  631  {
 605  632          if (cur_func_sym->ctype.modifiers & MOD_STATIC)
 606  633                  return "static";
 607  634          else
↓ open down ↓ 70 lines elided ↑ open up ↑
 678  705                  }
 679  706  
 680  707          } END_FOR_EACH_PTR(tmp);
 681  708  
 682  709          return NULL;
 683  710  }
 684  711  
 685  712  struct symbol *get_member_type_from_key(struct expression *expr, const char *key)
 686  713  {
 687  714          struct symbol *sym;
      715 +        int star = 0;
      716 +        int i;
 688  717  
 689  718          if (strcmp(key, "$") == 0)
 690  719                  return get_type(expr);
 691  720  
 692  721          if (strcmp(key, "*$") == 0) {
 693  722                  sym = get_type(expr);
 694  723                  if (!sym || sym->type != SYM_PTR)
 695  724                          return NULL;
 696  725                  return get_real_base_type(sym);
 697  726          }
 698  727  
 699  728          sym = get_type(expr);
 700  729          if (!sym)
 701  730                  return NULL;
 702  731          if (sym->type == SYM_PTR)
 703  732                  sym = get_real_base_type(sym);
 704  733  
 705      -        key = key + 1;
      734 +        while (*key == '*') {
      735 +                key++;
      736 +                star++;
      737 +        }
      738 +
      739 +        if (*key != '$')
      740 +                return NULL;
      741 +        key++;
      742 +
 706  743          sym = get_member_from_string(sym->symbol_list, key);
 707  744          if (!sym)
 708  745                  return NULL;
 709      -        return get_real_base_type(sym);
      746 +        if (sym->type == SYM_RESTRICT || sym->type == SYM_NODE)
      747 +                sym = get_real_base_type(sym);
      748 +        for (i = 0; i < star; i++) {
      749 +                if (!sym || sym->type != SYM_PTR)
      750 +                        return NULL;
      751 +                sym = get_real_base_type(sym);
      752 +        }
      753 +        return sym;
 710  754  }
 711  755  
 712  756  struct symbol *get_arg_type_from_key(struct expression *fn, int param, struct expression *arg, const char *key)
 713  757  {
 714  758          struct symbol *type;
 715  759  
 716  760          if (!key)
 717  761                  return NULL;
 718  762          if (strcmp(key, "$") == 0)
 719  763                  return get_arg_type(fn, param);
↓ open down ↓ 144 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX