4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
12 #include "smatch_slist.h"
13 #include "smatch_extra.h"
15 static struct range_list
*_get_rl(struct expression
*expr
, int implied
);
16 static struct range_list
*handle_variable(struct expression
*expr
, int implied
);
17 static sval_t
_get_value(struct expression
*expr
, int *undefined
, int implied
);
18 static sval_t
_get_implied_value(struct expression
*expr
, int *undefined
, int implied
);
22 static sval_t zero
= {.type
= &int_ctype
, {.value
= 0} };
23 static sval_t one
= {.type
= &int_ctype
, {.value
= 1} };
24 static sval_t bogus
= {.type
= &int_ctype
, {.value
= BOGUS
} };
26 static struct range_list
*rl_zero(void)
28 return alloc_rl(zero
, zero
);
31 static struct range_list
*rl_one(void)
33 return alloc_rl(one
, one
);
56 static int implied_to_rl_enum(int implied
)
77 static int opposite_implied(int implied
)
79 if (implied
== IMPLIED_MIN
)
81 if (implied
== IMPLIED_MAX
)
83 if (implied
== FUZZY_MIN
)
85 if (implied
== FUZZY_MAX
)
87 if (implied
== ABSOLUTE_MIN
)
89 if (implied
== ABSOLUTE_MAX
)
91 if (implied
== HARD_MAX
) /* we don't have a hard min. */
97 static struct range_list
*last_stmt_rl(struct statement
*stmt
, int implied
)
102 stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
103 if (stmt
->type
!= STMT_EXPRESSION
)
105 return _get_rl(stmt
->expression
, implied
);
108 static struct range_list
*handle_expression_statement_rl(struct expression
*expr
, int implied
)
110 return last_stmt_rl(get_expression_statement(expr
), implied
);
113 static int last_stmt_sval(struct statement
*stmt
, sval_t
*sval
)
115 struct expression
*expr
;
120 stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
121 if (stmt
->type
!= STMT_EXPRESSION
)
123 expr
= stmt
->expression
;
124 if (!get_value(expr
, sval
))
129 static sval_t
handle_expression_statement(struct expression
*expr
, int *undefined
, int implied
)
131 struct statement
*stmt
;
134 stmt
= get_expression_statement(expr
);
135 if (!last_stmt_sval(stmt
, &ret
)) {
143 static struct range_list
*handle_ampersand_rl(int implied
)
145 if (implied
== EXACT
|| implied
== HARD_MAX
)
147 return alloc_rl(valid_ptr_min_sval
, valid_ptr_max_sval
);
150 static sval_t
handle_ampersand(int *undefined
, int implied
)
154 ret
.type
= &ptr_ctype
;
157 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
158 return valid_ptr_min_sval
;
159 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
160 return valid_ptr_max_sval
;
166 static struct range_list
*handle_negate_rl(struct expression
*expr
, int implied
)
168 if (known_condition_true(expr
->unop
))
170 if (known_condition_false(expr
->unop
))
173 if (implied
== EXACT
)
176 if (implied_condition_true(expr
->unop
))
178 if (implied_condition_false(expr
->unop
))
180 return alloc_rl(zero
, one
);
183 static sval_t
handle_negate(struct expression
*expr
, int *undefined
, int implied
)
187 ret
= sval_blank(expr
->unop
);
189 if (known_condition_true(expr
->unop
)) {
194 if (implied
== EXACT
) {
199 if (implied_condition_true(expr
->unop
)) {
203 if (implied_condition_false(expr
->unop
)) {
207 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
) {
211 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
) {
219 static struct range_list
*handle_bitwise_negate(struct expression
*expr
, int implied
)
221 struct range_list
*rl
;
224 rl
= _get_rl(expr
->unop
, implied
);
225 if (!rl_to_sval(rl
, &sval
))
227 sval
= sval_preop(sval
, '~');
228 sval_cast(get_type(expr
->unop
), sval
);
229 return alloc_rl(sval
, sval
);
232 static struct range_list
*handle_minus_preop(struct expression
*expr
, int implied
)
234 struct range_list
*rl
;
237 rl
= _get_rl(expr
->unop
, implied
);
238 if (!rl_to_sval(rl
, &sval
))
240 sval
= sval_preop(sval
, '-');
241 return alloc_rl(sval
, sval
);
244 static struct range_list
*handle_preop_rl(struct expression
*expr
, int implied
)
248 return handle_ampersand_rl(implied
);
250 return handle_negate_rl(expr
, implied
);
252 return handle_bitwise_negate(expr
, implied
);
254 return handle_minus_preop(expr
, implied
);
256 return handle_variable(expr
, implied
);
258 return handle_expression_statement_rl(expr
, implied
);
264 static sval_t
handle_preop(struct expression
*expr
, int *undefined
, int implied
)
270 ret
= handle_ampersand(undefined
, implied
);
273 ret
= handle_negate(expr
, undefined
, implied
);
276 ret
= _get_value(expr
->unop
, undefined
, implied
);
277 ret
= sval_preop(ret
, '~');
278 ret
= sval_cast(get_type(expr
->unop
), ret
);
281 ret
= _get_value(expr
->unop
, undefined
, implied
);
282 ret
= sval_preop(ret
, '-');
285 ret
= _get_implied_value(expr
, undefined
, implied
);
288 ret
= handle_expression_statement(expr
, undefined
, implied
);
292 ret
= sval_blank(expr
);
294 ret
= sval_cast(get_type(expr
), ret
);
298 static sval_t
handle_divide(struct expression
*expr
, int *undefined
, int implied
)
302 left
= _get_value(expr
->left
, undefined
, implied
);
303 right
= _get_value(expr
->right
, undefined
, opposite_implied(implied
));
305 if (right
.value
== 0) {
310 return sval_binop(left
, '/', right
);
313 static sval_t
handle_subtract(struct expression
*expr
, int *undefined
, int implied
)
316 sval_t left
, right
, ret
;
317 int left_undefined
= 0;
318 int right_undefined
= 0;
319 int known_but_negative
= 0;
322 left
= _get_value(expr
->left
, &left_undefined
, implied
);
323 right
= _get_value(expr
->right
, &right_undefined
, opposite_implied(implied
));
325 if (!left_undefined
&& !right_undefined
) {
326 ret
= sval_binop(left
, '-', right
);
327 if (sval_is_negative(ret
))
328 known_but_negative
= 1;
330 return ret
; /* best case scenario */
333 comparison
= get_comparison(expr
->left
, expr
->right
);
337 type
= get_type(expr
);
339 switch (comparison
) {
341 case SPECIAL_UNSIGNED_GT
:
346 return sval_type_val(type
, 1);
350 return _get_value(expr
->left
, undefined
, implied
);
354 case SPECIAL_UNSIGNED_GTE
:
359 return sval_type_val(type
, 0);
363 return _get_value(expr
->left
, undefined
, implied
);
368 if (known_but_negative
)
376 static struct range_list
*handle_mod_rl(struct expression
*expr
, int implied
)
378 struct range_list
*rl
;
379 sval_t left
, right
, sval
;
381 if (implied
== EXACT
) {
382 if (!get_value(expr
->right
, &right
))
384 if (!get_value(expr
->left
, &left
))
386 sval
= sval_binop(left
, '%', right
);
387 return alloc_rl(sval
, sval
);
389 /* if we can't figure out the right side it's probably hopeless */
390 if (!get_implied_value(expr
->right
, &right
))
393 right
= sval_cast(get_type(expr
), right
);
396 rl
= _get_rl(expr
->left
, implied
);
397 if (rl
&& rl_max(rl
).uvalue
< right
.uvalue
)
398 right
.uvalue
= rl_max(rl
).uvalue
;
400 return alloc_rl(zero
, right
);
403 static sval_t
handle_mod(struct expression
*expr
, int *undefined
, int implied
)
407 /* if we can't figure out the right side it's probably hopeless */
408 right
= _get_value(expr
->right
, undefined
, implied
);
409 if (*undefined
|| right
.value
== 0) {
417 left
= _get_value(expr
->left
, undefined
, implied
);
419 return sval_binop(left
, '%', right
);
425 return sval_type_val(get_type(expr
), 0);
430 right
= sval_cast(get_type(expr
), right
);
437 static struct range_list
*handle_bitwise_AND(struct expression
*expr
, int implied
)
440 struct range_list
*left_rl
, *right_rl
;
442 if (implied
== EXACT
|| implied
== HARD_MAX
)
444 type
= get_type(expr
);
446 left_rl
= _get_rl(expr
->left
, implied
);
448 left_rl
= cast_rl(type
, left_rl
);
449 left_rl
= alloc_rl(sval_type_val(type
, 0), rl_max(left_rl
));
451 left_rl
= alloc_whole_rl(type
);
454 right_rl
= _get_rl(expr
->right
, implied
);
456 right_rl
= cast_rl(type
, right_rl
);
457 right_rl
= alloc_rl(sval_type_val(type
, 0), rl_max(right_rl
));
459 right_rl
= alloc_whole_rl(type
);
462 return rl_intersection(left_rl
, right_rl
);
465 static struct range_list
*handle_known_binop(struct expression
*expr
)
469 if (!get_value(expr
->left
, &left
))
471 if (!get_value(expr
->right
, &right
))
473 left
= sval_binop(left
, expr
->op
, right
);
474 return alloc_rl(left
, left
);
477 static struct range_list
*handle_binop_rl(struct expression
*expr
, int implied
)
481 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
484 struct range_list
*rl
;
486 rl
= handle_known_binop(expr
);
489 if (implied
== EXACT
)
494 return handle_mod_rl(expr
, implied
);
496 return handle_bitwise_AND(expr
, implied
);
497 case SPECIAL_RIGHTSHIFT
:
498 if (implied
== HARD_MAX
)
500 left
= _get_value(expr
->left
, &local_undef
, implied
);
502 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
503 ret
= sval_blank(expr
->left
);
505 return alloc_rl(ret
, ret
);
507 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
509 if (!get_absolute_max(expr
->left
, &left
))
512 right
= _get_value(expr
->right
, &undefined
, implied
);
515 ret
= sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
516 return alloc_rl(ret
, ret
);
518 ret
= handle_subtract(expr
, &undefined
, implied
);
521 return alloc_rl(ret
, ret
);
524 left
= _get_value(expr
->left
, &undefined
, implied
);
525 right
= _get_value(expr
->right
, &undefined
, implied
);
530 type
= get_type(expr
);
531 left
= sval_cast(type
, left
);
532 right
= sval_cast(type
, right
);
537 if (sval_binop_overflows(left
, expr
->op
, right
)) {
538 ret
= sval_type_max(get_type(expr
));
539 return alloc_rl(ret
, ret
);
544 if (sval_binop_overflows(left
, expr
->op
, right
))
550 ret
= handle_divide(expr
, &undefined
, implied
);
553 return alloc_rl(ret
, ret
);
555 if (right
.value
== 0) {
558 ret
= sval_binop(left
, '%', right
);
559 return alloc_rl(ret
, ret
);
562 ret
= sval_binop(left
, expr
->op
, right
);
564 return alloc_rl(ret
, ret
);
567 static sval_t
handle_binop(struct expression
*expr
, int *undefined
, int implied
)
571 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
576 return handle_mod(expr
, undefined
, implied
);
578 if (implied
== HARD_MAX
) {
582 left
= _get_value(expr
->left
, &local_undef
, implied
);
584 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
585 ret
= sval_blank(expr
->left
);
589 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
591 if (!get_absolute_max(expr
->left
, &left
))
594 right
= _get_value(expr
->right
, undefined
, implied
);
597 return sval_binop(left
, '&', right
);
599 case SPECIAL_RIGHTSHIFT
:
600 if (implied
== HARD_MAX
) {
604 left
= _get_value(expr
->left
, &local_undef
, implied
);
606 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
607 ret
= sval_blank(expr
->left
);
611 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
613 if (!get_absolute_max(expr
->left
, &left
))
616 right
= _get_value(expr
->right
, undefined
, implied
);
619 return sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
621 return handle_subtract(expr
, undefined
, implied
);
624 left
= _get_value(expr
->left
, undefined
, implied
);
625 right
= _get_value(expr
->right
, undefined
, implied
);
630 type
= get_type(expr
);
631 left
= sval_cast(type
, left
);
632 right
= sval_cast(type
, right
);
637 if (sval_binop_overflows(left
, expr
->op
, right
))
638 return sval_type_max(get_type(expr
));
642 if (sval_binop_overflows(left
, expr
->op
, right
)) {
650 return handle_divide(expr
, undefined
, implied
);
652 if (right
.value
== 0) {
656 return sval_binop(left
, '%', right
);
659 ret
= sval_binop(left
, expr
->op
, right
);
664 static int do_comparison(struct expression
*expr
)
666 struct range_list
*left_ranges
= NULL
;
667 struct range_list
*right_ranges
= NULL
;
668 int poss_true
, poss_false
;
671 type
= get_type(expr
);
673 get_implied_rl(expr
->left
, &left_ranges
);
674 get_implied_rl(expr
->right
, &right_ranges
);
675 left_ranges
= cast_rl(type
, left_ranges
);
676 right_ranges
= cast_rl(type
, right_ranges
);
678 poss_true
= possibly_true_rl(left_ranges
, expr
->op
, right_ranges
);
679 poss_false
= possibly_false_rl(left_ranges
, expr
->op
, right_ranges
);
681 free_rl(&left_ranges
);
682 free_rl(&right_ranges
);
684 if (!poss_true
&& !poss_false
)
686 if (poss_true
&& !poss_false
)
688 if (!poss_true
&& poss_false
)
693 static struct range_list
*handle_comparison_rl(struct expression
*expr
, int implied
)
698 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
699 struct data_range tmp_left
, tmp_right
;
703 tmp_right
.min
= right
;
704 tmp_right
.max
= right
;
705 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
710 if (implied
== EXACT
)
713 res
= do_comparison(expr
);
719 return alloc_rl(zero
, one
);
722 static sval_t
handle_comparison(struct expression
*expr
, int *undefined
, int implied
)
727 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
728 struct data_range tmp_left
, tmp_right
;
732 tmp_right
.min
= right
;
733 tmp_right
.max
= right
;
734 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
739 if (implied
== EXACT
) {
744 res
= do_comparison(expr
);
750 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
752 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
759 static struct range_list
*handle_logical_rl(struct expression
*expr
, int implied
)
765 if (implied
== EXACT
) {
766 if (get_value(expr
->left
, &left
))
768 if (get_value(expr
->right
, &right
))
771 if (get_implied_value(expr
->left
, &left
))
773 if (get_implied_value(expr
->right
, &right
))
778 case SPECIAL_LOGICAL_OR
:
779 if (left_known
&& left
.value
)
781 if (right_known
&& right
.value
)
783 if (left_known
&& right_known
)
786 case SPECIAL_LOGICAL_AND
:
787 if (left_known
&& right_known
) {
788 if (left
.value
&& right
.value
)
797 if (implied
== EXACT
)
800 return alloc_rl(zero
, one
);
803 static sval_t
handle_logical(struct expression
*expr
, int *undefined
, int implied
)
809 if (implied
== EXACT
) {
810 if (get_value(expr
->left
, &left
))
812 if (get_value(expr
->right
, &right
))
815 if (get_implied_value(expr
->left
, &left
))
817 if (get_implied_value(expr
->right
, &right
))
822 case SPECIAL_LOGICAL_OR
:
823 if (left_known
&& left
.value
)
825 if (right_known
&& right
.value
)
827 if (left_known
&& right_known
)
830 case SPECIAL_LOGICAL_AND
:
831 if (left_known
&& right_known
) {
832 if (left
.value
&& right
.value
)
842 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
844 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
851 static struct range_list
*handle_conditional_rl(struct expression
*expr
, int implied
)
853 struct range_list
*true_rl
, *false_rl
;
855 if (known_condition_true(expr
->conditional
))
856 return _get_rl(expr
->cond_true
, implied
);
857 if (known_condition_false(expr
->conditional
))
858 return _get_rl(expr
->cond_false
, implied
);
860 if (implied
== EXACT
)
863 if (implied_condition_true(expr
->conditional
))
864 return _get_rl(expr
->cond_true
, implied
);
865 if (implied_condition_false(expr
->conditional
))
866 return _get_rl(expr
->cond_false
, implied
);
868 true_rl
= _get_rl(expr
->cond_true
, implied
);
871 false_rl
= _get_rl(expr
->cond_false
, implied
);
875 return rl_union(true_rl
, false_rl
);
878 static sval_t
handle_conditional(struct expression
*expr
, int *undefined
, int implied
)
880 if (known_condition_true(expr
->conditional
))
881 return _get_value(expr
->cond_true
, undefined
, implied
);
882 if (known_condition_false(expr
->conditional
))
883 return _get_value(expr
->cond_false
, undefined
, implied
);
885 if (implied
== EXACT
) {
890 if (implied_condition_true(expr
->conditional
))
891 return _get_value(expr
->cond_true
, undefined
, implied
);
892 if (implied_condition_false(expr
->conditional
))
893 return _get_value(expr
->cond_false
, undefined
, implied
);
899 static int get_local_value(struct expression
*expr
, sval_t
*sval
, int implied
)
908 return get_local_min_helper(expr
, sval
);
913 return get_local_max_helper(expr
, sval
);
918 static int get_implied_value_helper(struct expression
*expr
, sval_t
*sval
, int implied
)
920 struct smatch_state
*state
;
924 /* fixme: this should return the casted value */
926 expr
= strip_expr(expr
);
928 if (get_value(expr
, sval
))
931 name
= expr_to_var_sym(expr
, &sym
);
934 *sval
= sval_blank(expr
);
935 state
= get_state(SMATCH_EXTRA
, name
, sym
);
937 if (!state
|| !state
->data
)
938 return get_local_value(expr
, sval
, implied
);
939 if (implied
== IMPLIED
) {
940 if (estate_get_single_value(state
, sval
))
944 if (implied
== HARD_MAX
) {
945 if (estate_get_hard_max(state
, sval
))
949 if (implied
== IMPLIED_MAX
|| implied
== ABSOLUTE_MAX
) {
950 *sval
= estate_max(state
);
953 *sval
= estate_min(state
);
957 static int get_fuzzy_max_helper(struct expression
*expr
, sval_t
*max
)
960 struct sm_state
*tmp
;
963 if (get_hard_max(expr
, &sval
)) {
968 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
972 sval
= sval_type_min(estate_type(sm
->state
));
973 FOR_EACH_PTR(sm
->possible
, tmp
) {
976 new_min
= estate_min(tmp
->state
);
977 if (sval_cmp(new_min
, sval
) > 0)
979 } END_FOR_EACH_PTR(tmp
);
981 if (sval_is_min(sval
))
983 if (sval
.value
== sval_type_min(sval
.type
).value
+ 1) /* it's common to be on off */
986 *max
= sval_cast(get_type(expr
), sval
);
990 static int get_fuzzy_min_helper(struct expression
*expr
, sval_t
*min
)
993 struct sm_state
*tmp
;
996 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
1000 if (!sval_is_min(estate_min(sm
->state
))) {
1001 *min
= estate_min(sm
->state
);
1005 sval
= sval_type_max(estate_type(sm
->state
));
1006 FOR_EACH_PTR(sm
->possible
, tmp
) {
1009 new_max
= estate_max(tmp
->state
);
1010 if (sval_cmp(new_max
, sval
) < 0)
1012 } END_FOR_EACH_PTR(tmp
);
1014 if (sval_is_max(sval
))
1016 *min
= sval_cast(get_type(expr
), sval
);
1020 static int get_const_value(struct expression
*expr
, sval_t
*sval
)
1025 if (expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
1028 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
1030 if (get_value(sym
->initializer
, &right
)) {
1031 *sval
= sval_cast(get_type(expr
), right
);
1037 static struct range_list
*handle_variable(struct expression
*expr
, int implied
)
1039 struct smatch_state
*state
;
1040 struct range_list
*rl
;
1041 sval_t sval
, min
, max
;
1043 if (get_const_value(expr
, &sval
))
1044 return alloc_rl(sval
, sval
);
1046 switch (implied_to_rl_enum(implied
)) {
1052 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1053 if (!state
|| !state
->data
) {
1054 if (get_local_rl(expr
, &rl
))
1058 if (implied
== HARD_MAX
&& !estate_has_hard_max(state
))
1060 return estate_rl(state
);
1062 if (!get_fuzzy_min_helper(expr
, &min
))
1063 min
= sval_type_min(get_type(expr
));
1064 if (!get_fuzzy_max_helper(expr
, &max
))
1066 return alloc_rl(min
, max
);
1071 static sval_t
_get_implied_value(struct expression
*expr
, int *undefined
, int implied
)
1075 ret
= sval_blank(expr
);
1084 if (!get_implied_value_helper(expr
, &ret
, implied
))
1088 if (!get_fuzzy_max_helper(expr
, &ret
))
1092 if (!get_fuzzy_min_helper(expr
, &ret
))
1101 static sval_t
handle_sizeof(struct expression
*expr
)
1106 ret
= sval_blank(expr
);
1107 sym
= expr
->cast_type
;
1109 sym
= evaluate_expression(expr
->cast_expression
);
1111 * Expressions of restricted types will possibly get
1112 * promoted - check that here
1114 if (is_restricted_type(sym
)) {
1115 if (sym
->bit_size
< bits_in_int
)
1117 } else if (is_fouled_type(sym
)) {
1121 examine_symbol_type(sym
);
1123 ret
.type
= size_t_ctype
;
1124 if (sym
->bit_size
<= 0) /* sizeof(void) */ {
1125 if (get_real_base_type(sym
) == &void_ctype
)
1130 ret
.value
= bits_to_bytes(sym
->bit_size
);
1135 static struct range_list
*handle_call_rl(struct expression
*expr
, int implied
)
1137 struct range_list
*rl
;
1139 if (implied
== EXACT
)
1142 if (get_implied_return(expr
, &rl
))
1144 return db_return_vals(expr
);
1147 static sval_t
handle_call(struct expression
*expr
, int *undefined
, int implied
)
1149 struct range_list
*rl
;
1151 if (!get_implied_rl(expr
, &rl
)) {
1158 if (sval_cmp(rl_min(rl
), rl_max(rl
)) == 0)
1177 static struct range_list
*_get_rl(struct expression
*expr
, int implied
)
1179 struct range_list
*rl
;
1180 struct symbol
*type
;
1184 expr
= strip_parens(expr
);
1187 type
= get_type(expr
);
1190 switch (expr
->type
) {
1192 sval
= sval_from_val(expr
, expr
->value
);
1195 rl
= handle_preop_rl(expr
, implied
);
1201 return _get_rl(expr
->unop
, implied
);
1203 case EXPR_FORCE_CAST
:
1204 case EXPR_IMPLIED_CAST
:
1205 rl
= _get_rl(expr
->cast_expression
, implied
);
1209 return cast_rl(type
, rl
);
1212 rl
= handle_binop_rl(expr
, implied
);
1218 rl
= handle_comparison_rl(expr
, implied
);
1224 rl
= handle_logical_rl(expr
, implied
);
1229 case EXPR_PTRSIZEOF
:
1231 sval
= handle_sizeof(expr
);
1234 case EXPR_CONDITIONAL
:
1235 rl
= handle_conditional_rl(expr
, implied
);
1241 rl
= handle_call_rl(expr
, implied
);
1248 rl
= handle_variable(expr
, implied
);
1255 if (undefined
&& type
&&
1256 (implied
== ABSOLUTE_MAX
|| implied
== ABSOLUTE_MIN
))
1257 return alloc_whole_rl(type
);
1260 rl
= alloc_rl(sval
, sval
);
1264 static sval_t
_get_value(struct expression
*expr
, int *undefined
, int implied
)
1266 struct symbol
*type
;
1276 expr
= strip_parens(expr
);
1277 type
= get_type(expr
);
1279 switch (expr
->type
) {
1281 ret
= sval_from_val(expr
, expr
->value
);
1284 ret
= handle_preop(expr
, undefined
, implied
);
1287 ret
= _get_value(expr
->unop
, undefined
, implied
);
1290 case EXPR_FORCE_CAST
:
1291 case EXPR_IMPLIED_CAST
:
1292 ret
= _get_value(expr
->cast_expression
, undefined
, implied
);
1293 ret
= sval_cast(type
, ret
);
1296 ret
= handle_binop(expr
, undefined
, implied
);
1299 ret
= handle_comparison(expr
, undefined
, implied
);
1302 ret
= handle_logical(expr
, undefined
, implied
);
1304 case EXPR_PTRSIZEOF
:
1306 ret
= handle_sizeof(expr
);
1309 if (get_const_value(expr
, &ret
)) {
1312 ret
= _get_implied_value(expr
, undefined
, implied
);
1315 case EXPR_CONDITIONAL
:
1316 ret
= handle_conditional(expr
, undefined
, implied
);
1319 ret
= handle_call(expr
, undefined
, implied
);
1322 ret
= _get_implied_value(expr
, undefined
, implied
);
1330 /* returns 1 if it can get a value literal or else returns 0 */
1331 int get_value(struct expression
*expr
, sval_t
*sval
)
1333 struct range_list
*rl
;
1335 rl
= _get_rl(expr
, EXACT
);
1336 if (!rl_to_sval(rl
, sval
))
1341 int get_implied_value(struct expression
*expr
, sval_t
*sval
)
1343 struct range_list
*rl
;
1345 rl
= _get_rl(expr
, IMPLIED
);
1346 if (!rl_to_sval(rl
, sval
))
1351 int get_implied_min(struct expression
*expr
, sval_t
*sval
)
1353 struct range_list
*rl
;
1355 rl
= _get_rl(expr
, IMPLIED_MIN
);
1362 int get_implied_max(struct expression
*expr
, sval_t
*sval
)
1364 struct range_list
*rl
;
1366 rl
= _get_rl(expr
, IMPLIED_MAX
);
1373 int get_implied_rl(struct expression
*expr
, struct range_list
**rl
)
1376 struct smatch_state
*state
;
1383 expr
= strip_parens(expr
);
1387 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1389 *rl
= clone_rl(estate_rl(state
));
1393 if (expr
->type
== EXPR_CALL
) {
1394 if (get_implied_return(expr
, rl
))
1396 *rl
= db_return_vals(expr
);
1402 if (get_implied_value(expr
, &sval
)) {
1403 add_range(rl
, sval
, sval
);
1407 if (get_local_rl(expr
, rl
))
1410 min_known
= get_implied_min(expr
, &min
);
1411 max_known
= get_implied_max(expr
, &max
);
1412 if (!min_known
&& !max_known
)
1415 get_absolute_min(expr
, &min
);
1417 get_absolute_max(expr
, &max
);
1419 *rl
= alloc_rl(min
, max
);
1423 int get_hard_max(struct expression
*expr
, sval_t
*sval
)
1425 struct range_list
*rl
;
1427 rl
= _get_rl(expr
, HARD_MAX
);
1434 int get_fuzzy_min(struct expression
*expr
, sval_t
*sval
)
1436 struct range_list
*rl
;
1438 rl
= _get_rl(expr
, FUZZY_MIN
);
1445 int get_fuzzy_max(struct expression
*expr
, sval_t
*sval
)
1447 struct range_list
*rl
;
1450 rl
= _get_rl(expr
, FUZZY_MAX
);
1454 if (max
.uvalue
> INT_MAX
- 10000)
1460 int get_absolute_min(struct expression
*expr
, sval_t
*sval
)
1462 struct range_list
*rl
;
1463 struct symbol
*type
;
1465 type
= get_type(expr
);
1467 type
= &llong_ctype
; // FIXME: this is wrong but places assume get type can't fail.
1468 rl
= _get_rl(expr
, ABSOLUTE_MIN
);
1472 *sval
= sval_type_min(type
);
1474 if (sval_cmp(*sval
, sval_type_min(type
)) < 0)
1475 *sval
= sval_type_min(type
);
1479 int get_absolute_max(struct expression
*expr
, sval_t
*sval
)
1481 struct range_list
*rl
;
1482 struct symbol
*type
;
1484 type
= get_type(expr
);
1486 type
= &llong_ctype
;
1487 rl
= _get_rl(expr
, ABSOLUTE_MAX
);
1491 *sval
= sval_type_max(type
);
1493 if (sval_cmp(sval_type_max(type
), *sval
) < 0)
1494 *sval
= sval_type_max(type
);
1498 int known_condition_true(struct expression
*expr
)
1505 if (get_value(expr
, &tmp
) && tmp
.value
)
1511 int known_condition_false(struct expression
*expr
)
1519 if (expr
->type
== EXPR_CALL
) {
1520 if (sym_name_is("__builtin_constant_p", expr
->fn
))
1526 int implied_condition_true(struct expression
*expr
)
1533 if (known_condition_true(expr
))
1535 if (get_implied_value(expr
, &tmp
) && tmp
.value
)
1538 if (expr
->type
== EXPR_POSTOP
)
1539 return implied_condition_true(expr
->unop
);
1541 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_DECREMENT
)
1542 return implied_not_equal(expr
->unop
, 1);
1543 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_INCREMENT
)
1544 return implied_not_equal(expr
->unop
, -1);
1546 expr
= strip_expr(expr
);
1547 switch (expr
->type
) {
1549 if (do_comparison(expr
) == 1)
1553 if (expr
->op
== '!') {
1554 if (implied_condition_false(expr
->unop
))
1560 if (implied_not_equal(expr
, 0) == 1)
1567 int implied_condition_false(struct expression
*expr
)
1569 struct expression
*tmp
;
1575 if (known_condition_false(expr
))
1578 switch (expr
->type
) {
1580 if (do_comparison(expr
) == 2)
1583 if (expr
->op
== '!') {
1584 if (implied_condition_true(expr
->unop
))
1588 tmp
= strip_expr(expr
);
1590 return implied_condition_false(tmp
);
1593 if (get_implied_value(expr
, &sval
) && sval
.value
== 0)