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_right_shift(struct expression
*expr
, int implied
)
467 struct range_list
*left_rl
;
471 if (implied
== HARD_MAX
)
473 /* this is hopeless without the right side */
474 if (!get_implied_value(expr
->right
, &right
))
476 left_rl
= _get_rl(expr
->left
, implied
);
478 max
= rl_max(left_rl
);
479 min
= rl_min(left_rl
);
481 if (implied_to_rl_enum(implied
) == RL_FUZZY
)
483 if (implied_to_rl_enum(implied
) == RL_HARD
)
485 max
= sval_type_max(get_type(expr
->left
));
486 min
= sval_type_val(get_type(expr
->left
), 0);
489 max
= sval_binop(max
, SPECIAL_RIGHTSHIFT
, right
);
490 min
= sval_binop(min
, SPECIAL_RIGHTSHIFT
, right
);
491 return alloc_rl(min
, max
);
494 static struct range_list
*handle_known_binop(struct expression
*expr
)
498 if (!get_value(expr
->left
, &left
))
500 if (!get_value(expr
->right
, &right
))
502 left
= sval_binop(left
, expr
->op
, right
);
503 return alloc_rl(left
, left
);
506 static struct range_list
*handle_binop_rl(struct expression
*expr
, int implied
)
510 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
512 struct range_list
*rl
;
514 rl
= handle_known_binop(expr
);
517 if (implied
== EXACT
)
522 return handle_mod_rl(expr
, implied
);
524 return handle_bitwise_AND(expr
, implied
);
525 case SPECIAL_RIGHTSHIFT
:
526 return handle_right_shift(expr
, implied
);
528 ret
= handle_subtract(expr
, &undefined
, implied
);
531 return alloc_rl(ret
, ret
);
534 left
= _get_value(expr
->left
, &undefined
, implied
);
535 right
= _get_value(expr
->right
, &undefined
, implied
);
540 type
= get_type(expr
);
541 left
= sval_cast(type
, left
);
542 right
= sval_cast(type
, right
);
547 if (sval_binop_overflows(left
, expr
->op
, right
)) {
548 ret
= sval_type_max(get_type(expr
));
549 return alloc_rl(ret
, ret
);
554 if (sval_binop_overflows(left
, expr
->op
, right
))
560 ret
= handle_divide(expr
, &undefined
, implied
);
563 return alloc_rl(ret
, ret
);
565 if (right
.value
== 0) {
568 ret
= sval_binop(left
, '%', right
);
569 return alloc_rl(ret
, ret
);
572 ret
= sval_binop(left
, expr
->op
, right
);
574 return alloc_rl(ret
, ret
);
577 static sval_t
handle_binop(struct expression
*expr
, int *undefined
, int implied
)
581 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
586 return handle_mod(expr
, undefined
, implied
);
588 if (implied
== HARD_MAX
) {
592 left
= _get_value(expr
->left
, &local_undef
, implied
);
594 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
595 ret
= sval_blank(expr
->left
);
599 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
601 if (!get_absolute_max(expr
->left
, &left
))
604 right
= _get_value(expr
->right
, undefined
, implied
);
607 return sval_binop(left
, '&', right
);
609 case SPECIAL_RIGHTSHIFT
:
610 if (implied
== HARD_MAX
) {
614 left
= _get_value(expr
->left
, &local_undef
, implied
);
616 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
617 ret
= sval_blank(expr
->left
);
621 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
623 if (!get_absolute_max(expr
->left
, &left
))
626 right
= _get_value(expr
->right
, undefined
, implied
);
629 return sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
631 return handle_subtract(expr
, undefined
, implied
);
634 left
= _get_value(expr
->left
, undefined
, implied
);
635 right
= _get_value(expr
->right
, undefined
, implied
);
640 type
= get_type(expr
);
641 left
= sval_cast(type
, left
);
642 right
= sval_cast(type
, right
);
647 if (sval_binop_overflows(left
, expr
->op
, right
))
648 return sval_type_max(get_type(expr
));
652 if (sval_binop_overflows(left
, expr
->op
, right
)) {
660 return handle_divide(expr
, undefined
, implied
);
662 if (right
.value
== 0) {
666 return sval_binop(left
, '%', right
);
669 ret
= sval_binop(left
, expr
->op
, right
);
674 static int do_comparison(struct expression
*expr
)
676 struct range_list
*left_ranges
= NULL
;
677 struct range_list
*right_ranges
= NULL
;
678 int poss_true
, poss_false
;
681 type
= get_type(expr
);
683 get_implied_rl(expr
->left
, &left_ranges
);
684 get_implied_rl(expr
->right
, &right_ranges
);
685 left_ranges
= cast_rl(type
, left_ranges
);
686 right_ranges
= cast_rl(type
, right_ranges
);
688 poss_true
= possibly_true_rl(left_ranges
, expr
->op
, right_ranges
);
689 poss_false
= possibly_false_rl(left_ranges
, expr
->op
, right_ranges
);
691 free_rl(&left_ranges
);
692 free_rl(&right_ranges
);
694 if (!poss_true
&& !poss_false
)
696 if (poss_true
&& !poss_false
)
698 if (!poss_true
&& poss_false
)
703 static struct range_list
*handle_comparison_rl(struct expression
*expr
, int implied
)
708 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
709 struct data_range tmp_left
, tmp_right
;
713 tmp_right
.min
= right
;
714 tmp_right
.max
= right
;
715 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
720 if (implied
== EXACT
)
723 res
= do_comparison(expr
);
729 return alloc_rl(zero
, one
);
732 static sval_t
handle_comparison(struct expression
*expr
, int *undefined
, int implied
)
737 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
738 struct data_range tmp_left
, tmp_right
;
742 tmp_right
.min
= right
;
743 tmp_right
.max
= right
;
744 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
749 if (implied
== EXACT
) {
754 res
= do_comparison(expr
);
760 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
762 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
769 static struct range_list
*handle_logical_rl(struct expression
*expr
, int implied
)
775 if (implied
== EXACT
) {
776 if (get_value(expr
->left
, &left
))
778 if (get_value(expr
->right
, &right
))
781 if (get_implied_value(expr
->left
, &left
))
783 if (get_implied_value(expr
->right
, &right
))
788 case SPECIAL_LOGICAL_OR
:
789 if (left_known
&& left
.value
)
791 if (right_known
&& right
.value
)
793 if (left_known
&& right_known
)
796 case SPECIAL_LOGICAL_AND
:
797 if (left_known
&& right_known
) {
798 if (left
.value
&& right
.value
)
807 if (implied
== EXACT
)
810 return alloc_rl(zero
, one
);
813 static sval_t
handle_logical(struct expression
*expr
, int *undefined
, int implied
)
819 if (implied
== EXACT
) {
820 if (get_value(expr
->left
, &left
))
822 if (get_value(expr
->right
, &right
))
825 if (get_implied_value(expr
->left
, &left
))
827 if (get_implied_value(expr
->right
, &right
))
832 case SPECIAL_LOGICAL_OR
:
833 if (left_known
&& left
.value
)
835 if (right_known
&& right
.value
)
837 if (left_known
&& right_known
)
840 case SPECIAL_LOGICAL_AND
:
841 if (left_known
&& right_known
) {
842 if (left
.value
&& right
.value
)
852 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
854 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
861 static struct range_list
*handle_conditional_rl(struct expression
*expr
, int implied
)
863 struct range_list
*true_rl
, *false_rl
;
865 if (known_condition_true(expr
->conditional
))
866 return _get_rl(expr
->cond_true
, implied
);
867 if (known_condition_false(expr
->conditional
))
868 return _get_rl(expr
->cond_false
, implied
);
870 if (implied
== EXACT
)
873 if (implied_condition_true(expr
->conditional
))
874 return _get_rl(expr
->cond_true
, implied
);
875 if (implied_condition_false(expr
->conditional
))
876 return _get_rl(expr
->cond_false
, implied
);
878 true_rl
= _get_rl(expr
->cond_true
, implied
);
881 false_rl
= _get_rl(expr
->cond_false
, implied
);
885 return rl_union(true_rl
, false_rl
);
888 static sval_t
handle_conditional(struct expression
*expr
, int *undefined
, int implied
)
890 if (known_condition_true(expr
->conditional
))
891 return _get_value(expr
->cond_true
, undefined
, implied
);
892 if (known_condition_false(expr
->conditional
))
893 return _get_value(expr
->cond_false
, undefined
, implied
);
895 if (implied
== EXACT
) {
900 if (implied_condition_true(expr
->conditional
))
901 return _get_value(expr
->cond_true
, undefined
, implied
);
902 if (implied_condition_false(expr
->conditional
))
903 return _get_value(expr
->cond_false
, undefined
, implied
);
909 static int get_local_value(struct expression
*expr
, sval_t
*sval
, int implied
)
918 return get_local_min_helper(expr
, sval
);
923 return get_local_max_helper(expr
, sval
);
928 static int get_implied_value_helper(struct expression
*expr
, sval_t
*sval
, int implied
)
930 struct smatch_state
*state
;
934 /* fixme: this should return the casted value */
936 expr
= strip_expr(expr
);
938 if (get_value(expr
, sval
))
941 name
= expr_to_var_sym(expr
, &sym
);
944 *sval
= sval_blank(expr
);
945 state
= get_state(SMATCH_EXTRA
, name
, sym
);
947 if (!state
|| !state
->data
)
948 return get_local_value(expr
, sval
, implied
);
949 if (implied
== IMPLIED
) {
950 if (estate_get_single_value(state
, sval
))
954 if (implied
== HARD_MAX
) {
955 if (estate_get_hard_max(state
, sval
))
959 if (implied
== IMPLIED_MAX
|| implied
== ABSOLUTE_MAX
) {
960 *sval
= estate_max(state
);
963 *sval
= estate_min(state
);
967 static int get_fuzzy_max_helper(struct expression
*expr
, sval_t
*max
)
970 struct sm_state
*tmp
;
973 if (get_hard_max(expr
, &sval
)) {
978 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
982 sval
= sval_type_min(estate_type(sm
->state
));
983 FOR_EACH_PTR(sm
->possible
, tmp
) {
986 new_min
= estate_min(tmp
->state
);
987 if (sval_cmp(new_min
, sval
) > 0)
989 } END_FOR_EACH_PTR(tmp
);
991 if (sval_is_min(sval
))
993 if (sval
.value
== sval_type_min(sval
.type
).value
+ 1) /* it's common to be on off */
996 *max
= sval_cast(get_type(expr
), sval
);
1000 static int get_fuzzy_min_helper(struct expression
*expr
, sval_t
*min
)
1002 struct sm_state
*sm
;
1003 struct sm_state
*tmp
;
1006 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
1010 if (!sval_is_min(estate_min(sm
->state
))) {
1011 *min
= estate_min(sm
->state
);
1015 sval
= sval_type_max(estate_type(sm
->state
));
1016 FOR_EACH_PTR(sm
->possible
, tmp
) {
1019 new_max
= estate_max(tmp
->state
);
1020 if (sval_cmp(new_max
, sval
) < 0)
1022 } END_FOR_EACH_PTR(tmp
);
1024 if (sval_is_max(sval
))
1026 *min
= sval_cast(get_type(expr
), sval
);
1030 static int get_const_value(struct expression
*expr
, sval_t
*sval
)
1035 if (expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
1038 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
1040 if (get_value(sym
->initializer
, &right
)) {
1041 *sval
= sval_cast(get_type(expr
), right
);
1047 static struct range_list
*handle_variable(struct expression
*expr
, int implied
)
1049 struct smatch_state
*state
;
1050 struct range_list
*rl
;
1051 sval_t sval
, min
, max
;
1053 if (get_const_value(expr
, &sval
))
1054 return alloc_rl(sval
, sval
);
1056 switch (implied_to_rl_enum(implied
)) {
1062 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1063 if (!state
|| !state
->data
) {
1064 if (get_local_rl(expr
, &rl
))
1068 if (implied
== HARD_MAX
&& !estate_has_hard_max(state
))
1070 return estate_rl(state
);
1072 if (!get_fuzzy_min_helper(expr
, &min
))
1073 min
= sval_type_min(get_type(expr
));
1074 if (!get_fuzzy_max_helper(expr
, &max
))
1076 return alloc_rl(min
, max
);
1081 static sval_t
_get_implied_value(struct expression
*expr
, int *undefined
, int implied
)
1085 ret
= sval_blank(expr
);
1094 if (!get_implied_value_helper(expr
, &ret
, implied
))
1098 if (!get_fuzzy_max_helper(expr
, &ret
))
1102 if (!get_fuzzy_min_helper(expr
, &ret
))
1111 static sval_t
handle_sizeof(struct expression
*expr
)
1116 ret
= sval_blank(expr
);
1117 sym
= expr
->cast_type
;
1119 sym
= evaluate_expression(expr
->cast_expression
);
1121 * Expressions of restricted types will possibly get
1122 * promoted - check that here
1124 if (is_restricted_type(sym
)) {
1125 if (sym
->bit_size
< bits_in_int
)
1127 } else if (is_fouled_type(sym
)) {
1131 examine_symbol_type(sym
);
1133 ret
.type
= size_t_ctype
;
1134 if (sym
->bit_size
<= 0) /* sizeof(void) */ {
1135 if (get_real_base_type(sym
) == &void_ctype
)
1140 ret
.value
= bits_to_bytes(sym
->bit_size
);
1145 static struct range_list
*handle_call_rl(struct expression
*expr
, int implied
)
1147 struct range_list
*rl
;
1149 if (implied
== EXACT
)
1152 if (get_implied_return(expr
, &rl
))
1154 return db_return_vals(expr
);
1157 static sval_t
handle_call(struct expression
*expr
, int *undefined
, int implied
)
1159 struct range_list
*rl
;
1161 if (!get_implied_rl(expr
, &rl
)) {
1168 if (sval_cmp(rl_min(rl
), rl_max(rl
)) == 0)
1187 static struct range_list
*_get_rl(struct expression
*expr
, int implied
)
1189 struct range_list
*rl
;
1190 struct symbol
*type
;
1194 expr
= strip_parens(expr
);
1197 type
= get_type(expr
);
1200 switch (expr
->type
) {
1202 sval
= sval_from_val(expr
, expr
->value
);
1205 rl
= handle_preop_rl(expr
, implied
);
1211 return _get_rl(expr
->unop
, implied
);
1213 case EXPR_FORCE_CAST
:
1214 case EXPR_IMPLIED_CAST
:
1215 rl
= _get_rl(expr
->cast_expression
, implied
);
1219 return cast_rl(type
, rl
);
1222 rl
= handle_binop_rl(expr
, implied
);
1228 rl
= handle_comparison_rl(expr
, implied
);
1234 rl
= handle_logical_rl(expr
, implied
);
1239 case EXPR_PTRSIZEOF
:
1241 sval
= handle_sizeof(expr
);
1244 case EXPR_CONDITIONAL
:
1245 rl
= handle_conditional_rl(expr
, implied
);
1251 rl
= handle_call_rl(expr
, implied
);
1258 rl
= handle_variable(expr
, implied
);
1265 if (undefined
&& type
&&
1266 (implied
== ABSOLUTE_MAX
|| implied
== ABSOLUTE_MIN
))
1267 return alloc_whole_rl(type
);
1270 rl
= alloc_rl(sval
, sval
);
1274 static sval_t
_get_value(struct expression
*expr
, int *undefined
, int implied
)
1276 struct symbol
*type
;
1286 expr
= strip_parens(expr
);
1287 type
= get_type(expr
);
1289 switch (expr
->type
) {
1291 ret
= sval_from_val(expr
, expr
->value
);
1294 ret
= handle_preop(expr
, undefined
, implied
);
1297 ret
= _get_value(expr
->unop
, undefined
, implied
);
1300 case EXPR_FORCE_CAST
:
1301 case EXPR_IMPLIED_CAST
:
1302 ret
= _get_value(expr
->cast_expression
, undefined
, implied
);
1303 ret
= sval_cast(type
, ret
);
1306 ret
= handle_binop(expr
, undefined
, implied
);
1309 ret
= handle_comparison(expr
, undefined
, implied
);
1312 ret
= handle_logical(expr
, undefined
, implied
);
1314 case EXPR_PTRSIZEOF
:
1316 ret
= handle_sizeof(expr
);
1319 if (get_const_value(expr
, &ret
)) {
1322 ret
= _get_implied_value(expr
, undefined
, implied
);
1325 case EXPR_CONDITIONAL
:
1326 ret
= handle_conditional(expr
, undefined
, implied
);
1329 ret
= handle_call(expr
, undefined
, implied
);
1332 ret
= _get_implied_value(expr
, undefined
, implied
);
1340 /* returns 1 if it can get a value literal or else returns 0 */
1341 int get_value(struct expression
*expr
, sval_t
*sval
)
1343 struct range_list
*rl
;
1345 rl
= _get_rl(expr
, EXACT
);
1346 if (!rl_to_sval(rl
, sval
))
1351 int get_implied_value(struct expression
*expr
, sval_t
*sval
)
1353 struct range_list
*rl
;
1355 rl
= _get_rl(expr
, IMPLIED
);
1356 if (!rl_to_sval(rl
, sval
))
1361 int get_implied_min(struct expression
*expr
, sval_t
*sval
)
1363 struct range_list
*rl
;
1365 rl
= _get_rl(expr
, IMPLIED_MIN
);
1372 int get_implied_max(struct expression
*expr
, sval_t
*sval
)
1374 struct range_list
*rl
;
1376 rl
= _get_rl(expr
, IMPLIED_MAX
);
1383 int get_implied_rl(struct expression
*expr
, struct range_list
**rl
)
1386 struct smatch_state
*state
;
1393 expr
= strip_parens(expr
);
1397 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1399 *rl
= clone_rl(estate_rl(state
));
1403 if (expr
->type
== EXPR_CALL
) {
1404 if (get_implied_return(expr
, rl
))
1406 *rl
= db_return_vals(expr
);
1412 if (get_implied_value(expr
, &sval
)) {
1413 add_range(rl
, sval
, sval
);
1417 if (get_local_rl(expr
, rl
))
1420 min_known
= get_implied_min(expr
, &min
);
1421 max_known
= get_implied_max(expr
, &max
);
1422 if (!min_known
&& !max_known
)
1425 get_absolute_min(expr
, &min
);
1427 get_absolute_max(expr
, &max
);
1429 *rl
= alloc_rl(min
, max
);
1433 int get_hard_max(struct expression
*expr
, sval_t
*sval
)
1435 struct range_list
*rl
;
1437 rl
= _get_rl(expr
, HARD_MAX
);
1444 int get_fuzzy_min(struct expression
*expr
, sval_t
*sval
)
1446 struct range_list
*rl
;
1448 rl
= _get_rl(expr
, FUZZY_MIN
);
1455 int get_fuzzy_max(struct expression
*expr
, sval_t
*sval
)
1457 struct range_list
*rl
;
1460 rl
= _get_rl(expr
, FUZZY_MAX
);
1464 if (max
.uvalue
> INT_MAX
- 10000)
1470 int get_absolute_min(struct expression
*expr
, sval_t
*sval
)
1472 struct range_list
*rl
;
1473 struct symbol
*type
;
1475 type
= get_type(expr
);
1477 type
= &llong_ctype
; // FIXME: this is wrong but places assume get type can't fail.
1478 rl
= _get_rl(expr
, ABSOLUTE_MIN
);
1482 *sval
= sval_type_min(type
);
1484 if (sval_cmp(*sval
, sval_type_min(type
)) < 0)
1485 *sval
= sval_type_min(type
);
1489 int get_absolute_max(struct expression
*expr
, sval_t
*sval
)
1491 struct range_list
*rl
;
1492 struct symbol
*type
;
1494 type
= get_type(expr
);
1496 type
= &llong_ctype
;
1497 rl
= _get_rl(expr
, ABSOLUTE_MAX
);
1501 *sval
= sval_type_max(type
);
1503 if (sval_cmp(sval_type_max(type
), *sval
) < 0)
1504 *sval
= sval_type_max(type
);
1508 int known_condition_true(struct expression
*expr
)
1515 if (get_value(expr
, &tmp
) && tmp
.value
)
1521 int known_condition_false(struct expression
*expr
)
1529 if (expr
->type
== EXPR_CALL
) {
1530 if (sym_name_is("__builtin_constant_p", expr
->fn
))
1536 int implied_condition_true(struct expression
*expr
)
1543 if (known_condition_true(expr
))
1545 if (get_implied_value(expr
, &tmp
) && tmp
.value
)
1548 if (expr
->type
== EXPR_POSTOP
)
1549 return implied_condition_true(expr
->unop
);
1551 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_DECREMENT
)
1552 return implied_not_equal(expr
->unop
, 1);
1553 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_INCREMENT
)
1554 return implied_not_equal(expr
->unop
, -1);
1556 expr
= strip_expr(expr
);
1557 switch (expr
->type
) {
1559 if (do_comparison(expr
) == 1)
1563 if (expr
->op
== '!') {
1564 if (implied_condition_false(expr
->unop
))
1570 if (implied_not_equal(expr
, 0) == 1)
1577 int implied_condition_false(struct expression
*expr
)
1579 struct expression
*tmp
;
1585 if (known_condition_false(expr
))
1588 switch (expr
->type
) {
1590 if (do_comparison(expr
) == 2)
1593 if (expr
->op
== '!') {
1594 if (implied_condition_true(expr
->unop
))
1598 tmp
= strip_expr(expr
);
1600 return implied_condition_false(tmp
);
1603 if (get_implied_value(expr
, &sval
) && sval
.value
== 0)