Print this page
11506 smatch resync

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_math.c
          +++ new/usr/src/tools/smatch/src/smatch_math.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   *
  14   14   * You should have received a copy of the GNU General Public License
  15   15   * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
  16   16   */
  17   17  
  18   18  #include "symbol.h"
  19   19  #include "smatch.h"
  20   20  #include "smatch_slist.h"
  21   21  #include "smatch_extra.h"
  22   22  
  23      -static struct range_list *_get_rl(struct expression *expr, int implied, int *recurse_cnt);
  24      -static struct range_list *handle_variable(struct expression *expr, int implied, int *recurse_cnt);
       23 +static bool get_rl_sval(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *sval_res);
       24 +static bool get_rl_internal(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res);
       25 +static bool handle_variable(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval);
  25   26  static struct range_list *(*custom_handle_variable)(struct expression *expr);
  26   27  
  27      -static int get_implied_value_internal(struct expression *expr, sval_t *sval, int *recurse_cnt);
       28 +static bool get_implied_value_internal(struct expression *expr, int *recurse_cnt, sval_t *res_sval);
  28   29  static int get_absolute_rl_internal(struct expression *expr, struct range_list **rl, int *recurse_cnt);
  29   30  
  30   31  static sval_t zero  = {.type = &int_ctype, {.value = 0} };
  31   32  static sval_t one   = {.type = &int_ctype, {.value = 1} };
  32   33  
  33   34  struct range_list *rl_zero(void)
  34   35  {
  35   36          static struct range_list *zero_perm;
  36   37  
  37   38          if (!zero_perm)
↓ open down ↓ 13 lines elided ↑ open up ↑
  51   52  
  52   53  enum {
  53   54          RL_EXACT,
  54   55          RL_HARD,
  55   56          RL_FUZZY,
  56   57          RL_IMPLIED,
  57   58          RL_ABSOLUTE,
  58   59          RL_REAL_ABSOLUTE,
  59   60  };
  60   61  
  61      -static struct range_list *last_stmt_rl(struct statement *stmt, int implied, int *recurse_cnt)
       62 +static bool last_stmt_rl(struct statement *stmt, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
  62   63  {
  63   64          struct expression *expr;
  64   65  
  65   66          if (!stmt)
  66      -                return NULL;
       67 +                return false;
  67   68  
  68   69          stmt = last_ptr_list((struct ptr_list *)stmt->stmts);
  69   70          if (stmt->type == STMT_LABEL) {
  70   71                  if (stmt->label_statement &&
  71   72                      stmt->label_statement->type == STMT_EXPRESSION)
  72   73                          expr = stmt->label_statement->expression;
  73   74                  else
  74      -                        return NULL;
       75 +                        return false;
  75   76          } else if (stmt->type == STMT_EXPRESSION) {
  76   77                  expr = stmt->expression;
  77   78          } else {
  78      -                return NULL;
       79 +                return false;
  79   80          }
  80      -        return _get_rl(expr, implied, recurse_cnt);
       81 +        return get_rl_sval(expr, implied, recurse_cnt, res, res_sval);
  81   82  }
  82   83  
  83      -static struct range_list *handle_expression_statement_rl(struct expression *expr, int implied, int *recurse_cnt)
       84 +static bool handle_expression_statement_rl(struct expression *expr, int implied,
       85 +                int *recurse_cnt, struct range_list **res, sval_t *res_sval)
  84   86  {
  85      -        return last_stmt_rl(get_expression_statement(expr), implied, recurse_cnt);
       87 +        return last_stmt_rl(get_expression_statement(expr), implied, recurse_cnt, res, res_sval);
  86   88  }
  87   89  
  88      -static struct range_list *handle_ampersand_rl(struct expression *expr, int implied, int *recurse_cnt)
       90 +static bool handle_address(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
  89   91  {
  90   92          struct range_list *rl;
       93 +        static int recursed;
  91   94          sval_t sval;
  92   95  
  93      -        if (implied == RL_EXACT || implied == RL_HARD)
  94      -                return NULL;
  95      -        if (get_mtag_sval(expr, &sval))
  96      -                return alloc_rl(sval, sval);
  97      -        if (get_address_rl(expr, &rl))
  98      -                return rl;
  99      -        return alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval);
       96 +        if (recursed > 10)
       97 +                return false;
       98 +        if (implied == RL_EXACT)
       99 +                return false;
      100 +
      101 +        if (custom_handle_variable) {
      102 +                rl = custom_handle_variable(expr);
      103 +                if (rl) {
      104 +                        *res = rl;
      105 +                        return true;
      106 +                }
      107 +        }
      108 +
      109 +        recursed++;
      110 +        if (get_mtag_sval(expr, &sval)) {
      111 +                recursed--;
      112 +                *res_sval = sval;
      113 +                return true;
      114 +        }
      115 +
      116 +        if (get_address_rl(expr, res)) {
      117 +                recursed--;
      118 +                return true;
      119 +        }
      120 +        recursed--;
      121 +        return 0;
 100  122  }
 101  123  
 102      -static struct range_list *handle_negate_rl(struct expression *expr, int implied, int *recurse_cnt)
      124 +static bool handle_ampersand_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 103  125  {
 104      -        if (known_condition_true(expr->unop))
 105      -                return rl_zero();
 106      -        if (known_condition_false(expr->unop))
 107      -                return rl_one();
      126 +        return handle_address(expr, implied, recurse_cnt, res, res_sval);
      127 +}
 108  128  
      129 +static bool handle_negate_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
      130 +{
      131 +        if (known_condition_true(expr->unop)) {
      132 +                *res_sval = zero;
      133 +                return true;
      134 +        }
      135 +        if (known_condition_false(expr->unop)) {
      136 +                *res_sval = one;
      137 +                return true;
      138 +        }
      139 +
 109  140          if (implied == RL_EXACT)
 110      -                return NULL;
      141 +                return false;
 111  142  
 112      -        if (implied_condition_true(expr->unop))
 113      -                return rl_zero();
 114      -        if (implied_condition_false(expr->unop))
 115      -                return rl_one();
 116      -        return alloc_rl(zero, one);
      143 +        if (implied_condition_true(expr->unop)) {
      144 +                *res_sval = zero;
      145 +                return true;
      146 +        }
      147 +        if (implied_condition_false(expr->unop)) {
      148 +                *res_sval = one;
      149 +                return true;
      150 +        }
      151 +
      152 +        *res = alloc_rl(zero, one);
      153 +        return true;
 117  154  }
 118  155  
 119      -static struct range_list *handle_bitwise_negate(struct expression *expr, int implied, int *recurse_cnt)
      156 +static bool handle_bitwise_negate(struct expression *expr, int implied, int *recurse_cnt, sval_t *res_sval)
 120  157  {
 121  158          struct range_list *rl;
 122      -        sval_t sval;
      159 +        sval_t sval = {};
 123  160  
 124      -        rl = _get_rl(expr->unop, implied, recurse_cnt);
 125      -        if (!rl_to_sval(rl, &sval))
 126      -                return NULL;
      161 +        if (!get_rl_sval(expr->unop, implied, recurse_cnt, &rl, &sval))
      162 +                return false;
      163 +        if (!sval.type && !rl_to_sval(rl, &sval))
      164 +                return false;
 127  165          sval = sval_preop(sval, '~');
 128  166          sval_cast(get_type(expr->unop), sval);
 129      -        return alloc_rl(sval, sval);
      167 +        *res_sval = sval;
      168 +        return true;
 130  169  }
 131  170  
 132      -static struct range_list *handle_minus_preop(struct expression *expr, int implied, int *recurse_cnt)
      171 +static bool untrusted_type_min(struct expression *expr)
 133  172  {
 134  173          struct range_list *rl;
 135      -        sval_t min, max;
 136  174  
 137      -        rl = _get_rl(expr->unop, implied, recurse_cnt);
 138      -        min = sval_preop(rl_max(rl), '-');
 139      -        max = sval_preop(rl_min(rl), '-');
 140      -        return alloc_rl(min, max);
      175 +        rl = var_user_rl(expr);
      176 +        return rl && sval_is_min(rl_min(rl));
 141  177  }
 142  178  
 143      -static struct range_list *handle_preop_rl(struct expression *expr, int implied, int *recurse_cnt)
      179 +static bool handle_minus_preop(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 144  180  {
      181 +        struct range_list *rl;
      182 +        struct range_list *ret = NULL;
      183 +        struct symbol *type;
      184 +        sval_t neg_one = { 0 };
      185 +        sval_t zero = { 0 };
      186 +        sval_t sval = {};
      187 +
      188 +        neg_one.value = -1;
      189 +        zero.value = 0;
      190 +
      191 +        if (!get_rl_sval(expr->unop, implied, recurse_cnt, &rl, &sval))
      192 +                return false;
      193 +        if (sval.type) {
      194 +                *res_sval = sval_preop(sval, '-');
      195 +                return true;
      196 +        }
      197 +        /*
      198 +         * One complication is that -INT_MIN is still INT_MIN because of integer
      199 +         * overflows...  But how many times do we set a time out to INT_MIN?
      200 +         * So normally when we call abs() then it does return a positive value.
      201 +         *
      202 +         */
      203 +        type = rl_type(rl);
      204 +        neg_one.type = zero.type = type;
      205 +
      206 +        if (sval_is_negative(rl_min(rl))) {
      207 +                struct range_list *neg;
      208 +                struct data_range *drange;
      209 +                sval_t new_min, new_max;
      210 +
      211 +                neg = alloc_rl(sval_type_min(type), neg_one);
      212 +                neg = rl_intersection(rl, neg);
      213 +
      214 +                if (sval_is_min(rl_min(neg)) && !sval_is_min(rl_max(neg)))
      215 +                        neg = remove_range(neg, sval_type_min(type), sval_type_min(type));
      216 +
      217 +                FOR_EACH_PTR(neg, drange) {
      218 +                        new_min = drange->max;
      219 +                        new_min.value = -new_min.value;
      220 +                        new_max = drange->min;
      221 +                        new_max.value = -new_max.value;
      222 +                        add_range(&ret, new_min, new_max);
      223 +                } END_FOR_EACH_PTR(drange);
      224 +
      225 +                if (untrusted_type_min(expr))
      226 +                        add_range(&ret, sval_type_min(type), sval_type_min(type));
      227 +        }
      228 +
      229 +        if (!sval_is_negative(rl_max(rl))) {
      230 +                struct range_list *pos;
      231 +                struct data_range *drange;
      232 +                sval_t new_min, new_max;
      233 +
      234 +                pos = alloc_rl(zero, sval_type_max(type));
      235 +                pos = rl_intersection(rl, pos);
      236 +
      237 +                FOR_EACH_PTR(pos, drange) {
      238 +                        new_min = drange->max;
      239 +                        new_min.value = -new_min.value;
      240 +                        new_max = drange->min;
      241 +                        new_max.value = -new_max.value;
      242 +                        add_range(&ret, new_min, new_max);
      243 +                } END_FOR_EACH_PTR(drange);
      244 +        }
      245 +
      246 +        *res = ret;
      247 +        return true;
      248 +}
      249 +
      250 +static bool handle_preop_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
      251 +{
 145  252          switch (expr->op) {
 146  253          case '&':
 147      -                return handle_ampersand_rl(expr, implied, recurse_cnt);
      254 +                return handle_ampersand_rl(expr, implied, recurse_cnt, res, res_sval);
 148  255          case '!':
 149      -                return handle_negate_rl(expr, implied, recurse_cnt);
      256 +                return handle_negate_rl(expr, implied, recurse_cnt, res, res_sval);
 150  257          case '~':
 151      -                return handle_bitwise_negate(expr, implied, recurse_cnt);
      258 +                return handle_bitwise_negate(expr, implied, recurse_cnt, res_sval);
 152  259          case '-':
 153      -                return handle_minus_preop(expr, implied, recurse_cnt);
      260 +                return handle_minus_preop(expr, implied, recurse_cnt, res, res_sval);
 154  261          case '*':
 155      -                return handle_variable(expr, implied, recurse_cnt);
      262 +                return handle_variable(expr, implied, recurse_cnt, res, res_sval);
 156  263          case '(':
 157      -                return handle_expression_statement_rl(expr, implied, recurse_cnt);
      264 +                return handle_expression_statement_rl(expr, implied, recurse_cnt, res, res_sval);
 158  265          default:
 159      -                return NULL;
      266 +                return false;
 160  267          }
 161  268  }
 162  269  
 163      -static struct range_list *handle_divide_rl(struct expression *expr, int implied, int *recurse_cnt)
      270 +static bool handle_divide_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 164  271  {
 165      -        struct range_list *left_rl, *right_rl;
      272 +        struct range_list *left_rl = NULL;
      273 +        struct range_list *right_rl = NULL;
 166  274          struct symbol *type;
 167  275  
 168  276          type = get_type(expr);
 169  277  
 170      -        left_rl = _get_rl(expr->left, implied, recurse_cnt);
      278 +        get_rl_internal(expr->left, implied, recurse_cnt, &left_rl);
 171  279          left_rl = cast_rl(type, left_rl);
 172      -        right_rl = _get_rl(expr->right, implied, recurse_cnt);
      280 +        get_rl_internal(expr->right, implied, recurse_cnt, &right_rl);
 173  281          right_rl = cast_rl(type, right_rl);
 174  282  
 175  283          if (!left_rl || !right_rl)
 176      -                return NULL;
      284 +                return false;
 177  285  
 178  286          if (implied != RL_REAL_ABSOLUTE) {
 179  287                  if (is_whole_rl(left_rl) || is_whole_rl(right_rl))
 180      -                        return NULL;
      288 +                        return false;
 181  289          }
 182  290  
 183      -        return rl_binop(left_rl, '/', right_rl);
      291 +        *res = rl_binop(left_rl, '/', right_rl);
      292 +        return true;
 184  293  }
 185  294  
 186  295  static int handle_offset_subtraction(struct expression *expr)
 187  296  {
 188  297          struct expression *left, *right;
 189  298          struct symbol *left_sym, *right_sym;
 190  299          struct symbol *type;
 191  300          int left_offset, right_offset;
 192  301  
 193  302          type = get_type(expr);
↓ open down ↓ 23 lines elided ↑ open up ↑
 217  326                          return -1;
 218  327                  right = strip_expr(right->unop);
 219  328                  right_offset = get_member_offset_from_deref(right);
 220  329          }
 221  330          if (left_offset < 0 || right_offset < 0)
 222  331                  return -1;
 223  332  
 224  333          return left_offset - right_offset;
 225  334  }
 226  335  
 227      -static struct range_list *handle_subtract_rl(struct expression *expr, int implied, int *recurse_cnt)
      336 +static bool handle_subtract_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 228  337  {
 229  338          struct symbol *type;
 230  339          struct range_list *left_orig, *right_orig;
 231  340          struct range_list *left_rl, *right_rl;
 232      -        sval_t max, min, tmp;
      341 +        sval_t min, max, tmp;
 233  342          int comparison;
 234  343          int offset;
 235  344  
 236  345          type = get_type(expr);
 237  346  
 238  347          offset = handle_offset_subtraction(expr);
 239  348          if (offset >= 0) {
 240  349                  tmp.type = type;
 241  350                  tmp.value = offset;
 242  351  
 243      -                return alloc_rl(tmp, tmp);
      352 +                *res = alloc_rl(tmp, tmp);
      353 +                return true;
 244  354          }
 245  355  
 246  356          comparison = get_comparison(expr->left, expr->right);
 247  357  
 248      -        left_orig = _get_rl(expr->left, implied, recurse_cnt);
      358 +        left_orig = NULL;
      359 +        get_rl_internal(expr->left, implied, recurse_cnt, &left_orig);
 249  360          left_rl = cast_rl(type, left_orig);
 250      -        right_orig = _get_rl(expr->right, implied, recurse_cnt);
      361 +        right_orig = NULL;
      362 +        get_rl_internal(expr->right, implied, recurse_cnt, &right_orig);
 251  363          right_rl = cast_rl(type, right_orig);
 252  364  
 253  365          if ((!left_rl || !right_rl) &&
 254  366              (implied == RL_EXACT || implied == RL_HARD || implied == RL_FUZZY))
 255      -                return NULL;
      367 +                return false;
 256  368  
 257  369          if (!left_rl)
 258  370                  left_rl = alloc_whole_rl(type);
 259  371          if (!right_rl)
 260  372                  right_rl = alloc_whole_rl(type);
 261  373  
 262  374          /* negative values complicate everything fix this later */
 263  375          if (sval_is_negative(rl_min(right_rl)))
 264      -                return NULL;
      376 +                return false;
 265  377          max = rl_max(left_rl);
 266  378          min = sval_type_min(type);
 267  379  
 268  380          switch (comparison) {
 269  381          case '>':
 270  382          case SPECIAL_UNSIGNED_GT:
 271  383                  min = sval_type_val(type, 1);
 272  384                  max = rl_max(left_rl);
 273  385                  break;
 274  386          case SPECIAL_GTE:
↓ open down ↓ 8 lines elided ↑ open up ↑
 283  395          case '<':
 284  396          case SPECIAL_UNSIGNED_LT:
 285  397                  max = sval_type_val(type, -1);
 286  398                  break;
 287  399          case SPECIAL_LTE:
 288  400          case SPECIAL_UNSIGNED_LTE:
 289  401                  max = sval_type_val(type, 0);
 290  402                  break;
 291  403          default:
 292  404                  if (!left_orig || !right_orig)
 293      -                        return NULL;
 294      -                return rl_binop(left_rl, '-', right_rl);
      405 +                        return false;
      406 +                *res = rl_binop(left_rl, '-', right_rl);
      407 +                return true;
 295  408          }
 296  409  
 297  410          if (!sval_binop_overflows(rl_min(left_rl), '-', rl_max(right_rl))) {
 298  411                  tmp = sval_binop(rl_min(left_rl), '-', rl_max(right_rl));
 299  412                  if (sval_cmp(tmp, min) > 0)
 300  413                          min = tmp;
 301  414          }
 302  415  
 303  416          if (!sval_is_max(rl_max(left_rl))) {
 304  417                  tmp = sval_binop(rl_max(left_rl), '-', rl_min(right_rl));
 305  418                  if (sval_cmp(tmp, max) < 0)
 306  419                          max = tmp;
 307  420          }
 308  421  
 309  422          if (sval_is_min(min) && sval_is_max(max))
 310      -                return NULL;
      423 +                return false;
 311  424  
 312      -        return cast_rl(type, alloc_rl(min, max));
      425 +        *res = cast_rl(type, alloc_rl(min, max));
      426 +        return true;
 313  427  }
 314  428  
 315      -static struct range_list *handle_mod_rl(struct expression *expr, int implied, int *recurse_cnt)
      429 +static bool handle_mod_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 316  430  {
 317  431          struct range_list *rl;
 318  432          sval_t left, right, sval;
 319  433  
 320  434          if (implied == RL_EXACT) {
 321  435                  if (!get_implied_value(expr->right, &right))
 322      -                        return NULL;
      436 +                        return false;
 323  437                  if (!get_implied_value(expr->left, &left))
 324      -                        return NULL;
      438 +                        return false;
 325  439                  sval = sval_binop(left, '%', right);
 326      -                return alloc_rl(sval, sval);
      440 +                *res = alloc_rl(sval, sval);
      441 +                return true;
 327  442          }
 328  443          /* if we can't figure out the right side it's probably hopeless */
 329      -        if (!get_implied_value_internal(expr->right, &right, recurse_cnt))
 330      -                return NULL;
      444 +        if (!get_implied_value_internal(expr->right, recurse_cnt, &right))
      445 +                return false;
 331  446  
 332  447          right = sval_cast(get_type(expr), right);
 333  448          right.value--;
 334  449  
 335      -        rl = _get_rl(expr->left, implied, recurse_cnt);
 336      -        if (rl && rl_max(rl).uvalue < right.uvalue)
      450 +        if (get_rl_internal(expr->left, implied, recurse_cnt, &rl) && rl &&
      451 +            rl_max(rl).uvalue < right.uvalue)
 337  452                  right.uvalue = rl_max(rl).uvalue;
 338  453  
 339      -        return alloc_rl(sval_cast(right.type, zero), right);
      454 +        *res = alloc_rl(sval_cast(right.type, zero), right);
      455 +        return true;
 340  456  }
 341  457  
 342      -static sval_t sval_lowest_set_bit(sval_t sval)
      458 +static bool handle_bitwise_AND(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 343  459  {
 344      -        int i;
 345      -        int found = 0;
 346      -
 347      -        for (i = 0; i < 64; i++) {
 348      -                if (sval.uvalue & 1ULL << i) {
 349      -                        if (!found++)
 350      -                                continue;
 351      -                        sval.uvalue &= ~(1ULL << i);
 352      -                }
 353      -        }
 354      -        return sval;
 355      -}
 356      -
 357      -static struct range_list *handle_bitwise_AND(struct expression *expr, int implied, int *recurse_cnt)
 358      -{
 359  460          struct symbol *type;
 360  461          struct range_list *left_rl, *right_rl;
 361      -        sval_t known;
 362  462          int new_recurse;
 363  463  
 364  464          if (implied != RL_IMPLIED && implied != RL_ABSOLUTE && implied != RL_REAL_ABSOLUTE)
 365      -                return NULL;
      465 +                return false;
 366  466  
 367  467          type = get_type(expr);
 368  468  
 369      -        if (get_implied_value_internal(expr->left, &known, recurse_cnt)) {
 370      -                sval_t min;
      469 +        if (!get_rl_internal(expr->left, implied, recurse_cnt, &left_rl))
      470 +                left_rl = alloc_whole_rl(type);
      471 +        left_rl = cast_rl(type, left_rl);
 371  472  
 372      -                min = sval_lowest_set_bit(known);
 373      -                left_rl = alloc_rl(min, known);
 374      -                left_rl = cast_rl(type, left_rl);
 375      -                add_range(&left_rl, sval_type_val(type, 0), sval_type_val(type, 0));
 376      -        } else {
 377      -                left_rl = _get_rl(expr->left, implied, recurse_cnt);
 378      -                if (left_rl) {
 379      -                        left_rl = cast_rl(type, left_rl);
 380      -                        left_rl = alloc_rl(sval_type_val(type, 0), rl_max(left_rl));
 381      -                } else {
 382      -                        if (implied == RL_HARD)
 383      -                                return NULL;
 384      -                        left_rl = alloc_whole_rl(type);
 385      -                }
 386      -        }
 387      -
 388  473          new_recurse = *recurse_cnt;
 389  474          if (*recurse_cnt >= 200)
 390  475                  new_recurse = 100;  /* Let's try super hard to get the mask */
 391      -        if (get_implied_value_internal(expr->right, &known, &new_recurse)) {
 392      -                sval_t min, left_max, mod;
      476 +        if (!get_rl_internal(expr->right, implied, &new_recurse, &right_rl))
      477 +                right_rl = alloc_whole_rl(type);
      478 +        right_rl = cast_rl(type, right_rl);
      479 +        *recurse_cnt = new_recurse;
 393  480  
 394      -                *recurse_cnt = new_recurse;
 395      -
 396      -                min = sval_lowest_set_bit(known);
 397      -                right_rl = alloc_rl(min, known);
 398      -                right_rl = cast_rl(type, right_rl);
 399      -                add_range(&right_rl, sval_type_val(type, 0), sval_type_val(type, 0));
 400      -
 401      -                if (min.value != 0) {
 402      -                        left_max = rl_max(left_rl);
 403      -                        mod = sval_binop(left_max, '%', min);
 404      -                        if (mod.value) {
 405      -                                left_max = sval_binop(left_max, '-', mod);
 406      -                                left_max.value++;
 407      -                                if (left_max.value > 0 && sval_cmp(left_max, rl_max(left_rl)) < 0)
 408      -                                        left_rl = remove_range(left_rl, left_max, rl_max(left_rl));
 409      -                        }
 410      -                }
 411      -        } else {
 412      -                right_rl = _get_rl(expr->right, implied, recurse_cnt);
 413      -                if (right_rl) {
 414      -                        right_rl = cast_rl(type, right_rl);
 415      -                        right_rl = alloc_rl(sval_type_val(type, 0), rl_max(right_rl));
 416      -                } else {
 417      -                        if (implied == RL_HARD)
 418      -                                return NULL;
 419      -                        right_rl = alloc_whole_rl(type);
 420      -                }
 421      -        }
 422      -
 423      -        return rl_intersection(left_rl, right_rl);
      481 +        *res = rl_binop(left_rl, '&', right_rl);
      482 +        return true;
 424  483  }
 425  484  
 426      -static struct range_list *use_rl_binop(struct expression *expr, int implied, int *recurse_cnt)
      485 +static bool use_rl_binop(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 427  486  {
 428  487          struct symbol *type;
 429  488          struct range_list *left_rl, *right_rl;
 430  489  
 431  490          if (implied != RL_IMPLIED && implied != RL_ABSOLUTE && implied != RL_REAL_ABSOLUTE)
 432      -                return NULL;
      491 +                return false;
 433  492  
 434  493          type = get_type(expr);
 435  494  
 436  495          get_absolute_rl_internal(expr->left, &left_rl, recurse_cnt);
 437  496          get_absolute_rl_internal(expr->right, &right_rl, recurse_cnt);
 438  497          left_rl = cast_rl(type, left_rl);
 439  498          right_rl = cast_rl(type, right_rl);
 440  499          if (!left_rl || !right_rl)
 441      -                return NULL;
      500 +                return false;
 442  501  
 443      -        return rl_binop(left_rl, expr->op, right_rl);
      502 +        *res = rl_binop(left_rl, expr->op, right_rl);
      503 +        return true;
 444  504  }
 445  505  
 446      -static struct range_list *handle_right_shift(struct expression *expr, int implied, int *recurse_cnt)
      506 +static bool handle_right_shift(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 447  507  {
 448      -        struct range_list *left_rl;
 449      -        sval_t right;
      508 +        struct range_list *left_rl, *right_rl;
 450  509          sval_t min, max;
 451  510  
 452  511          if (implied == RL_EXACT || implied == RL_HARD)
 453      -                return NULL;
      512 +                return false;
 454  513  
 455      -        left_rl = _get_rl(expr->left, implied, recurse_cnt);
 456      -        if (left_rl) {
      514 +        if (get_rl_internal(expr->left, implied, recurse_cnt, &left_rl)) {
 457  515                  max = rl_max(left_rl);
 458  516                  min = rl_min(left_rl);
 459  517          } else {
 460  518                  if (implied == RL_FUZZY)
 461      -                        return NULL;
      519 +                        return false;
 462  520                  max = sval_type_max(get_type(expr->left));
 463  521                  min = sval_type_val(get_type(expr->left), 0);
 464  522          }
 465  523  
 466      -        if (get_implied_value_internal(expr->right, &right, recurse_cnt)) {
 467      -                min = sval_binop(min, SPECIAL_RIGHTSHIFT, right);
 468      -                max = sval_binop(max, SPECIAL_RIGHTSHIFT, right);
      524 +        if (get_rl_internal(expr->right, implied, recurse_cnt, &right_rl) &&
      525 +            !sval_is_negative(rl_min(right_rl))) {
      526 +                min = sval_binop(min, SPECIAL_RIGHTSHIFT, rl_max(right_rl));
      527 +                max = sval_binop(max, SPECIAL_RIGHTSHIFT, rl_min(right_rl));
 469  528          } else if (!sval_is_negative(min)) {
 470  529                  min.value = 0;
 471  530                  max = sval_type_max(max.type);
 472  531          } else {
 473      -                return NULL;
      532 +                return false;
 474  533          }
 475  534  
 476      -        return alloc_rl(min, max);
      535 +        *res = alloc_rl(min, max);
      536 +        return true;
 477  537  }
 478  538  
 479      -static struct range_list *handle_left_shift(struct expression *expr, int implied, int *recurse_cnt)
      539 +static bool handle_left_shift(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
 480  540  {
 481      -        struct range_list *left_rl, *res;
      541 +        struct range_list *left_rl, *rl;
 482  542          sval_t right;
 483      -        sval_t min, max;
 484      -        int add_zero = 0;
 485  543  
 486  544          if (implied == RL_EXACT || implied == RL_HARD)
 487      -                return NULL;
      545 +                return false;
 488  546          /* this is hopeless without the right side */
 489      -        if (!get_implied_value_internal(expr->right, &right, recurse_cnt))
 490      -                return NULL;
 491      -        left_rl = _get_rl(expr->left, implied, recurse_cnt);
 492      -        if (left_rl) {
 493      -                max = rl_max(left_rl);
 494      -                min = rl_min(left_rl);
 495      -                if (min.value == 0) {
 496      -                        min.value = 1;
 497      -                        add_zero = 1;
 498      -                }
 499      -        } else {
      547 +        if (!get_implied_value_internal(expr->right, recurse_cnt, &right))
      548 +                return false;
      549 +        if (!get_rl_internal(expr->left, implied, recurse_cnt, &left_rl)) {
 500  550                  if (implied == RL_FUZZY)
 501      -                        return NULL;
 502      -                max = sval_type_max(get_type(expr->left));
 503      -                min = sval_type_val(get_type(expr->left), 1);
 504      -                add_zero = 1;
      551 +                        return false;
      552 +                left_rl = alloc_whole_rl(get_type(expr->left));
 505  553          }
 506  554  
 507      -        max = sval_binop(max, SPECIAL_LEFTSHIFT, right);
 508      -        min = sval_binop(min, SPECIAL_LEFTSHIFT, right);
 509      -        res = alloc_rl(min, max);
 510      -        if (add_zero)
 511      -                res = rl_union(res, rl_zero());
 512      -        return res;
      555 +        rl = rl_binop(left_rl, SPECIAL_LEFTSHIFT, alloc_rl(right, right));
      556 +        if (!rl)
      557 +                return false;
      558 +        *res = rl;
      559 +        return true;
 513  560  }
 514  561  
 515      -static struct range_list *handle_known_binop(struct expression *expr)
      562 +static bool handle_known_binop(struct expression *expr, sval_t *res)
 516  563  {
 517  564          sval_t left, right;
 518  565  
 519  566          if (!get_value(expr->left, &left))
 520      -                return NULL;
      567 +                return false;
 521  568          if (!get_value(expr->right, &right))
 522      -                return NULL;
 523      -        left = sval_binop(left, expr->op, right);
 524      -        return alloc_rl(left, left);
      569 +                return false;
      570 +        *res = sval_binop(left, expr->op, right);
      571 +        return true;
 525  572  }
 526  573  
 527  574  static int has_actual_ranges(struct range_list *rl)
 528  575  {
 529  576          struct data_range *tmp;
 530  577  
 531  578          FOR_EACH_PTR(rl, tmp) {
 532  579                  if (sval_cmp(tmp->min, tmp->max) != 0)
 533  580                          return 1;
 534  581          } END_FOR_EACH_PTR(tmp);
↓ open down ↓ 24 lines elided ↑ open up ↑
 559  606                              right_drange->min.value == 0)
 560  607                                  return NULL;
 561  608                          res = sval_binop(left_drange->min, op, right_drange->min);
 562  609                          add_range(&res_rl, res, res);
 563  610                  } END_FOR_EACH_PTR(right_drange);
 564  611          } END_FOR_EACH_PTR(left_drange);
 565  612  
 566  613          return res_rl;
 567  614  }
 568  615  
 569      -static struct range_list *handle_binop_rl(struct expression *expr, int implied, int *recurse_cnt)
      616 +static bool handle_binop_rl_helper(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 570  617  {
 571      -        struct smatch_state *state;
 572  618          struct symbol *type;
 573      -        struct range_list *left_rl, *right_rl, *rl;
      619 +        struct range_list *left_rl = NULL;
      620 +        struct range_list *right_rl = NULL;
      621 +        struct range_list *rl;
 574  622          sval_t min, max;
 575  623  
 576      -        rl = handle_known_binop(expr);
 577      -        if (rl)
 578      -                return rl;
 579      -        if (implied == RL_EXACT)
 580      -                return NULL;
 581      -
 582      -        if (custom_handle_variable) {
 583      -                rl = custom_handle_variable(expr);
 584      -                if (rl)
 585      -                        return rl;
 586      -        }
 587      -
 588      -        state = get_extra_state(expr);
 589      -        if (state && !is_whole_rl(estate_rl(state))) {
 590      -                if (implied != RL_HARD || estate_has_hard_max(state))
 591      -                        return clone_rl(estate_rl(state));
 592      -        }
 593      -
 594      -        type = get_type(expr);
 595      -        left_rl = _get_rl(expr->left, implied, recurse_cnt);
      624 +        type = get_promoted_type(get_type(expr->left), get_type(expr->right));
      625 +        get_rl_internal(expr->left, implied, recurse_cnt, &left_rl);
 596  626          left_rl = cast_rl(type, left_rl);
 597      -        right_rl = _get_rl(expr->right, implied, recurse_cnt);
      627 +        get_rl_internal(expr->right, implied, recurse_cnt, &right_rl);
 598  628          right_rl = cast_rl(type, right_rl);
 599      -
 600  629          if (!left_rl && !right_rl)
 601      -                return NULL;
      630 +                return false;
 602  631  
 603  632          rl = handle_implied_binop(left_rl, expr->op, right_rl);
 604      -        if (rl)
 605      -                return rl;
      633 +        if (rl) {
      634 +                *res = rl;
      635 +                return true;
      636 +        }
 606  637  
 607  638          switch (expr->op) {
 608  639          case '%':
 609      -                return handle_mod_rl(expr, implied, recurse_cnt);
      640 +                return handle_mod_rl(expr, implied, recurse_cnt, res);
 610  641          case '&':
 611      -                return handle_bitwise_AND(expr, implied, recurse_cnt);
      642 +                return handle_bitwise_AND(expr, implied, recurse_cnt, res);
 612  643          case '|':
 613  644          case '^':
 614      -                return use_rl_binop(expr, implied, recurse_cnt);
      645 +                return use_rl_binop(expr, implied, recurse_cnt, res);
 615  646          case SPECIAL_RIGHTSHIFT:
 616      -                return handle_right_shift(expr, implied, recurse_cnt);
      647 +                return handle_right_shift(expr, implied, recurse_cnt, res);
 617  648          case SPECIAL_LEFTSHIFT:
 618      -                return handle_left_shift(expr, implied, recurse_cnt);
      649 +                return handle_left_shift(expr, implied, recurse_cnt, res);
 619  650          case '-':
 620      -                return handle_subtract_rl(expr, implied, recurse_cnt);
      651 +                return handle_subtract_rl(expr, implied, recurse_cnt, res);
 621  652          case '/':
 622      -                return handle_divide_rl(expr, implied, recurse_cnt);
      653 +                return handle_divide_rl(expr, implied, recurse_cnt, res);
 623  654          }
 624  655  
 625  656          if (!left_rl || !right_rl)
 626      -                return NULL;
      657 +                return false;
 627  658  
 628  659          if (sval_binop_overflows(rl_min(left_rl), expr->op, rl_min(right_rl)))
 629      -                return NULL;
      660 +                return false;
 630  661          if (sval_binop_overflows(rl_max(left_rl), expr->op, rl_max(right_rl)))
 631      -                return NULL;
      662 +                return false;
 632  663  
 633  664          min = sval_binop(rl_min(left_rl), expr->op, rl_min(right_rl));
 634  665          max = sval_binop(rl_max(left_rl), expr->op, rl_max(right_rl));
 635  666  
 636      -        return alloc_rl(min, max);
      667 +        *res = alloc_rl(min, max);
      668 +        return true;
      669 +
 637  670  }
 638  671  
      672 +static bool handle_binop_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
      673 +{
      674 +        struct smatch_state *state;
      675 +        struct range_list *rl;
      676 +        sval_t val;
      677 +
      678 +        if (handle_known_binop(expr, &val)) {
      679 +                *res_sval = val;
      680 +                return true;
      681 +        }
      682 +        if (implied == RL_EXACT)
      683 +                return false;
      684 +
      685 +        if (custom_handle_variable) {
      686 +                rl = custom_handle_variable(expr);
      687 +                if (rl) {
      688 +                        *res = rl;
      689 +                        return true;
      690 +                }
      691 +        }
      692 +
      693 +        state = get_extra_state(expr);
      694 +        if (state && !is_whole_rl(estate_rl(state))) {
      695 +                if (implied != RL_HARD || estate_has_hard_max(state)) {
      696 +                        *res = clone_rl(estate_rl(state));
      697 +                        return true;
      698 +                }
      699 +        }
      700 +
      701 +        return handle_binop_rl_helper(expr, implied, recurse_cnt, res, res_sval);
      702 +}
      703 +
 639  704  static int do_comparison(struct expression *expr)
 640  705  {
 641  706          struct range_list *left_ranges = NULL;
 642  707          struct range_list *right_ranges = NULL;
 643  708          int poss_true, poss_false;
 644  709          struct symbol *type;
 645  710  
 646  711          type = get_type(expr);
 647  712          get_absolute_rl(expr->left, &left_ranges);
 648  713          get_absolute_rl(expr->right, &right_ranges);
↓ open down ↓ 6 lines elided ↑ open up ↑
 655  720  
 656  721          if (!poss_true && !poss_false)
 657  722                  return 0x0;
 658  723          if (poss_true && !poss_false)
 659  724                  return 0x1;
 660  725          if (!poss_true && poss_false)
 661  726                  return 0x2;
 662  727          return 0x3;
 663  728  }
 664  729  
 665      -static struct range_list *handle_comparison_rl(struct expression *expr, int implied, int *recurse_cnt)
      730 +static bool handle_comparison_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 666  731  {
 667  732          sval_t left, right;
 668      -        int res;
      733 +        int cmp;
 669  734  
 670  735          if (expr->op == SPECIAL_EQUAL && expr->left->type == EXPR_TYPE) {
 671  736                  struct symbol *left, *right;
 672  737  
      738 +                if (expr->right->type != EXPR_TYPE)
      739 +                        return false;
      740 +
 673  741                  left = get_real_base_type(expr->left->symbol);
 674      -                right = get_real_base_type(expr->left->symbol);
 675      -                if (left == right)
 676      -                        return rl_one();
 677      -                return rl_zero();
      742 +                right = get_real_base_type(expr->right->symbol);
      743 +                if (type_bits(left) == type_bits(right) &&
      744 +                    type_positive_bits(left) == type_positive_bits(right))
      745 +                        *res_sval = one;
      746 +                else
      747 +                        *res_sval = zero;
      748 +                return true;
 678  749          }
 679  750  
 680  751          if (get_value(expr->left, &left) && get_value(expr->right, &right)) {
 681  752                  struct data_range tmp_left, tmp_right;
 682  753  
 683  754                  tmp_left.min = left;
 684  755                  tmp_left.max = left;
 685  756                  tmp_right.min = right;
 686  757                  tmp_right.max = right;
 687  758                  if (true_comparison_range(&tmp_left, expr->op, &tmp_right))
 688      -                        return rl_one();
 689      -                return rl_zero();
      759 +                        *res_sval = one;
      760 +                else
      761 +                        *res_sval = zero;
      762 +                return true;
 690  763          }
 691  764  
 692  765          if (implied == RL_EXACT)
 693      -                return NULL;
      766 +                return false;
 694  767  
 695      -        res = do_comparison(expr);
 696      -        if (res == 1)
 697      -                return rl_one();
 698      -        if (res == 2)
 699      -                return rl_zero();
      768 +        cmp = do_comparison(expr);
      769 +        if (cmp == 1) {
      770 +                *res_sval = one;
      771 +                return true;
      772 +        }
      773 +        if (cmp == 2) {
      774 +                *res_sval = zero;
      775 +                return true;
      776 +        }
 700  777  
 701      -        return alloc_rl(zero, one);
      778 +        *res = alloc_rl(zero, one);
      779 +        return true;
 702  780  }
 703  781  
 704      -static struct range_list *handle_logical_rl(struct expression *expr, int implied, int *recurse_cnt)
      782 +static bool handle_logical_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 705  783  {
 706  784          sval_t left, right;
 707  785          int left_known = 0;
 708  786          int right_known = 0;
 709  787  
 710  788          if (implied == RL_EXACT) {
 711  789                  if (get_value(expr->left, &left))
 712  790                          left_known = 1;
 713  791                  if (get_value(expr->right, &right))
 714  792                          right_known = 1;
 715  793          } else {
 716      -                if (get_implied_value_internal(expr->left, &left, recurse_cnt))
      794 +                if (get_implied_value_internal(expr->left, recurse_cnt, &left))
 717  795                          left_known = 1;
 718      -                if (get_implied_value_internal(expr->right, &right, recurse_cnt))
      796 +                if (get_implied_value_internal(expr->right, recurse_cnt, &right))
 719  797                          right_known = 1;
 720  798          }
 721  799  
 722  800          switch (expr->op) {
 723  801          case SPECIAL_LOGICAL_OR:
 724  802                  if (left_known && left.value)
 725      -                        return rl_one();
      803 +                        goto one;
 726  804                  if (right_known && right.value)
 727      -                        return rl_one();
      805 +                        goto one;
 728  806                  if (left_known && right_known)
 729      -                        return rl_zero();
      807 +                        goto zero;
 730  808                  break;
 731  809          case SPECIAL_LOGICAL_AND:
 732  810                  if (left_known && right_known) {
 733  811                          if (left.value && right.value)
 734      -                                return rl_one();
 735      -                        return rl_zero();
      812 +                                goto one;
      813 +                        goto zero;
 736  814                  }
 737  815                  break;
 738  816          default:
 739      -                return NULL;
      817 +                return false;
 740  818          }
 741  819  
 742  820          if (implied == RL_EXACT)
 743      -                return NULL;
      821 +                return false;
 744  822  
 745      -        return alloc_rl(zero, one);
      823 +        *res = alloc_rl(zero, one);
      824 +        return true;
      825 +
      826 +zero:
      827 +        *res_sval = zero;
      828 +        return true;
      829 +one:
      830 +        *res_sval = one;
      831 +        return true;
 746  832  }
 747  833  
 748      -static struct range_list *handle_conditional_rl(struct expression *expr, int implied, int *recurse_cnt)
      834 +static bool handle_conditional_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 749  835  {
 750  836          struct expression *cond_true;
 751  837          struct range_list *true_rl, *false_rl;
 752  838          struct symbol *type;
 753  839          int final_pass_orig = final_pass;
 754  840  
 755  841          cond_true = expr->cond_true;
 756  842          if (!cond_true)
 757  843                  cond_true = expr->conditional;
 758  844  
 759  845          if (known_condition_true(expr->conditional))
 760      -                return _get_rl(cond_true, implied, recurse_cnt);
      846 +                return get_rl_sval(cond_true, implied, recurse_cnt, res, res_sval);
 761  847          if (known_condition_false(expr->conditional))
 762      -                return _get_rl(expr->cond_false, implied, recurse_cnt);
      848 +                return get_rl_sval(expr->cond_false, implied, recurse_cnt, res, res_sval);
 763  849  
 764  850          if (implied == RL_EXACT)
 765      -                return NULL;
      851 +                return false;
 766  852  
 767  853          if (implied_condition_true(expr->conditional))
 768      -                return _get_rl(cond_true, implied, recurse_cnt);
      854 +                return get_rl_sval(cond_true, implied, recurse_cnt, res, res_sval);
 769  855          if (implied_condition_false(expr->conditional))
 770      -                return _get_rl(expr->cond_false, implied, recurse_cnt);
      856 +                return get_rl_sval(expr->cond_false, implied, recurse_cnt, res, res_sval);
 771  857  
 772      -
 773  858          /* this becomes a problem with deeply nested conditional statements */
 774  859          if (low_on_memory())
 775      -                return NULL;
      860 +                return false;
 776  861  
 777  862          type = get_type(expr);
 778  863  
 779  864          __push_fake_cur_stree();
 780  865          final_pass = 0;
 781  866          __split_whole_condition(expr->conditional);
 782      -        true_rl = _get_rl(cond_true, implied, recurse_cnt);
      867 +        true_rl = NULL;
      868 +        get_rl_internal(cond_true, implied, recurse_cnt, &true_rl);
 783  869          __push_true_states();
 784  870          __use_false_states();
 785      -        false_rl = _get_rl(expr->cond_false, implied, recurse_cnt);
      871 +        false_rl = NULL;
      872 +        get_rl_internal(expr->cond_false, implied, recurse_cnt, &false_rl);
 786  873          __merge_true_states();
 787  874          __free_fake_cur_stree();
 788  875          final_pass = final_pass_orig;
 789  876  
 790  877          if (!true_rl || !false_rl)
 791      -                return NULL;
      878 +                return false;
 792  879          true_rl = cast_rl(type, true_rl);
 793  880          false_rl = cast_rl(type, false_rl);
 794  881  
 795      -        return rl_union(true_rl, false_rl);
      882 +        *res = rl_union(true_rl, false_rl);
      883 +        return true;
 796  884  }
 797  885  
 798      -static int get_fuzzy_max_helper(struct expression *expr, sval_t *max)
      886 +static bool get_fuzzy_max_helper(struct expression *expr, sval_t *max)
 799  887  {
 800  888          struct smatch_state *state;
 801  889          sval_t sval;
 802  890  
 803  891          if (get_hard_max(expr, &sval)) {
 804  892                  *max = sval;
 805      -                return 1;
      893 +                return true;
 806  894          }
 807  895  
 808  896          state = get_extra_state(expr);
 809  897          if (!state || !estate_has_fuzzy_max(state))
 810      -                return 0;
      898 +                return false;
 811  899          *max = sval_cast(get_type(expr), estate_get_fuzzy_max(state));
 812      -        return 1;
      900 +        return true;
 813  901  }
 814  902  
 815      -static int get_fuzzy_min_helper(struct expression *expr, sval_t *min)
      903 +static bool get_fuzzy_min_helper(struct expression *expr, sval_t *min)
 816  904  {
 817  905          struct smatch_state *state;
 818  906          sval_t sval;
 819  907  
 820  908          state = get_extra_state(expr);
 821  909          if (!state || !estate_rl(state))
 822      -                return 0;
      910 +                return false;
 823  911  
 824  912          sval = estate_min(state);
 825  913          if (sval_is_negative(sval) && sval_is_min(sval))
 826      -                return 0;
      914 +                return false;
 827  915  
 828  916          if (sval_is_max(sval))
 829      -                return 0;
      917 +                return false;
 830  918  
 831  919          *min = sval_cast(get_type(expr), sval);
 832      -        return 1;
      920 +        return true;
 833  921  }
 834  922  
 835  923  int get_const_value(struct expression *expr, sval_t *sval)
 836  924  {
 837  925          struct symbol *sym;
 838  926          sval_t right;
 839  927  
 840  928          if (expr->type != EXPR_SYMBOL || !expr->symbol)
 841  929                  return 0;
 842  930          sym = expr->symbol;
↓ open down ↓ 23 lines elided ↑ open up ↑
 866  954                  if (get_db_type_rl(expr, &rl) && !is_whole_rl(rl))
 867  955                          return rl;
 868  956                  return alloc_whole_rl(get_type(expr));
 869  957          }
 870  958          /* err on the side of saying things are possible */
 871  959          if (!estate_rl(state))
 872  960                  return alloc_whole_rl(get_type(expr));
 873  961          return clone_rl(estate_rl(state));
 874  962  }
 875  963  
 876      -static struct range_list *handle_variable(struct expression *expr, int implied, int *recurse_cnt)
      964 +static bool handle_variable(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
 877  965  {
 878  966          struct smatch_state *state;
 879  967          struct range_list *rl;
 880  968          sval_t sval, min, max;
 881  969          struct symbol *type;
 882  970  
 883      -        if (get_const_value(expr, &sval))
 884      -                return alloc_rl(sval, sval);
      971 +        if (get_const_value(expr, &sval)) {
      972 +                *res_sval = sval;
      973 +                return true;
      974 +        }
 885  975  
      976 +        if (implied == RL_EXACT)
      977 +                return false;
      978 +
 886  979          if (custom_handle_variable) {
 887  980                  rl = custom_handle_variable(expr);
 888      -                if (!rl)
 889      -                        return var_to_absolute_rl(expr);
 890      -                return rl;
      981 +                if (rl) {
      982 +                        if (!rl_to_sval(rl, res_sval))
      983 +                                *res = rl;
      984 +                } else {
      985 +                        *res = var_to_absolute_rl(expr);
      986 +                }
      987 +                return true;
 891  988          }
 892  989  
 893      -        if (implied == RL_EXACT)
 894      -                return NULL;
      990 +        if (get_mtag_sval(expr, &sval)) {
      991 +                *res_sval = sval;
      992 +                return true;
      993 +        }
 895  994  
 896      -        if (get_mtag_sval(expr, &sval))
 897      -                return alloc_rl(sval, sval);
 898      -
 899  995          type = get_type(expr);
 900      -        if (type && type->type == SYM_FN)
 901      -                return alloc_rl(fn_ptr_min, fn_ptr_max);
      996 +        if (type &&
      997 +            (type->type == SYM_ARRAY ||
      998 +             type->type == SYM_FN))
      999 +                return handle_address(expr, implied, recurse_cnt, res, res_sval);
 902 1000  
     1001 +        /* FIXME: call rl_to_sval() on the results */
     1002 +
 903 1003          switch (implied) {
 904 1004          case RL_HARD:
 905 1005          case RL_IMPLIED:
 906 1006          case RL_ABSOLUTE:
 907 1007                  state = get_extra_state(expr);
 908      -                if (!state || !state->data) {
     1008 +                if (!state) {
 909 1009                          if (implied == RL_HARD)
 910      -                                return NULL;
 911      -                        if (get_local_rl(expr, &rl))
 912      -                                return rl;
 913      -                        if (get_mtag_rl(expr, &rl))
 914      -                                return rl;
 915      -                        if (get_db_type_rl(expr, &rl))
 916      -                                return rl;
 917      -                        if (is_array(expr) && get_array_rl(expr, &rl))
 918      -                                return rl;
 919      -                        return NULL;
     1010 +                                return false;
     1011 +                        if (get_local_rl(expr, res))
     1012 +                                return true;
     1013 +                        if (get_mtag_rl(expr, res))
     1014 +                                return true;
     1015 +                        if (get_db_type_rl(expr, res))
     1016 +                                return true;
     1017 +                        if (is_array(expr) && get_array_rl(expr, res))
     1018 +                                return true;
     1019 +                        return false;
 920 1020                  }
 921 1021                  if (implied == RL_HARD && !estate_has_hard_max(state))
 922      -                        return NULL;
 923      -                return clone_rl(estate_rl(state));
     1022 +                        return false;
     1023 +                *res = clone_rl(estate_rl(state));
     1024 +                return true;
 924 1025          case RL_REAL_ABSOLUTE: {
 925 1026                  struct smatch_state *abs_state;
 926 1027  
 927 1028                  state = get_extra_state(expr);
 928 1029                  abs_state = get_real_absolute_state(expr);
 929 1030  
 930 1031                  if (estate_rl(state) && estate_rl(abs_state)) {
 931      -                        return clone_rl(rl_intersection(estate_rl(state),
     1032 +                        *res = clone_rl(rl_intersection(estate_rl(state),
 932 1033                                                          estate_rl(abs_state)));
     1034 +                        return true;
 933 1035                  } else if (estate_rl(state)) {
 934      -                        return clone_rl(estate_rl(state));
     1036 +                        *res = clone_rl(estate_rl(state));
     1037 +                        return true;
 935 1038                  } else if (estate_is_empty(state)) {
 936 1039                          /*
 937 1040                           * FIXME: we don't handle empty extra states correctly.
 938 1041                           *
 939 1042                           * The real abs rl is supposed to be filtered by the
 940 1043                           * extra state if there is one.  We don't bother keeping
 941 1044                           * the abs state in sync all the time because we know it
 942 1045                           * will be filtered later.
 943 1046                           *
 944 1047                           * It's not totally obvious to me how they should be
 945 1048                           * handled.  Perhaps we should take the whole rl and
 946 1049                           * filter by the imaginary states.  Perhaps we should
 947 1050                           * just go with the empty state.
 948 1051                           *
 949 1052                           * Anyway what we currently do is return NULL here and
 950 1053                           * that gets translated into the whole range in
 951 1054                           * get_real_absolute_rl().
 952 1055                           *
 953 1056                           */
 954      -                        return NULL;
     1057 +                        return false;
 955 1058                  } else if (estate_rl(abs_state)) {
 956      -                        return clone_rl(estate_rl(abs_state));
     1059 +                        *res = clone_rl(estate_rl(abs_state));
     1060 +                        return true;
 957 1061                  }
 958 1062  
 959      -                if (get_local_rl(expr, &rl))
 960      -                        return rl;
 961      -                if (get_mtag_rl(expr, &rl))
 962      -                        return rl;
 963      -                if (get_db_type_rl(expr, &rl))
 964      -                        return rl;
 965      -                if (is_array(expr) && get_array_rl(expr, &rl))
 966      -                        return rl;
 967      -                return NULL;
     1063 +                if (get_local_rl(expr, res))
     1064 +                        return true;
     1065 +                if (get_mtag_rl(expr, res))
     1066 +                        return true;
     1067 +                if (get_db_type_rl(expr, res))
     1068 +                        return true;
     1069 +                if (is_array(expr) && get_array_rl(expr, res))
     1070 +                        return true;
     1071 +                return false;
 968 1072          }
 969 1073          case RL_FUZZY:
 970 1074                  if (!get_fuzzy_min_helper(expr, &min))
 971 1075                          min = sval_type_min(get_type(expr));
 972 1076                  if (!get_fuzzy_max_helper(expr, &max))
 973      -                        return NULL;
     1077 +                        return false;
 974 1078                  /* fuzzy ranges are often inverted */
 975 1079                  if (sval_cmp(min, max) > 0) {
 976 1080                          sval = min;
 977 1081                          min = max;
 978 1082                          max = sval;
 979 1083                  }
 980      -                return alloc_rl(min, max);
     1084 +                *res = alloc_rl(min, max);
     1085 +                return true;
 981 1086          }
 982      -        return NULL;
     1087 +        return false;
 983 1088  }
 984 1089  
 985 1090  static sval_t handle_sizeof(struct expression *expr)
 986 1091  {
 987 1092          struct symbol *sym;
 988 1093          sval_t ret;
 989 1094  
 990 1095          ret = sval_blank(expr);
 991 1096          sym = expr->cast_type;
 992 1097          if (!sym) {
↓ open down ↓ 26 lines elided ↑ open up ↑
1019 1124                  if (get_real_base_type(sym) == &void_ctype)
1020 1125                          ret.value = 1;
1021 1126                  else
1022 1127                          ret.value = 0;
1023 1128          } else
1024 1129                  ret.value = type_bytes(sym);
1025 1130  
1026 1131          return ret;
1027 1132  }
1028 1133  
1029      -static struct range_list *handle_strlen(struct expression *expr, int implied, int *recurse_cnt)
     1134 +static bool handle_strlen(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
1030 1135  {
1031      -        struct range_list *rl;
1032 1136          struct expression *arg, *tmp;
1033 1137          sval_t tag;
1034 1138          sval_t ret = { .type = &ulong_ctype };
     1139 +        struct range_list *rl;
1035 1140  
1036      -        if (implied == RL_EXACT)
1037      -                return NULL;
1038      -
1039 1141          arg = get_argument_from_call_expr(expr->args, 0);
1040 1142          if (!arg)
1041      -                return NULL;
     1143 +                return false;
1042 1144          if (arg->type == EXPR_STRING) {
1043 1145                  ret.value = arg->string->length - 1;
1044      -                return alloc_rl(ret, ret);
     1146 +                *res_sval = ret;
     1147 +                return true;
1045 1148          }
     1149 +        if (implied == RL_EXACT)
     1150 +                return false;
1046 1151          if (get_implied_value(arg, &tag) &&
1047 1152              (tmp = fake_string_from_mtag(tag.uvalue))) {
1048 1153                  ret.value = tmp->string->length - 1;
1049      -                return alloc_rl(ret, ret);
     1154 +                *res_sval = ret;
     1155 +                return true;
1050 1156          }
1051 1157  
1052 1158          if (implied == RL_HARD || implied == RL_FUZZY)
1053      -                return NULL;
     1159 +                return false;
1054 1160  
1055      -        if (get_implied_return(expr, &rl))
1056      -                return rl;
     1161 +        if (get_implied_return(expr, &rl)) {
     1162 +                *res = rl;
     1163 +                return true;
     1164 +        }
1057 1165  
1058      -        return NULL;
     1166 +        return false;
1059 1167  }
1060 1168  
1061      -static struct range_list *handle_builtin_constant_p(struct expression *expr, int implied, int *recurse_cnt)
     1169 +static bool handle_builtin_constant_p(struct expression *expr, int implied, int *recurse_cnt, sval_t *res_sval)
1062 1170  {
1063 1171          struct expression *arg;
1064 1172          struct range_list *rl;
1065      -        sval_t sval;
1066 1173  
1067 1174          arg = get_argument_from_call_expr(expr->args, 0);
1068      -        rl = _get_rl(arg, RL_EXACT, recurse_cnt);
1069      -        if (rl_to_sval(rl, &sval))
1070      -                return rl_one();
1071      -        return rl_zero();
     1175 +        if (get_rl_internal(arg, RL_EXACT, recurse_cnt, &rl))
     1176 +                *res_sval = one;
     1177 +        else
     1178 +                *res_sval = zero;
     1179 +        return true;
1072 1180  }
1073 1181  
1074      -static struct range_list *handle__builtin_choose_expr(struct expression *expr, int implied, int *recurse_cnt)
     1182 +static bool handle__builtin_choose_expr(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
1075 1183  {
1076 1184          struct expression *const_expr, *expr1, *expr2;
1077 1185          sval_t sval;
1078 1186  
1079 1187          const_expr = get_argument_from_call_expr(expr->args, 0);
1080 1188          expr1 = get_argument_from_call_expr(expr->args, 1);
1081 1189          expr2 = get_argument_from_call_expr(expr->args, 2);
1082 1190  
1083 1191          if (!get_value(const_expr, &sval) || !expr1 || !expr2)
1084      -                return NULL;
     1192 +                return false;
1085 1193          if (sval.value)
1086      -                return _get_rl(expr1, implied, recurse_cnt);
1087      -        return _get_rl(expr2, implied, recurse_cnt);
     1194 +                return get_rl_sval(expr1, implied, recurse_cnt, res, res_sval);
     1195 +        else
     1196 +                return get_rl_sval(expr2, implied, recurse_cnt, res, res_sval);
1088 1197  }
1089 1198  
1090      -static struct range_list *handle_call_rl(struct expression *expr, int implied, int *recurse_cnt)
     1199 +static bool handle_call_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
1091 1200  {
1092 1201          struct range_list *rl;
1093 1202  
1094 1203          if (sym_name_is("__builtin_constant_p", expr->fn))
1095      -                return handle_builtin_constant_p(expr, implied, recurse_cnt);
     1204 +                return handle_builtin_constant_p(expr, implied, recurse_cnt, res_sval);
1096 1205  
1097 1206          if (sym_name_is("__builtin_choose_expr", expr->fn))
1098      -                return handle__builtin_choose_expr(expr, implied, recurse_cnt);
     1207 +                return handle__builtin_choose_expr(expr, implied, recurse_cnt, res, res_sval);
1099 1208  
1100 1209          if (sym_name_is("__builtin_expect", expr->fn) ||
1101 1210              sym_name_is("__builtin_bswap16", expr->fn) ||
1102 1211              sym_name_is("__builtin_bswap32", expr->fn) ||
1103 1212              sym_name_is("__builtin_bswap64", expr->fn)) {
1104 1213                  struct expression *arg;
1105 1214  
1106 1215                  arg = get_argument_from_call_expr(expr->args, 0);
1107      -                return _get_rl(arg, implied, recurse_cnt);
     1216 +                return get_rl_sval(arg, implied, recurse_cnt, res, res_sval);
1108 1217          }
1109 1218  
1110 1219          if (sym_name_is("strlen", expr->fn))
1111      -                return handle_strlen(expr, implied, recurse_cnt);
     1220 +                return handle_strlen(expr, implied, recurse_cnt, res, res_sval);
1112 1221  
1113 1222          if (implied == RL_EXACT || implied == RL_HARD || implied == RL_FUZZY)
1114      -                return NULL;
     1223 +                return false;
1115 1224  
1116 1225          if (custom_handle_variable) {
1117 1226                  rl = custom_handle_variable(expr);
1118      -                if (rl)
1119      -                        return rl;
     1227 +                if (rl) {
     1228 +                        *res = rl;
     1229 +                        return true;
     1230 +                }
1120 1231          }
1121 1232  
1122      -        if (get_implied_return(expr, &rl))
1123      -                return rl;
1124      -        return db_return_vals(expr);
     1233 +        /* Ugh...  get_implied_return() sets *rl to NULL on failure */
     1234 +        if (get_implied_return(expr, &rl)) {
     1235 +                *res = rl;
     1236 +                return true;
     1237 +        }
     1238 +        rl = db_return_vals(expr);
     1239 +        if (rl) {
     1240 +                *res = rl;
     1241 +                return true;
     1242 +        }
     1243 +        return false;
1125 1244  }
1126 1245  
1127      -static struct range_list *handle_cast(struct expression *expr, int implied, int *recurse_cnt)
     1246 +static bool handle_cast(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
1128 1247  {
1129 1248          struct range_list *rl;
1130 1249          struct symbol *type;
     1250 +        sval_t sval = {};
1131 1251  
1132 1252          type = get_type(expr);
1133      -        rl = _get_rl(expr->cast_expression, implied, recurse_cnt);
1134      -        if (rl)
1135      -                return cast_rl(type, rl);
1136      -        if (implied == RL_ABSOLUTE || implied == RL_REAL_ABSOLUTE)
1137      -                return alloc_whole_rl(type);
     1253 +        if (get_rl_sval(expr->cast_expression, implied, recurse_cnt, &rl, &sval)) {
     1254 +                if (sval.type)
     1255 +                        *res_sval = sval_cast(type, sval);
     1256 +                else
     1257 +                        *res = cast_rl(type, rl);
     1258 +                return true;
     1259 +        }
     1260 +        if (implied == RL_ABSOLUTE || implied == RL_REAL_ABSOLUTE) {
     1261 +                *res = alloc_whole_rl(type);
     1262 +                return true;
     1263 +        }
1138 1264          if (implied == RL_IMPLIED && type &&
1139      -            type_bits(type) > 0 && type_bits(type) < 32)
1140      -                return alloc_whole_rl(type);
1141      -        return NULL;
     1265 +            type_bits(type) > 0 && type_bits(type) < 32) {
     1266 +                *res = alloc_whole_rl(type);
     1267 +                return true;
     1268 +        }
     1269 +        return false;
1142 1270  }
1143 1271  
1144      -static struct range_list *_get_rl(struct expression *expr, int implied, int *recurse_cnt)
     1272 +static bool get_offset_from_down(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
1145 1273  {
     1274 +        struct expression *index;
     1275 +        struct symbol *type = expr->in;
1146 1276          struct range_list *rl;
     1277 +        struct symbol *field;
     1278 +        int offset = 0;
     1279 +        sval_t sval = { .type = ssize_t_ctype };
     1280 +        sval_t tmp_sval = {};
     1281 +
     1282 +        /*
     1283 +         * FIXME:  I don't really know what I'm doing here.  I wish that I
     1284 +         * could just get rid of the __builtin_offset() function and use:
     1285 +         * "&((struct bpf_prog *)NULL)->insns[fprog->len]" instead...
     1286 +         * Anyway, I have done the minimum ammount of work to get that
     1287 +         * expression to work.
     1288 +         *
     1289 +         */
     1290 +
     1291 +        if (expr->op != '.' || !expr->down ||
     1292 +            expr->down->type != EXPR_OFFSETOF ||
     1293 +            expr->down->op != '[' ||
     1294 +            !expr->down->index)
     1295 +                return false;
     1296 +
     1297 +        index = expr->down->index;
     1298 +
     1299 +        examine_symbol_type(type);
     1300 +        type = get_real_base_type(type);
     1301 +        if (!type)
     1302 +                return false;
     1303 +        field = find_identifier(expr->ident, type->symbol_list, &offset);
     1304 +        if (!field)
     1305 +                return false;
     1306 +
     1307 +        type = get_real_base_type(field);
     1308 +        if (!type || type->type != SYM_ARRAY)
     1309 +                return false;
     1310 +        type = get_real_base_type(type);
     1311 +
     1312 +        if (get_implied_value_internal(index, recurse_cnt, &sval)) {
     1313 +                res_sval->type = ssize_t_ctype;
     1314 +                res_sval->value = offset + sval.value * type_bytes(type);
     1315 +                return true;
     1316 +        }
     1317 +
     1318 +        if (!get_rl_sval(index, implied, recurse_cnt, &rl, &tmp_sval))
     1319 +                return false;
     1320 +
     1321 +        /*
     1322 +         * I'm not sure why get_rl_sval() would return an sval when
     1323 +         * get_implied_value_internal() failed but it does when I
     1324 +         * parse drivers/net/ethernet/mellanox/mlx5/core/en/monitor_stats.c
     1325 +         *
     1326 +         */
     1327 +        if (tmp_sval.type) {
     1328 +                res_sval->type = ssize_t_ctype;
     1329 +                res_sval->value = offset + sval.value * type_bytes(type);
     1330 +                return true;
     1331 +        }
     1332 +
     1333 +        sval.value = type_bytes(type);
     1334 +        rl = rl_binop(rl, '*', alloc_rl(sval, sval));
     1335 +        sval.value = offset;
     1336 +        *res = rl_binop(rl, '+', alloc_rl(sval, sval));
     1337 +        return true;
     1338 +}
     1339 +
     1340 +static bool get_offset_from_in(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
     1341 +{
     1342 +        struct symbol *type = get_real_base_type(expr->in);
     1343 +        struct symbol *field;
     1344 +        int offset = 0;
     1345 +
     1346 +        if (expr->op != '.' || !type || !expr->ident)
     1347 +                return false;
     1348 +
     1349 +        field = find_identifier(expr->ident, type->symbol_list, &offset);
     1350 +        if (!field)
     1351 +                return false;
     1352 +
     1353 +        res_sval->type = size_t_ctype;
     1354 +        res_sval->value = offset;
     1355 +
     1356 +        return true;
     1357 +}
     1358 +
     1359 +static bool handle_offsetof_rl(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *res_sval)
     1360 +{
     1361 +        if (get_offset_from_down(expr, implied, recurse_cnt, res, res_sval))
     1362 +                return true;
     1363 +
     1364 +        if (get_offset_from_in(expr, implied, recurse_cnt, res, res_sval))
     1365 +                return true;
     1366 +
     1367 +        evaluate_expression(expr);
     1368 +        if (expr->type == EXPR_VALUE) {
     1369 +                *res_sval = sval_from_val(expr, expr->value);
     1370 +                return true;
     1371 +        }
     1372 +        return false;
     1373 +}
     1374 +
     1375 +static bool get_rl_sval(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res, sval_t *sval_res)
     1376 +{
     1377 +        struct range_list *rl = (void *)-1UL;
1147 1378          struct symbol *type;
1148      -        sval_t sval;
     1379 +        sval_t sval = {};
1149 1380  
1150 1381          type = get_type(expr);
1151 1382          expr = strip_parens(expr);
1152 1383          if (!expr)
1153      -                return NULL;
     1384 +                return false;
1154 1385  
1155 1386          if (++(*recurse_cnt) >= 200)
1156      -                return NULL;
     1387 +                return false;
1157 1388  
1158 1389          switch(expr->type) {
1159 1390          case EXPR_CAST:
1160 1391          case EXPR_FORCE_CAST:
1161 1392          case EXPR_IMPLIED_CAST:
1162      -                rl = handle_cast(expr, implied, recurse_cnt);
     1393 +                handle_cast(expr, implied, recurse_cnt, &rl, &sval);
1163 1394                  goto out_cast;
1164 1395          }
1165 1396  
1166 1397          expr = strip_expr(expr);
1167 1398          if (!expr)
1168      -                return NULL;
     1399 +                return false;
1169 1400  
1170 1401          switch (expr->type) {
1171 1402          case EXPR_VALUE:
1172 1403                  sval = sval_from_val(expr, expr->value);
1173      -                rl = alloc_rl(sval, sval);
1174 1404                  break;
1175 1405          case EXPR_PREOP:
1176      -                rl = handle_preop_rl(expr, implied, recurse_cnt);
     1406 +                handle_preop_rl(expr, implied, recurse_cnt, &rl, &sval);
1177 1407                  break;
1178 1408          case EXPR_POSTOP:
1179      -                rl = _get_rl(expr->unop, implied, recurse_cnt);
     1409 +                get_rl_sval(expr->unop, implied, recurse_cnt, &rl, &sval);
1180 1410                  break;
1181 1411          case EXPR_BINOP:
1182      -                rl = handle_binop_rl(expr, implied, recurse_cnt);
     1412 +                handle_binop_rl(expr, implied, recurse_cnt, &rl, &sval);
1183 1413                  break;
1184 1414          case EXPR_COMPARE:
1185      -                rl = handle_comparison_rl(expr, implied, recurse_cnt);
     1415 +                handle_comparison_rl(expr, implied, recurse_cnt, &rl, &sval);
1186 1416                  break;
1187 1417          case EXPR_LOGICAL:
1188      -                rl = handle_logical_rl(expr, implied, recurse_cnt);
     1418 +                handle_logical_rl(expr, implied, recurse_cnt, &rl, &sval);
1189 1419                  break;
1190 1420          case EXPR_PTRSIZEOF:
1191 1421          case EXPR_SIZEOF:
1192 1422                  sval = handle_sizeof(expr);
1193      -                rl = alloc_rl(sval, sval);
1194 1423                  break;
1195 1424          case EXPR_SELECT:
1196 1425          case EXPR_CONDITIONAL:
1197      -                rl = handle_conditional_rl(expr, implied, recurse_cnt);
     1426 +                handle_conditional_rl(expr, implied, recurse_cnt, &rl, &sval);
1198 1427                  break;
1199 1428          case EXPR_CALL:
1200      -                rl = handle_call_rl(expr, implied, recurse_cnt);
     1429 +                handle_call_rl(expr, implied, recurse_cnt, &rl, &sval);
1201 1430                  break;
1202 1431          case EXPR_STRING:
1203      -                rl = NULL;
1204 1432                  if (get_mtag_sval(expr, &sval))
1205      -                        rl = alloc_rl(sval, sval);
     1433 +                        break;
     1434 +                if (implied == RL_EXACT)
     1435 +                        break;
     1436 +                rl = alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval);
1206 1437                  break;
     1438 +        case EXPR_OFFSETOF:
     1439 +                handle_offsetof_rl(expr, implied, recurse_cnt, &rl, &sval);
     1440 +                break;
     1441 +        case EXPR_ALIGNOF:
     1442 +                evaluate_expression(expr);
     1443 +                if (expr->type == EXPR_VALUE)
     1444 +                        sval = sval_from_val(expr, expr->value);
     1445 +                break;
1207 1446          default:
1208      -                rl = handle_variable(expr, implied, recurse_cnt);
     1447 +                handle_variable(expr, implied, recurse_cnt, &rl, &sval);
1209 1448          }
1210 1449  
1211 1450  out_cast:
1212      -        if (rl)
1213      -                return rl;
1214      -        if (type && (implied == RL_ABSOLUTE || implied == RL_REAL_ABSOLUTE))
1215      -                return alloc_whole_rl(type);
1216      -        return NULL;
     1451 +        if (rl == (void *)-1UL)
     1452 +                rl = NULL;
     1453 +
     1454 +        if (sval.type || (rl && rl_to_sval(rl, &sval))) {
     1455 +                *sval_res = sval;
     1456 +                return true;
     1457 +        }
     1458 +        if (implied == RL_EXACT)
     1459 +                return false;
     1460 +
     1461 +        if (rl) {
     1462 +                *res = rl;
     1463 +                return true;
     1464 +        }
     1465 +        if (type && (implied == RL_ABSOLUTE || implied == RL_REAL_ABSOLUTE)) {
     1466 +                *res = alloc_whole_rl(type);
     1467 +                return true;
     1468 +        }
     1469 +        return false;
1217 1470  }
1218 1471  
     1472 +static bool get_rl_internal(struct expression *expr, int implied, int *recurse_cnt, struct range_list **res)
     1473 +{
     1474 +        struct range_list *rl = NULL;
     1475 +        sval_t sval = {};
     1476 +
     1477 +        if (!get_rl_sval(expr, implied, recurse_cnt, &rl, &sval))
     1478 +                return false;
     1479 +
     1480 +        if (sval.type)
     1481 +                *res = alloc_rl(sval, sval);
     1482 +        else
     1483 +                *res = rl;
     1484 +        return true;
     1485 +}
     1486 +
     1487 +static bool get_rl_helper(struct expression *expr, int implied, struct range_list **res)
     1488 +{
     1489 +        struct range_list *rl = NULL;
     1490 +        sval_t sval = {};
     1491 +        int recurse_cnt = 0;
     1492 +
     1493 +        if (get_value(expr, &sval)) {
     1494 +                *res = alloc_rl(sval, sval);
     1495 +                return true;
     1496 +        }
     1497 +
     1498 +        if (!get_rl_sval(expr, implied, &recurse_cnt, &rl, &sval))
     1499 +                return false;
     1500 +
     1501 +        if (sval.type)
     1502 +                *res = alloc_rl(sval, sval);
     1503 +        else
     1504 +                *res = rl;
     1505 +        return true;
     1506 +}
     1507 +
1219 1508  struct {
1220 1509          struct expression *expr;
1221      -        struct range_list *rl;
     1510 +        sval_t sval;
1222 1511  } cached_results[24];
1223 1512  static int cache_idx;
1224 1513  
1225 1514  void clear_math_cache(void)
1226 1515  {
1227 1516          memset(cached_results, 0, sizeof(cached_results));
1228 1517  }
1229 1518  
     1519 +/*
     1520 + * Don't cache EXPR_VALUE because values are fast already.
     1521 + *
     1522 + */
     1523 +static bool get_value_literal(struct expression *expr, sval_t *res_sval)
     1524 +{
     1525 +        struct expression *tmp;
     1526 +        int recurse_cnt = 0;
     1527 +
     1528 +        tmp = strip_expr(expr);
     1529 +        if (!tmp || tmp->type != EXPR_VALUE)
     1530 +                return false;
     1531 +
     1532 +        return get_rl_sval(expr, RL_EXACT, &recurse_cnt, NULL, res_sval);
     1533 +}
     1534 +
1230 1535  /* returns 1 if it can get a value literal or else returns 0 */
1231      -int get_value(struct expression *expr, sval_t *sval)
     1536 +int get_value(struct expression *expr, sval_t *res_sval)
1232 1537  {
1233 1538          struct range_list *(*orig_custom_fn)(struct expression *expr);
1234      -        struct range_list *rl;
1235 1539          int recurse_cnt = 0;
1236      -        sval_t tmp;
     1540 +        sval_t sval = {};
1237 1541          int i;
1238 1542  
     1543 +        if (get_value_literal(expr, res_sval))
     1544 +                return 1;
     1545 +
1239 1546          /*
1240 1547           * This only handles RL_EXACT because other expr statements can be
1241 1548           * different at different points.  Like the list iterator, for example.
1242 1549           */
1243 1550          for (i = 0; i < ARRAY_SIZE(cached_results); i++) {
1244      -                if (expr == cached_results[i].expr)
1245      -                        return rl_to_sval(cached_results[i].rl, sval);
     1551 +                if (expr == cached_results[i].expr) {
     1552 +                        if (cached_results[i].sval.type) {
     1553 +                                *res_sval = cached_results[i].sval;
     1554 +                                return true;
     1555 +                        }
     1556 +                        return false;
     1557 +                }
1246 1558          }
1247 1559  
1248 1560          orig_custom_fn = custom_handle_variable;
1249 1561          custom_handle_variable = NULL;
1250      -        rl = _get_rl(expr, RL_EXACT, &recurse_cnt);
1251      -        if (!rl_to_sval(rl, &tmp))
1252      -                rl = NULL;
     1562 +        get_rl_sval(expr, RL_EXACT, &recurse_cnt, NULL, &sval);
     1563 +
1253 1564          custom_handle_variable = orig_custom_fn;
1254 1565  
1255 1566          cached_results[cache_idx].expr = expr;
1256      -        cached_results[cache_idx].rl = rl;
     1567 +        cached_results[cache_idx].sval = sval;
1257 1568          cache_idx = (cache_idx + 1) % ARRAY_SIZE(cached_results);
1258 1569  
1259      -        if (!rl)
     1570 +        if (!sval.type)
1260 1571                  return 0;
1261 1572  
1262      -        *sval = tmp;
     1573 +        *res_sval = sval;
1263 1574          return 1;
1264 1575  }
1265 1576  
1266      -static int get_implied_value_internal(struct expression *expr, sval_t *sval, int *recurse_cnt)
     1577 +static bool get_implied_value_internal(struct expression *expr, int *recurse_cnt, sval_t *res_sval)
1267 1578  {
1268 1579          struct range_list *rl;
1269 1580  
1270      -        rl =  _get_rl(expr, RL_IMPLIED, recurse_cnt);
1271      -        if (!rl_to_sval(rl, sval))
1272      -                return 0;
1273      -        return 1;
     1581 +        res_sval->type = NULL;
     1582 +
     1583 +        if (!get_rl_sval(expr, RL_IMPLIED, recurse_cnt, &rl, res_sval))
     1584 +                return false;
     1585 +        if (!res_sval->type && !rl_to_sval(rl, res_sval))
     1586 +                return false;
     1587 +        return true;
1274 1588  }
1275 1589  
1276 1590  int get_implied_value(struct expression *expr, sval_t *sval)
1277 1591  {
1278 1592          struct range_list *rl;
1279      -        int recurse_cnt = 0;
1280 1593  
1281      -        rl =  _get_rl(expr, RL_IMPLIED, &recurse_cnt);
1282      -        if (!rl_to_sval(rl, sval))
     1594 +        if (!get_rl_helper(expr, RL_IMPLIED, &rl) ||
     1595 +            !rl_to_sval(rl, sval))
1283 1596                  return 0;
1284 1597          return 1;
1285 1598  }
1286 1599  
1287 1600  int get_implied_min(struct expression *expr, sval_t *sval)
1288 1601  {
1289 1602          struct range_list *rl;
1290      -        int recurse_cnt = 0;
1291 1603  
1292      -        rl =  _get_rl(expr, RL_IMPLIED, &recurse_cnt);
1293      -        if (!rl)
     1604 +        if (!get_rl_helper(expr, RL_IMPLIED, &rl) || !rl)
1294 1605                  return 0;
1295 1606          *sval = rl_min(rl);
1296 1607          return 1;
1297 1608  }
1298 1609  
1299 1610  int get_implied_max(struct expression *expr, sval_t *sval)
1300 1611  {
1301 1612          struct range_list *rl;
1302      -        int recurse_cnt = 0;
1303 1613  
1304      -        rl =  _get_rl(expr, RL_IMPLIED, &recurse_cnt);
1305      -        if (!rl)
     1614 +        if (!get_rl_helper(expr, RL_IMPLIED, &rl) || !rl)
1306 1615                  return 0;
1307 1616          *sval = rl_max(rl);
1308 1617          return 1;
1309 1618  }
1310 1619  
1311 1620  int get_implied_rl(struct expression *expr, struct range_list **rl)
1312 1621  {
1313      -        int recurse_cnt = 0;
1314      -
1315      -        *rl = _get_rl(expr, RL_IMPLIED, &recurse_cnt);
1316      -        if (*rl)
1317      -                return 1;
1318      -        return 0;
     1622 +        if (!get_rl_helper(expr, RL_IMPLIED, rl) || !*rl)
     1623 +                return 0;
     1624 +        return 1;
1319 1625  }
1320 1626  
1321 1627  static int get_absolute_rl_internal(struct expression *expr, struct range_list **rl, int *recurse_cnt)
1322 1628  {
1323      -        *rl = _get_rl(expr, RL_ABSOLUTE, recurse_cnt);
     1629 +        *rl = NULL;
     1630 +        get_rl_internal(expr, RL_ABSOLUTE, recurse_cnt, rl);
1324 1631          if (!*rl)
1325 1632                  *rl = alloc_whole_rl(get_type(expr));
1326 1633          return 1;
1327 1634  }
1328 1635  
1329 1636  int get_absolute_rl(struct expression *expr, struct range_list **rl)
1330 1637  {
1331      -        int recurse_cnt = 0;
1332      -
1333      -        *rl = _get_rl(expr, RL_ABSOLUTE, &recurse_cnt);
     1638 +        *rl = NULL;
     1639 +         get_rl_helper(expr, RL_ABSOLUTE, rl);
1334 1640          if (!*rl)
1335 1641                  *rl = alloc_whole_rl(get_type(expr));
1336 1642          return 1;
1337 1643  }
1338 1644  
1339 1645  int get_real_absolute_rl(struct expression *expr, struct range_list **rl)
1340 1646  {
1341      -        int recurse_cnt = 0;
1342      -
1343      -        *rl = _get_rl(expr, RL_REAL_ABSOLUTE, &recurse_cnt);
     1647 +        *rl = NULL;
     1648 +        get_rl_helper(expr, RL_REAL_ABSOLUTE, rl);
1344 1649          if (!*rl)
1345 1650                  *rl = alloc_whole_rl(get_type(expr));
1346 1651          return 1;
1347 1652  }
1348 1653  
1349 1654  int custom_get_absolute_rl(struct expression *expr,
1350 1655                             struct range_list *(*fn)(struct expression *expr),
1351 1656                             struct range_list **rl)
1352 1657  {
1353      -        int recurse_cnt = 0;
     1658 +        int ret;
1354 1659  
1355 1660          *rl = NULL;
1356 1661          custom_handle_variable = fn;
1357      -        *rl = _get_rl(expr, RL_REAL_ABSOLUTE, &recurse_cnt);
     1662 +        ret = get_rl_helper(expr, RL_REAL_ABSOLUTE, rl);
1358 1663          custom_handle_variable = NULL;
1359      -        return 1;
     1664 +        return ret;
1360 1665  }
1361 1666  
1362 1667  int get_implied_rl_var_sym(const char *var, struct symbol *sym, struct range_list **rl)
1363 1668  {
1364 1669          struct smatch_state *state;
1365 1670  
1366 1671          state = get_state(SMATCH_EXTRA, var, sym);
1367 1672          *rl = estate_rl(state);
1368 1673          if (*rl)
1369 1674                  return 1;
1370 1675          return 0;
1371 1676  }
1372 1677  
1373 1678  int get_hard_max(struct expression *expr, sval_t *sval)
1374 1679  {
1375 1680          struct range_list *rl;
1376      -        int recurse_cnt = 0;
1377 1681  
1378      -        rl =  _get_rl(expr, RL_HARD, &recurse_cnt);
1379      -        if (!rl)
     1682 +        if (!get_rl_helper(expr, RL_HARD, &rl) || !rl)
1380 1683                  return 0;
1381 1684          *sval = rl_max(rl);
1382 1685          return 1;
1383 1686  }
1384 1687  
1385 1688  int get_fuzzy_min(struct expression *expr, sval_t *sval)
1386 1689  {
1387 1690          struct range_list *rl;
1388 1691          sval_t tmp;
1389      -        int recurse_cnt = 0;
1390 1692  
1391      -        rl =  _get_rl(expr, RL_FUZZY, &recurse_cnt);
1392      -        if (!rl)
     1693 +        if (!get_rl_helper(expr, RL_FUZZY, &rl) || !rl)
1393 1694                  return 0;
1394 1695          tmp = rl_min(rl);
1395 1696          if (sval_is_negative(tmp) && sval_is_min(tmp))
1396 1697                  return 0;
1397 1698          *sval = tmp;
1398 1699          return 1;
1399 1700  }
1400 1701  
1401 1702  int get_fuzzy_max(struct expression *expr, sval_t *sval)
1402 1703  {
1403 1704          struct range_list *rl;
1404 1705          sval_t max;
1405      -        int recurse_cnt = 0;
1406 1706  
1407      -        rl =  _get_rl(expr, RL_FUZZY, &recurse_cnt);
1408      -        if (!rl)
     1707 +        if (!get_rl_helper(expr, RL_FUZZY, &rl) || !rl)
1409 1708                  return 0;
1410 1709          max = rl_max(rl);
1411 1710          if (max.uvalue > INT_MAX - 10000)
1412 1711                  return 0;
1413 1712          *sval = max;
1414 1713          return 1;
1415 1714  }
1416 1715  
1417 1716  int get_absolute_min(struct expression *expr, sval_t *sval)
1418 1717  {
1419 1718          struct range_list *rl;
1420 1719          struct symbol *type;
1421      -        int recurse_cnt = 0;
1422 1720  
1423 1721          type = get_type(expr);
1424 1722          if (!type)
1425 1723                  type = &llong_ctype;  // FIXME: this is wrong but places assume get type can't fail.
1426      -        rl = _get_rl(expr, RL_REAL_ABSOLUTE, &recurse_cnt);
     1724 +        rl = NULL;
     1725 +        get_rl_helper(expr, RL_REAL_ABSOLUTE, &rl);
1427 1726          if (rl)
1428 1727                  *sval = rl_min(rl);
1429 1728          else
1430 1729                  *sval = sval_type_min(type);
1431 1730  
1432 1731          if (sval_cmp(*sval, sval_type_min(type)) < 0)
1433 1732                  *sval = sval_type_min(type);
1434 1733          return 1;
1435 1734  }
1436 1735  
1437 1736  int get_absolute_max(struct expression *expr, sval_t *sval)
1438 1737  {
1439 1738          struct range_list *rl;
1440 1739          struct symbol *type;
1441      -        int recurse_cnt = 0;
1442 1740  
1443 1741          type = get_type(expr);
1444 1742          if (!type)
1445 1743                  type = &llong_ctype;
1446      -        rl = _get_rl(expr, RL_REAL_ABSOLUTE, &recurse_cnt);
     1744 +        rl = NULL;
     1745 +        get_rl_helper(expr, RL_REAL_ABSOLUTE, &rl);
1447 1746          if (rl)
1448 1747                  *sval = rl_max(rl);
1449 1748          else
1450 1749                  *sval = sval_type_max(type);
1451 1750  
1452 1751          if (sval_cmp(sval_type_max(type), *sval) < 0)
1453 1752                  *sval = sval_type_max(type);
1454 1753          return 1;
1455 1754  }
1456 1755  
↓ open down ↓ 88 lines elided ↑ open up ↑
1545 1844                          return implied_condition_false(tmp);
1546 1845                  break;
1547 1846          default:
1548 1847                  if (get_implied_value(expr, &sval) && sval.value == 0)
1549 1848                          return 1;
1550 1849                  break;
1551 1850          }
1552 1851          return 0;
1553 1852  }
1554 1853  
1555      -int can_integer_overflow(struct symbol *type, struct expression *expr)
1556      -{
1557      -        int op;
1558      -        sval_t lmax, rmax, res;
1559 1854  
1560      -        if (!type)
1561      -                type = &int_ctype;
1562      -
1563      -        expr = strip_expr(expr);
1564      -
1565      -        if (expr->type == EXPR_ASSIGNMENT) {
1566      -                switch(expr->op) {
1567      -                case SPECIAL_MUL_ASSIGN:
1568      -                        op = '*';
1569      -                        break;
1570      -                case SPECIAL_ADD_ASSIGN:
1571      -                        op = '+';
1572      -                        break;
1573      -                case SPECIAL_SHL_ASSIGN:
1574      -                        op = SPECIAL_LEFTSHIFT;
1575      -                        break;
1576      -                default:
1577      -                        return 0;
1578      -                }
1579      -        } else if (expr->type == EXPR_BINOP) {
1580      -                if (expr->op != '*' && expr->op != '+' && expr->op != SPECIAL_LEFTSHIFT)
1581      -                        return 0;
1582      -                op = expr->op;
1583      -        } else {
1584      -                return 0;
1585      -        }
1586      -
1587      -        get_absolute_max(expr->left, &lmax);
1588      -        get_absolute_max(expr->right, &rmax);
1589      -
1590      -        if (sval_binop_overflows(lmax, op, rmax))
1591      -                return 1;
1592      -
1593      -        res = sval_binop(lmax, op, rmax);
1594      -        if (sval_cmp(res, sval_type_max(type)) > 0)
1595      -                return 1;
1596      -        return 0;
1597      -}
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX