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_binop_rl(struct expression
*expr
, int implied
)
441 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
447 return handle_mod_rl(expr
, implied
);
449 if (implied
== HARD_MAX
)
451 left
= _get_value(expr
->left
, &local_undef
, implied
);
453 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
454 ret
= sval_blank(expr
->left
);
456 return alloc_rl(ret
, ret
);
458 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
460 if (!get_absolute_max(expr
->left
, &left
))
463 right
= _get_value(expr
->right
, &undefined
, implied
);
466 ret
= sval_binop(left
, '&', right
);
467 return alloc_rl(ret
, ret
);
469 case SPECIAL_RIGHTSHIFT
:
470 if (implied
== HARD_MAX
)
472 left
= _get_value(expr
->left
, &local_undef
, implied
);
474 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
475 ret
= sval_blank(expr
->left
);
477 return alloc_rl(ret
, ret
);
479 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
481 if (!get_absolute_max(expr
->left
, &left
))
484 right
= _get_value(expr
->right
, &undefined
, implied
);
487 ret
= sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
488 return alloc_rl(ret
, ret
);
490 ret
= handle_subtract(expr
, &undefined
, implied
);
493 return alloc_rl(ret
, ret
);
496 left
= _get_value(expr
->left
, &undefined
, implied
);
497 right
= _get_value(expr
->right
, &undefined
, implied
);
502 type
= get_type(expr
);
503 left
= sval_cast(type
, left
);
504 right
= sval_cast(type
, right
);
509 if (sval_binop_overflows(left
, expr
->op
, right
)) {
510 ret
= sval_type_max(get_type(expr
));
511 return alloc_rl(ret
, ret
);
516 if (sval_binop_overflows(left
, expr
->op
, right
))
522 ret
= handle_divide(expr
, &undefined
, implied
);
525 return alloc_rl(ret
, ret
);
527 if (right
.value
== 0) {
530 ret
= sval_binop(left
, '%', right
);
531 return alloc_rl(ret
, ret
);
534 ret
= sval_binop(left
, expr
->op
, right
);
536 return alloc_rl(ret
, ret
);
539 static sval_t
handle_binop(struct expression
*expr
, int *undefined
, int implied
)
543 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
548 return handle_mod(expr
, undefined
, implied
);
550 if (implied
== HARD_MAX
) {
554 left
= _get_value(expr
->left
, &local_undef
, implied
);
556 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
557 ret
= sval_blank(expr
->left
);
561 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
563 if (!get_absolute_max(expr
->left
, &left
))
566 right
= _get_value(expr
->right
, undefined
, implied
);
569 return sval_binop(left
, '&', right
);
571 case SPECIAL_RIGHTSHIFT
:
572 if (implied
== HARD_MAX
) {
576 left
= _get_value(expr
->left
, &local_undef
, implied
);
578 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
579 ret
= sval_blank(expr
->left
);
583 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
585 if (!get_absolute_max(expr
->left
, &left
))
588 right
= _get_value(expr
->right
, undefined
, implied
);
591 return sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
593 return handle_subtract(expr
, undefined
, implied
);
596 left
= _get_value(expr
->left
, undefined
, implied
);
597 right
= _get_value(expr
->right
, undefined
, implied
);
602 type
= get_type(expr
);
603 left
= sval_cast(type
, left
);
604 right
= sval_cast(type
, right
);
609 if (sval_binop_overflows(left
, expr
->op
, right
))
610 return sval_type_max(get_type(expr
));
614 if (sval_binop_overflows(left
, expr
->op
, right
)) {
622 return handle_divide(expr
, undefined
, implied
);
624 if (right
.value
== 0) {
628 return sval_binop(left
, '%', right
);
631 ret
= sval_binop(left
, expr
->op
, right
);
636 static int do_comparison(struct expression
*expr
)
638 struct range_list
*left_ranges
= NULL
;
639 struct range_list
*right_ranges
= NULL
;
640 int poss_true
, poss_false
;
643 type
= get_type(expr
);
645 get_implied_rl(expr
->left
, &left_ranges
);
646 get_implied_rl(expr
->right
, &right_ranges
);
647 left_ranges
= cast_rl(type
, left_ranges
);
648 right_ranges
= cast_rl(type
, right_ranges
);
650 poss_true
= possibly_true_rl(left_ranges
, expr
->op
, right_ranges
);
651 poss_false
= possibly_false_rl(left_ranges
, expr
->op
, right_ranges
);
653 free_rl(&left_ranges
);
654 free_rl(&right_ranges
);
656 if (!poss_true
&& !poss_false
)
658 if (poss_true
&& !poss_false
)
660 if (!poss_true
&& poss_false
)
665 static struct range_list
*handle_comparison_rl(struct expression
*expr
, int implied
)
670 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
671 struct data_range tmp_left
, tmp_right
;
675 tmp_right
.min
= right
;
676 tmp_right
.max
= right
;
677 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
682 if (implied
== EXACT
)
685 res
= do_comparison(expr
);
691 return alloc_rl(zero
, one
);
694 static sval_t
handle_comparison(struct expression
*expr
, int *undefined
, int implied
)
699 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
700 struct data_range tmp_left
, tmp_right
;
704 tmp_right
.min
= right
;
705 tmp_right
.max
= right
;
706 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
711 if (implied
== EXACT
) {
716 res
= do_comparison(expr
);
722 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
724 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
731 static struct range_list
*handle_logical_rl(struct expression
*expr
, int implied
)
737 if (implied
== EXACT
) {
738 if (get_value(expr
->left
, &left
))
740 if (get_value(expr
->right
, &right
))
743 if (get_implied_value(expr
->left
, &left
))
745 if (get_implied_value(expr
->right
, &right
))
750 case SPECIAL_LOGICAL_OR
:
751 if (left_known
&& left
.value
)
753 if (right_known
&& right
.value
)
755 if (left_known
&& right_known
)
758 case SPECIAL_LOGICAL_AND
:
759 if (left_known
&& right_known
) {
760 if (left
.value
&& right
.value
)
769 if (implied
== EXACT
)
772 return alloc_rl(zero
, one
);
775 static sval_t
handle_logical(struct expression
*expr
, int *undefined
, int implied
)
781 if (implied
== EXACT
) {
782 if (get_value(expr
->left
, &left
))
784 if (get_value(expr
->right
, &right
))
787 if (get_implied_value(expr
->left
, &left
))
789 if (get_implied_value(expr
->right
, &right
))
794 case SPECIAL_LOGICAL_OR
:
795 if (left_known
&& left
.value
)
797 if (right_known
&& right
.value
)
799 if (left_known
&& right_known
)
802 case SPECIAL_LOGICAL_AND
:
803 if (left_known
&& right_known
) {
804 if (left
.value
&& right
.value
)
814 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
816 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
823 static struct range_list
*handle_conditional_rl(struct expression
*expr
, int implied
)
825 struct range_list
*true_rl
, *false_rl
;
827 if (known_condition_true(expr
->conditional
))
828 return _get_rl(expr
->cond_true
, implied
);
829 if (known_condition_false(expr
->conditional
))
830 return _get_rl(expr
->cond_false
, implied
);
832 if (implied
== EXACT
)
835 if (implied_condition_true(expr
->conditional
))
836 return _get_rl(expr
->cond_true
, implied
);
837 if (implied_condition_false(expr
->conditional
))
838 return _get_rl(expr
->cond_false
, implied
);
840 true_rl
= _get_rl(expr
->cond_true
, implied
);
843 false_rl
= _get_rl(expr
->cond_false
, implied
);
847 return rl_union(true_rl
, false_rl
);
850 static sval_t
handle_conditional(struct expression
*expr
, int *undefined
, int implied
)
852 if (known_condition_true(expr
->conditional
))
853 return _get_value(expr
->cond_true
, undefined
, implied
);
854 if (known_condition_false(expr
->conditional
))
855 return _get_value(expr
->cond_false
, undefined
, implied
);
857 if (implied
== EXACT
) {
862 if (implied_condition_true(expr
->conditional
))
863 return _get_value(expr
->cond_true
, undefined
, implied
);
864 if (implied_condition_false(expr
->conditional
))
865 return _get_value(expr
->cond_false
, undefined
, implied
);
871 static int get_local_value(struct expression
*expr
, sval_t
*sval
, int implied
)
880 return get_local_min_helper(expr
, sval
);
885 return get_local_max_helper(expr
, sval
);
890 static int get_implied_value_helper(struct expression
*expr
, sval_t
*sval
, int implied
)
892 struct smatch_state
*state
;
896 /* fixme: this should return the casted value */
898 expr
= strip_expr(expr
);
900 if (get_value(expr
, sval
))
903 name
= expr_to_var_sym(expr
, &sym
);
906 *sval
= sval_blank(expr
);
907 state
= get_state(SMATCH_EXTRA
, name
, sym
);
909 if (!state
|| !state
->data
)
910 return get_local_value(expr
, sval
, implied
);
911 if (implied
== IMPLIED
) {
912 if (estate_get_single_value(state
, sval
))
916 if (implied
== HARD_MAX
) {
917 if (estate_get_hard_max(state
, sval
))
921 if (implied
== IMPLIED_MAX
|| implied
== ABSOLUTE_MAX
) {
922 *sval
= estate_max(state
);
925 *sval
= estate_min(state
);
929 static int get_fuzzy_max_helper(struct expression
*expr
, sval_t
*max
)
932 struct sm_state
*tmp
;
935 if (get_hard_max(expr
, &sval
)) {
940 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
944 sval
= sval_type_min(estate_type(sm
->state
));
945 FOR_EACH_PTR(sm
->possible
, tmp
) {
948 new_min
= estate_min(tmp
->state
);
949 if (sval_cmp(new_min
, sval
) > 0)
951 } END_FOR_EACH_PTR(tmp
);
953 if (sval_is_min(sval
))
955 if (sval
.value
== sval_type_min(sval
.type
).value
+ 1) /* it's common to be on off */
958 *max
= sval_cast(get_type(expr
), sval
);
962 static int get_fuzzy_min_helper(struct expression
*expr
, sval_t
*min
)
965 struct sm_state
*tmp
;
968 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
972 if (!sval_is_min(estate_min(sm
->state
))) {
973 *min
= estate_min(sm
->state
);
977 sval
= sval_type_max(estate_type(sm
->state
));
978 FOR_EACH_PTR(sm
->possible
, tmp
) {
981 new_max
= estate_max(tmp
->state
);
982 if (sval_cmp(new_max
, sval
) < 0)
984 } END_FOR_EACH_PTR(tmp
);
986 if (sval_is_max(sval
))
988 *min
= sval_cast(get_type(expr
), sval
);
992 static int get_const_value(struct expression
*expr
, sval_t
*sval
)
997 if (expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
1000 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
1002 if (get_value(sym
->initializer
, &right
)) {
1003 *sval
= sval_cast(get_type(expr
), right
);
1009 static struct range_list
*handle_variable(struct expression
*expr
, int implied
)
1011 struct smatch_state
*state
;
1012 struct range_list
*rl
;
1013 sval_t sval
, min
, max
;
1015 if (get_const_value(expr
, &sval
))
1016 return alloc_rl(sval
, sval
);
1018 switch (implied_to_rl_enum(implied
)) {
1024 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1025 if (!state
|| !state
->data
) {
1026 if (get_local_rl(expr
, &rl
))
1030 if (implied
== HARD_MAX
&& !estate_has_hard_max(state
))
1032 return estate_rl(state
);
1034 if (!get_fuzzy_min_helper(expr
, &min
))
1035 min
= sval_type_min(get_type(expr
));
1036 if (!get_fuzzy_max_helper(expr
, &max
))
1038 return alloc_rl(min
, max
);
1043 static sval_t
_get_implied_value(struct expression
*expr
, int *undefined
, int implied
)
1047 ret
= sval_blank(expr
);
1056 if (!get_implied_value_helper(expr
, &ret
, implied
))
1060 if (!get_fuzzy_max_helper(expr
, &ret
))
1064 if (!get_fuzzy_min_helper(expr
, &ret
))
1073 static sval_t
handle_sizeof(struct expression
*expr
)
1078 ret
= sval_blank(expr
);
1079 sym
= expr
->cast_type
;
1081 sym
= evaluate_expression(expr
->cast_expression
);
1083 * Expressions of restricted types will possibly get
1084 * promoted - check that here
1086 if (is_restricted_type(sym
)) {
1087 if (sym
->bit_size
< bits_in_int
)
1089 } else if (is_fouled_type(sym
)) {
1093 examine_symbol_type(sym
);
1095 ret
.type
= size_t_ctype
;
1096 if (sym
->bit_size
<= 0) /* sizeof(void) */ {
1097 if (get_real_base_type(sym
) == &void_ctype
)
1102 ret
.value
= bits_to_bytes(sym
->bit_size
);
1107 static struct range_list
*handle_call_rl(struct expression
*expr
, int implied
)
1109 struct range_list
*rl
;
1111 if (implied
== EXACT
)
1114 if (get_implied_return(expr
, &rl
))
1116 return db_return_vals(expr
);
1119 static sval_t
handle_call(struct expression
*expr
, int *undefined
, int implied
)
1121 struct range_list
*rl
;
1123 if (!get_implied_rl(expr
, &rl
)) {
1130 if (sval_cmp(rl_min(rl
), rl_max(rl
)) == 0)
1149 static struct range_list
*_get_rl(struct expression
*expr
, int implied
)
1151 struct range_list
*rl
;
1152 struct symbol
*type
;
1156 expr
= strip_parens(expr
);
1159 type
= get_type(expr
);
1162 switch (expr
->type
) {
1164 sval
= sval_from_val(expr
, expr
->value
);
1167 rl
= handle_preop_rl(expr
, implied
);
1173 return _get_rl(expr
->unop
, implied
);
1175 case EXPR_FORCE_CAST
:
1176 case EXPR_IMPLIED_CAST
:
1177 rl
= _get_rl(expr
->cast_expression
, implied
);
1181 return cast_rl(type
, rl
);
1184 rl
= handle_binop_rl(expr
, implied
);
1190 rl
= handle_comparison_rl(expr
, implied
);
1196 rl
= handle_logical_rl(expr
, implied
);
1201 case EXPR_PTRSIZEOF
:
1203 sval
= handle_sizeof(expr
);
1206 case EXPR_CONDITIONAL
:
1207 rl
= handle_conditional_rl(expr
, implied
);
1213 rl
= handle_call_rl(expr
, implied
);
1220 rl
= handle_variable(expr
, implied
);
1227 if (undefined
&& type
&&
1228 (implied
== ABSOLUTE_MAX
|| implied
== ABSOLUTE_MIN
))
1229 return alloc_whole_rl(type
);
1232 rl
= alloc_rl(sval
, sval
);
1236 static sval_t
_get_value(struct expression
*expr
, int *undefined
, int implied
)
1238 struct symbol
*type
;
1248 expr
= strip_parens(expr
);
1249 type
= get_type(expr
);
1251 switch (expr
->type
) {
1253 ret
= sval_from_val(expr
, expr
->value
);
1256 ret
= handle_preop(expr
, undefined
, implied
);
1259 ret
= _get_value(expr
->unop
, undefined
, implied
);
1262 case EXPR_FORCE_CAST
:
1263 case EXPR_IMPLIED_CAST
:
1264 ret
= _get_value(expr
->cast_expression
, undefined
, implied
);
1265 ret
= sval_cast(type
, ret
);
1268 ret
= handle_binop(expr
, undefined
, implied
);
1271 ret
= handle_comparison(expr
, undefined
, implied
);
1274 ret
= handle_logical(expr
, undefined
, implied
);
1276 case EXPR_PTRSIZEOF
:
1278 ret
= handle_sizeof(expr
);
1281 if (get_const_value(expr
, &ret
)) {
1284 ret
= _get_implied_value(expr
, undefined
, implied
);
1287 case EXPR_CONDITIONAL
:
1288 ret
= handle_conditional(expr
, undefined
, implied
);
1291 ret
= handle_call(expr
, undefined
, implied
);
1294 ret
= _get_implied_value(expr
, undefined
, implied
);
1302 /* returns 1 if it can get a value literal or else returns 0 */
1303 int get_value(struct expression
*expr
, sval_t
*sval
)
1305 struct range_list
*rl
;
1307 rl
= _get_rl(expr
, EXACT
);
1308 if (!rl_to_sval(rl
, sval
))
1313 int get_implied_value(struct expression
*expr
, sval_t
*sval
)
1315 struct range_list
*rl
;
1317 rl
= _get_rl(expr
, IMPLIED
);
1318 if (!rl_to_sval(rl
, sval
))
1323 int get_implied_min(struct expression
*expr
, sval_t
*sval
)
1325 struct range_list
*rl
;
1327 rl
= _get_rl(expr
, IMPLIED_MIN
);
1334 int get_implied_max(struct expression
*expr
, sval_t
*sval
)
1336 struct range_list
*rl
;
1338 rl
= _get_rl(expr
, IMPLIED_MAX
);
1345 int get_implied_rl(struct expression
*expr
, struct range_list
**rl
)
1348 struct smatch_state
*state
;
1355 expr
= strip_parens(expr
);
1359 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1361 *rl
= clone_rl(estate_rl(state
));
1365 if (expr
->type
== EXPR_CALL
) {
1366 if (get_implied_return(expr
, rl
))
1368 *rl
= db_return_vals(expr
);
1374 if (get_implied_value(expr
, &sval
)) {
1375 add_range(rl
, sval
, sval
);
1379 if (get_local_rl(expr
, rl
))
1382 min_known
= get_implied_min(expr
, &min
);
1383 max_known
= get_implied_max(expr
, &max
);
1384 if (!min_known
&& !max_known
)
1387 get_absolute_min(expr
, &min
);
1389 get_absolute_max(expr
, &max
);
1391 *rl
= alloc_rl(min
, max
);
1395 int get_hard_max(struct expression
*expr
, sval_t
*sval
)
1397 struct range_list
*rl
;
1399 rl
= _get_rl(expr
, HARD_MAX
);
1406 int get_fuzzy_min(struct expression
*expr
, sval_t
*sval
)
1408 struct range_list
*rl
;
1410 rl
= _get_rl(expr
, FUZZY_MIN
);
1417 int get_fuzzy_max(struct expression
*expr
, sval_t
*sval
)
1419 struct range_list
*rl
;
1422 rl
= _get_rl(expr
, FUZZY_MAX
);
1426 if (max
.uvalue
> INT_MAX
- 10000)
1432 int get_absolute_min(struct expression
*expr
, sval_t
*sval
)
1434 struct range_list
*rl
;
1435 struct symbol
*type
;
1437 type
= get_type(expr
);
1439 type
= &llong_ctype
; // FIXME: this is wrong but places assume get type can't fail.
1440 rl
= _get_rl(expr
, ABSOLUTE_MIN
);
1444 *sval
= sval_type_min(type
);
1446 if (sval_cmp(*sval
, sval_type_min(type
)) < 0)
1447 *sval
= sval_type_min(type
);
1451 int get_absolute_max(struct expression
*expr
, sval_t
*sval
)
1453 struct range_list
*rl
;
1454 struct symbol
*type
;
1456 type
= get_type(expr
);
1458 type
= &llong_ctype
;
1459 rl
= _get_rl(expr
, ABSOLUTE_MAX
);
1463 *sval
= sval_type_max(type
);
1465 if (sval_cmp(sval_type_max(type
), *sval
) < 0)
1466 *sval
= sval_type_max(type
);
1470 int known_condition_true(struct expression
*expr
)
1477 if (get_value(expr
, &tmp
) && tmp
.value
)
1483 int known_condition_false(struct expression
*expr
)
1491 if (expr
->type
== EXPR_CALL
) {
1492 if (sym_name_is("__builtin_constant_p", expr
->fn
))
1498 int implied_condition_true(struct expression
*expr
)
1505 if (known_condition_true(expr
))
1507 if (get_implied_value(expr
, &tmp
) && tmp
.value
)
1510 if (expr
->type
== EXPR_POSTOP
)
1511 return implied_condition_true(expr
->unop
);
1513 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_DECREMENT
)
1514 return implied_not_equal(expr
->unop
, 1);
1515 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_INCREMENT
)
1516 return implied_not_equal(expr
->unop
, -1);
1518 expr
= strip_expr(expr
);
1519 switch (expr
->type
) {
1521 if (do_comparison(expr
) == 1)
1525 if (expr
->op
== '!') {
1526 if (implied_condition_false(expr
->unop
))
1532 if (implied_not_equal(expr
, 0) == 1)
1539 int implied_condition_false(struct expression
*expr
)
1541 struct expression
*tmp
;
1547 if (known_condition_false(expr
))
1550 switch (expr
->type
) {
1552 if (do_comparison(expr
) == 2)
1555 if (expr
->op
== '!') {
1556 if (implied_condition_true(expr
->unop
))
1560 tmp
= strip_expr(expr
);
1562 return implied_condition_false(tmp
);
1565 if (get_implied_value(expr
, &sval
) && sval
.value
== 0)