Print this page
12166 resync smatch to 0.6.1-rc1-il-3

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_ranges.c
          +++ new/usr/src/tools/smatch/src/smatch_ranges.c
↓ open down ↓ 126 lines elided ↑ open up ↑
 127  127          if (sval.uvalue > sval_type_max(type).uvalue)
 128  128                  return 1;
 129  129          return 0;
 130  130  }
 131  131  
 132  132  static int truncates_nicely(struct symbol *type, sval_t min, sval_t max)
 133  133  {
 134  134          unsigned long long mask;
 135  135          int bits = type_bits(type);
 136  136  
      137 +        if (type_is_fp(min.type) && !type_is_fp(type))
      138 +                return 0;
      139 +
 137  140          if (bits >= type_bits(min.type))
 138  141                  return 0;
 139  142  
 140  143          mask = -1ULL << bits;
 141  144          return (min.uvalue & mask) == (max.uvalue & mask);
 142  145  }
 143  146  
 144  147  static void add_range_t(struct symbol *type, struct range_list **rl, sval_t min, sval_t max)
 145  148  {
 146  149          /* If we're just adding a number, cast it and add it */
↓ open down ↓ 278 lines elided ↑ open up ↑
 425  428  
 426  429          filter_by_comparison(&casted_start, comparison, right_orig);
 427  430          return cast_rl(rl_type(start_rl), casted_start);
 428  431  }
 429  432  
 430  433  static sval_t parse_val(int use_max, struct expression *call, struct symbol *type, const char *c, const char **endp)
 431  434  {
 432  435          const char *start = c;
 433  436          sval_t ret;
 434  437  
      438 +        if (type == &float_ctype)
      439 +                return sval_type_fval(type, strtof(start, (char **)endp));
      440 +        else if (type == &double_ctype)
      441 +                return sval_type_fval(type, strtod(start, (char **)endp));
      442 +        else if (type == &ldouble_ctype)
      443 +                return sval_type_fval(type, strtold(start, (char **)endp));
      444 +
 435  445          if (!strncmp(start, "max", 3)) {
 436  446                  ret = sval_type_max(type);
 437  447                  c += 3;
 438  448          } else if (!strncmp(start, "u64max", 6)) {
 439  449                  ret = sval_type_val(type, ULLONG_MAX);
 440  450                  c += 6;
 441  451          } else if (!strncmp(start, "s64max", 6)) {
 442  452                  ret = sval_type_val(type, LLONG_MAX);
 443  453                  c += 6;
 444  454          } else if (!strncmp(start, "u32max", 6)) {
↓ open down ↓ 112 lines elided ↑ open up ↑
 557  567                  }
 558  568                  if (*c == '+') {
 559  569                          min = prev_min;
 560  570                          max = sval_type_max(type);
 561  571                          add_range_t(type, &rl_tmp, min, max);
 562  572                          c++;
 563  573                          if (*c == '[' || *c == '\0')
 564  574                                  break;
 565  575                  }
 566  576                  if (*c != '-') {
 567      -                        sm_msg("debug XXX: trouble parsing %s c = %s", str, c);
      577 +                        sm_debug("XXX: trouble parsing %s c = %s", str, c);
 568  578                          break;
 569  579                  }
 570  580                  c++;
 571  581                  if (*c == '(')
 572  582                          c++;
 573  583                  max = parse_val(1, call, type, c, &c);
 574  584                  if (!sval_fits(type, max))
 575  585                          max = sval_type_max(type);
 576  586                  if (*c == '+') {
 577  587                          max = sval_type_max(type);
↓ open down ↓ 1574 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX