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 struct range_list
*handle_subtract_rl(struct expression
*expr
, int implied
)
316 struct range_list
*left_rl
, *right_rl
;
317 sval_t max
, min
, tmp
;
320 type
= get_type(expr
);
321 left_rl
= _get_rl(expr
->left
, implied
);
322 left_rl
= cast_rl(type
, left_rl
);
324 left_rl
= alloc_whole_rl(type
);
325 right_rl
= _get_rl(expr
->right
, implied
);
326 right_rl
= cast_rl(type
, right_rl
);
328 right_rl
= alloc_whole_rl(type
);
329 comparison
= get_comparison(expr
->left
, expr
->right
);
331 /* negative values complicate everything fix this later */
332 if (sval_is_negative(rl_min(right_rl
)))
334 max
= rl_max(left_rl
);
336 switch (comparison
) {
338 case SPECIAL_UNSIGNED_GT
:
339 min
= sval_type_val(type
, 1);
340 max
= rl_max(left_rl
);
343 case SPECIAL_UNSIGNED_GTE
:
344 min
= sval_type_val(type
, 0);
345 max
= rl_max(left_rl
);
348 if (sval_binop_overflows(rl_min(left_rl
), '-', rl_max(right_rl
))) {
352 min
= sval_type_min(type
);
355 tmp
= sval_binop(rl_min(left_rl
), '-', rl_max(right_rl
));
356 if (sval_cmp(tmp
, min
) > 0)
359 if (!sval_is_max(rl_max(left_rl
))) {
360 tmp
= sval_binop(rl_max(left_rl
), '-', rl_min(right_rl
));
361 if (sval_cmp(tmp
, max
) < 0)
365 if (sval_is_min(min
) && sval_is_max(max
))
368 return cast_rl(type
, alloc_rl(min
, max
));
371 static sval_t
handle_subtract(struct expression
*expr
, int *undefined
, int implied
)
374 sval_t left
, right
, ret
;
375 int left_undefined
= 0;
376 int right_undefined
= 0;
377 int known_but_negative
= 0;
380 left
= _get_value(expr
->left
, &left_undefined
, implied
);
381 right
= _get_value(expr
->right
, &right_undefined
, opposite_implied(implied
));
383 if (!left_undefined
&& !right_undefined
) {
384 ret
= sval_binop(left
, '-', right
);
385 if (sval_is_negative(ret
))
386 known_but_negative
= 1;
388 return ret
; /* best case scenario */
391 comparison
= get_comparison(expr
->left
, expr
->right
);
395 type
= get_type(expr
);
397 switch (comparison
) {
399 case SPECIAL_UNSIGNED_GT
:
404 return sval_type_val(type
, 1);
408 return _get_value(expr
->left
, undefined
, implied
);
412 case SPECIAL_UNSIGNED_GTE
:
417 return sval_type_val(type
, 0);
421 return _get_value(expr
->left
, undefined
, implied
);
426 if (known_but_negative
)
434 static struct range_list
*handle_mod_rl(struct expression
*expr
, int implied
)
436 struct range_list
*rl
;
437 sval_t left
, right
, sval
;
439 if (implied
== EXACT
) {
440 if (!get_value(expr
->right
, &right
))
442 if (!get_value(expr
->left
, &left
))
444 sval
= sval_binop(left
, '%', right
);
445 return alloc_rl(sval
, sval
);
447 /* if we can't figure out the right side it's probably hopeless */
448 if (!get_implied_value(expr
->right
, &right
))
451 right
= sval_cast(get_type(expr
), right
);
454 rl
= _get_rl(expr
->left
, implied
);
455 if (rl
&& rl_max(rl
).uvalue
< right
.uvalue
)
456 right
.uvalue
= rl_max(rl
).uvalue
;
458 return alloc_rl(zero
, right
);
461 static sval_t
handle_mod(struct expression
*expr
, int *undefined
, int implied
)
465 /* if we can't figure out the right side it's probably hopeless */
466 right
= _get_value(expr
->right
, undefined
, implied
);
467 if (*undefined
|| right
.value
== 0) {
475 left
= _get_value(expr
->left
, undefined
, implied
);
477 return sval_binop(left
, '%', right
);
483 return sval_type_val(get_type(expr
), 0);
488 right
= sval_cast(get_type(expr
), right
);
495 static struct range_list
*handle_bitwise_AND(struct expression
*expr
, int implied
)
498 struct range_list
*left_rl
, *right_rl
;
500 if (implied
== EXACT
|| implied
== HARD_MAX
)
502 type
= get_type(expr
);
504 left_rl
= _get_rl(expr
->left
, implied
);
506 left_rl
= cast_rl(type
, left_rl
);
507 left_rl
= alloc_rl(sval_type_val(type
, 0), rl_max(left_rl
));
509 left_rl
= alloc_whole_rl(type
);
512 right_rl
= _get_rl(expr
->right
, implied
);
514 right_rl
= cast_rl(type
, right_rl
);
515 right_rl
= alloc_rl(sval_type_val(type
, 0), rl_max(right_rl
));
517 right_rl
= alloc_whole_rl(type
);
520 return rl_intersection(left_rl
, right_rl
);
523 static struct range_list
*handle_right_shift(struct expression
*expr
, int implied
)
525 struct range_list
*left_rl
;
529 if (implied
== HARD_MAX
)
531 /* this is hopeless without the right side */
532 if (!get_implied_value(expr
->right
, &right
))
534 left_rl
= _get_rl(expr
->left
, implied
);
536 max
= rl_max(left_rl
);
537 min
= rl_min(left_rl
);
539 if (implied_to_rl_enum(implied
) == RL_FUZZY
)
541 if (implied_to_rl_enum(implied
) == RL_HARD
)
543 max
= sval_type_max(get_type(expr
->left
));
544 min
= sval_type_val(get_type(expr
->left
), 0);
547 max
= sval_binop(max
, SPECIAL_RIGHTSHIFT
, right
);
548 min
= sval_binop(min
, SPECIAL_RIGHTSHIFT
, right
);
549 return alloc_rl(min
, max
);
552 static struct range_list
*handle_known_binop(struct expression
*expr
)
556 if (!get_value(expr
->left
, &left
))
558 if (!get_value(expr
->right
, &right
))
560 left
= sval_binop(left
, expr
->op
, right
);
561 return alloc_rl(left
, left
);
564 static struct range_list
*handle_binop_rl(struct expression
*expr
, int implied
)
568 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
570 struct range_list
*rl
;
572 rl
= handle_known_binop(expr
);
575 if (implied
== EXACT
)
580 return handle_mod_rl(expr
, implied
);
582 return handle_bitwise_AND(expr
, implied
);
583 case SPECIAL_RIGHTSHIFT
:
584 return handle_right_shift(expr
, implied
);
586 return handle_subtract_rl(expr
, implied
);
589 left
= _get_value(expr
->left
, &undefined
, implied
);
590 right
= _get_value(expr
->right
, &undefined
, implied
);
595 type
= get_type(expr
);
596 left
= sval_cast(type
, left
);
597 right
= sval_cast(type
, right
);
602 if (sval_binop_overflows(left
, expr
->op
, right
)) {
603 ret
= sval_type_max(get_type(expr
));
604 return alloc_rl(ret
, ret
);
609 if (sval_binop_overflows(left
, expr
->op
, right
))
615 ret
= handle_divide(expr
, &undefined
, implied
);
618 return alloc_rl(ret
, ret
);
620 if (right
.value
== 0) {
623 ret
= sval_binop(left
, '%', right
);
624 return alloc_rl(ret
, ret
);
627 ret
= sval_binop(left
, expr
->op
, right
);
629 return alloc_rl(ret
, ret
);
632 static sval_t
handle_binop(struct expression
*expr
, int *undefined
, int implied
)
636 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
641 return handle_mod(expr
, undefined
, implied
);
643 if (implied
== HARD_MAX
) {
647 left
= _get_value(expr
->left
, &local_undef
, implied
);
649 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
650 ret
= sval_blank(expr
->left
);
654 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
656 if (!get_absolute_max(expr
->left
, &left
))
659 right
= _get_value(expr
->right
, undefined
, implied
);
662 return sval_binop(left
, '&', right
);
664 case SPECIAL_RIGHTSHIFT
:
665 if (implied
== HARD_MAX
) {
669 left
= _get_value(expr
->left
, &local_undef
, implied
);
671 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
672 ret
= sval_blank(expr
->left
);
676 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
678 if (!get_absolute_max(expr
->left
, &left
))
681 right
= _get_value(expr
->right
, undefined
, implied
);
684 return sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
686 return handle_subtract(expr
, undefined
, implied
);
689 left
= _get_value(expr
->left
, undefined
, implied
);
690 right
= _get_value(expr
->right
, undefined
, implied
);
695 type
= get_type(expr
);
696 left
= sval_cast(type
, left
);
697 right
= sval_cast(type
, right
);
702 if (sval_binop_overflows(left
, expr
->op
, right
))
703 return sval_type_max(get_type(expr
));
707 if (sval_binop_overflows(left
, expr
->op
, right
)) {
715 return handle_divide(expr
, undefined
, implied
);
717 if (right
.value
== 0) {
721 return sval_binop(left
, '%', right
);
724 ret
= sval_binop(left
, expr
->op
, right
);
729 static int do_comparison(struct expression
*expr
)
731 struct range_list
*left_ranges
= NULL
;
732 struct range_list
*right_ranges
= NULL
;
733 int poss_true
, poss_false
;
736 type
= get_type(expr
);
738 get_implied_rl(expr
->left
, &left_ranges
);
739 get_implied_rl(expr
->right
, &right_ranges
);
740 left_ranges
= cast_rl(type
, left_ranges
);
741 right_ranges
= cast_rl(type
, right_ranges
);
743 poss_true
= possibly_true_rl(left_ranges
, expr
->op
, right_ranges
);
744 poss_false
= possibly_false_rl(left_ranges
, expr
->op
, right_ranges
);
746 free_rl(&left_ranges
);
747 free_rl(&right_ranges
);
749 if (!poss_true
&& !poss_false
)
751 if (poss_true
&& !poss_false
)
753 if (!poss_true
&& poss_false
)
758 static struct range_list
*handle_comparison_rl(struct expression
*expr
, int implied
)
763 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
764 struct data_range tmp_left
, tmp_right
;
768 tmp_right
.min
= right
;
769 tmp_right
.max
= right
;
770 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
775 if (implied
== EXACT
)
778 res
= do_comparison(expr
);
784 return alloc_rl(zero
, one
);
787 static sval_t
handle_comparison(struct expression
*expr
, int *undefined
, int implied
)
792 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
793 struct data_range tmp_left
, tmp_right
;
797 tmp_right
.min
= right
;
798 tmp_right
.max
= right
;
799 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
804 if (implied
== EXACT
) {
809 res
= do_comparison(expr
);
815 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
817 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
824 static struct range_list
*handle_logical_rl(struct expression
*expr
, int implied
)
830 if (implied
== EXACT
) {
831 if (get_value(expr
->left
, &left
))
833 if (get_value(expr
->right
, &right
))
836 if (get_implied_value(expr
->left
, &left
))
838 if (get_implied_value(expr
->right
, &right
))
843 case SPECIAL_LOGICAL_OR
:
844 if (left_known
&& left
.value
)
846 if (right_known
&& right
.value
)
848 if (left_known
&& right_known
)
851 case SPECIAL_LOGICAL_AND
:
852 if (left_known
&& right_known
) {
853 if (left
.value
&& right
.value
)
862 if (implied
== EXACT
)
865 return alloc_rl(zero
, one
);
868 static sval_t
handle_logical(struct expression
*expr
, int *undefined
, int implied
)
874 if (implied
== EXACT
) {
875 if (get_value(expr
->left
, &left
))
877 if (get_value(expr
->right
, &right
))
880 if (get_implied_value(expr
->left
, &left
))
882 if (get_implied_value(expr
->right
, &right
))
887 case SPECIAL_LOGICAL_OR
:
888 if (left_known
&& left
.value
)
890 if (right_known
&& right
.value
)
892 if (left_known
&& right_known
)
895 case SPECIAL_LOGICAL_AND
:
896 if (left_known
&& right_known
) {
897 if (left
.value
&& right
.value
)
907 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
909 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
916 static struct range_list
*handle_conditional_rl(struct expression
*expr
, int implied
)
918 struct range_list
*true_rl
, *false_rl
;
920 if (known_condition_true(expr
->conditional
))
921 return _get_rl(expr
->cond_true
, implied
);
922 if (known_condition_false(expr
->conditional
))
923 return _get_rl(expr
->cond_false
, implied
);
925 if (implied
== EXACT
)
928 if (implied_condition_true(expr
->conditional
))
929 return _get_rl(expr
->cond_true
, implied
);
930 if (implied_condition_false(expr
->conditional
))
931 return _get_rl(expr
->cond_false
, implied
);
933 true_rl
= _get_rl(expr
->cond_true
, implied
);
936 false_rl
= _get_rl(expr
->cond_false
, implied
);
940 return rl_union(true_rl
, false_rl
);
943 static sval_t
handle_conditional(struct expression
*expr
, int *undefined
, int implied
)
945 if (known_condition_true(expr
->conditional
))
946 return _get_value(expr
->cond_true
, undefined
, implied
);
947 if (known_condition_false(expr
->conditional
))
948 return _get_value(expr
->cond_false
, undefined
, implied
);
950 if (implied
== EXACT
) {
955 if (implied_condition_true(expr
->conditional
))
956 return _get_value(expr
->cond_true
, undefined
, implied
);
957 if (implied_condition_false(expr
->conditional
))
958 return _get_value(expr
->cond_false
, undefined
, implied
);
964 static int get_local_value(struct expression
*expr
, sval_t
*sval
, int implied
)
973 return get_local_min_helper(expr
, sval
);
978 return get_local_max_helper(expr
, sval
);
983 static int get_implied_value_helper(struct expression
*expr
, sval_t
*sval
, int implied
)
985 struct smatch_state
*state
;
989 /* fixme: this should return the casted value */
991 expr
= strip_expr(expr
);
993 if (get_value(expr
, sval
))
996 name
= expr_to_var_sym(expr
, &sym
);
999 *sval
= sval_blank(expr
);
1000 state
= get_state(SMATCH_EXTRA
, name
, sym
);
1002 if (!state
|| !state
->data
)
1003 return get_local_value(expr
, sval
, implied
);
1004 if (implied
== IMPLIED
) {
1005 if (estate_get_single_value(state
, sval
))
1009 if (implied
== HARD_MAX
) {
1010 if (estate_get_hard_max(state
, sval
))
1014 if (implied
== IMPLIED_MAX
|| implied
== ABSOLUTE_MAX
) {
1015 *sval
= estate_max(state
);
1018 *sval
= estate_min(state
);
1022 static int get_fuzzy_max_helper(struct expression
*expr
, sval_t
*max
)
1024 struct sm_state
*sm
;
1025 struct sm_state
*tmp
;
1028 if (get_hard_max(expr
, &sval
)) {
1033 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
1037 sval
= sval_type_min(estate_type(sm
->state
));
1038 FOR_EACH_PTR(sm
->possible
, tmp
) {
1041 new_min
= estate_min(tmp
->state
);
1042 if (sval_cmp(new_min
, sval
) > 0)
1044 } END_FOR_EACH_PTR(tmp
);
1046 if (sval_is_min(sval
))
1048 if (sval
.value
== sval_type_min(sval
.type
).value
+ 1) /* it's common to be on off */
1051 *max
= sval_cast(get_type(expr
), sval
);
1055 static int get_fuzzy_min_helper(struct expression
*expr
, sval_t
*min
)
1057 struct sm_state
*sm
;
1058 struct sm_state
*tmp
;
1061 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
1065 if (!sval_is_min(estate_min(sm
->state
))) {
1066 *min
= estate_min(sm
->state
);
1070 sval
= sval_type_max(estate_type(sm
->state
));
1071 FOR_EACH_PTR(sm
->possible
, tmp
) {
1074 new_max
= estate_max(tmp
->state
);
1075 if (sval_cmp(new_max
, sval
) < 0)
1077 } END_FOR_EACH_PTR(tmp
);
1079 if (sval_is_max(sval
))
1081 *min
= sval_cast(get_type(expr
), sval
);
1085 static int get_const_value(struct expression
*expr
, sval_t
*sval
)
1090 if (expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
1093 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
1095 if (get_value(sym
->initializer
, &right
)) {
1096 *sval
= sval_cast(get_type(expr
), right
);
1102 static struct range_list
*handle_variable(struct expression
*expr
, int implied
)
1104 struct smatch_state
*state
;
1105 struct range_list
*rl
;
1106 sval_t sval
, min
, max
;
1108 if (get_const_value(expr
, &sval
))
1109 return alloc_rl(sval
, sval
);
1111 switch (implied_to_rl_enum(implied
)) {
1117 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1118 if (!state
|| !state
->data
) {
1119 if (get_local_rl(expr
, &rl
))
1123 if (implied
== HARD_MAX
&& !estate_has_hard_max(state
))
1125 return estate_rl(state
);
1127 if (!get_fuzzy_min_helper(expr
, &min
))
1128 min
= sval_type_min(get_type(expr
));
1129 if (!get_fuzzy_max_helper(expr
, &max
))
1131 return alloc_rl(min
, max
);
1136 static sval_t
_get_implied_value(struct expression
*expr
, int *undefined
, int implied
)
1140 ret
= sval_blank(expr
);
1149 if (!get_implied_value_helper(expr
, &ret
, implied
))
1153 if (!get_fuzzy_max_helper(expr
, &ret
))
1157 if (!get_fuzzy_min_helper(expr
, &ret
))
1166 static sval_t
handle_sizeof(struct expression
*expr
)
1171 ret
= sval_blank(expr
);
1172 sym
= expr
->cast_type
;
1174 sym
= evaluate_expression(expr
->cast_expression
);
1176 * Expressions of restricted types will possibly get
1177 * promoted - check that here
1179 if (is_restricted_type(sym
)) {
1180 if (sym
->bit_size
< bits_in_int
)
1182 } else if (is_fouled_type(sym
)) {
1186 examine_symbol_type(sym
);
1188 ret
.type
= size_t_ctype
;
1189 if (sym
->bit_size
<= 0) /* sizeof(void) */ {
1190 if (get_real_base_type(sym
) == &void_ctype
)
1195 ret
.value
= bits_to_bytes(sym
->bit_size
);
1200 static struct range_list
*handle_call_rl(struct expression
*expr
, int implied
)
1202 struct range_list
*rl
;
1204 if (implied
== EXACT
)
1207 if (get_implied_return(expr
, &rl
))
1209 return db_return_vals(expr
);
1212 static sval_t
handle_call(struct expression
*expr
, int *undefined
, int implied
)
1214 struct range_list
*rl
;
1216 if (!get_implied_rl(expr
, &rl
)) {
1223 if (sval_cmp(rl_min(rl
), rl_max(rl
)) == 0)
1242 static struct range_list
*_get_rl(struct expression
*expr
, int implied
)
1244 struct range_list
*rl
;
1245 struct symbol
*type
;
1249 expr
= strip_parens(expr
);
1252 type
= get_type(expr
);
1255 switch (expr
->type
) {
1257 sval
= sval_from_val(expr
, expr
->value
);
1260 rl
= handle_preop_rl(expr
, implied
);
1266 return _get_rl(expr
->unop
, implied
);
1268 case EXPR_FORCE_CAST
:
1269 case EXPR_IMPLIED_CAST
:
1270 rl
= _get_rl(expr
->cast_expression
, implied
);
1274 return cast_rl(type
, rl
);
1277 rl
= handle_binop_rl(expr
, implied
);
1283 rl
= handle_comparison_rl(expr
, implied
);
1289 rl
= handle_logical_rl(expr
, implied
);
1294 case EXPR_PTRSIZEOF
:
1296 sval
= handle_sizeof(expr
);
1299 case EXPR_CONDITIONAL
:
1300 rl
= handle_conditional_rl(expr
, implied
);
1306 rl
= handle_call_rl(expr
, implied
);
1313 rl
= handle_variable(expr
, implied
);
1320 if (undefined
&& type
&&
1321 (implied
== ABSOLUTE_MAX
|| implied
== ABSOLUTE_MIN
))
1322 return alloc_whole_rl(type
);
1325 rl
= alloc_rl(sval
, sval
);
1329 static sval_t
_get_value(struct expression
*expr
, int *undefined
, int implied
)
1331 struct symbol
*type
;
1341 expr
= strip_parens(expr
);
1342 type
= get_type(expr
);
1344 switch (expr
->type
) {
1346 ret
= sval_from_val(expr
, expr
->value
);
1349 ret
= handle_preop(expr
, undefined
, implied
);
1352 ret
= _get_value(expr
->unop
, undefined
, implied
);
1355 case EXPR_FORCE_CAST
:
1356 case EXPR_IMPLIED_CAST
:
1357 ret
= _get_value(expr
->cast_expression
, undefined
, implied
);
1358 ret
= sval_cast(type
, ret
);
1361 ret
= handle_binop(expr
, undefined
, implied
);
1364 ret
= handle_comparison(expr
, undefined
, implied
);
1367 ret
= handle_logical(expr
, undefined
, implied
);
1369 case EXPR_PTRSIZEOF
:
1371 ret
= handle_sizeof(expr
);
1374 if (get_const_value(expr
, &ret
)) {
1377 ret
= _get_implied_value(expr
, undefined
, implied
);
1380 case EXPR_CONDITIONAL
:
1381 ret
= handle_conditional(expr
, undefined
, implied
);
1384 ret
= handle_call(expr
, undefined
, implied
);
1387 ret
= _get_implied_value(expr
, undefined
, implied
);
1395 /* returns 1 if it can get a value literal or else returns 0 */
1396 int get_value(struct expression
*expr
, sval_t
*sval
)
1398 struct range_list
*rl
;
1400 rl
= _get_rl(expr
, EXACT
);
1401 if (!rl_to_sval(rl
, sval
))
1406 int get_implied_value(struct expression
*expr
, sval_t
*sval
)
1408 struct range_list
*rl
;
1410 rl
= _get_rl(expr
, IMPLIED
);
1411 if (!rl_to_sval(rl
, sval
))
1416 int get_implied_min(struct expression
*expr
, sval_t
*sval
)
1418 struct range_list
*rl
;
1420 rl
= _get_rl(expr
, IMPLIED_MIN
);
1427 int get_implied_max(struct expression
*expr
, sval_t
*sval
)
1429 struct range_list
*rl
;
1431 rl
= _get_rl(expr
, IMPLIED_MAX
);
1438 int get_implied_rl(struct expression
*expr
, struct range_list
**rl
)
1441 struct smatch_state
*state
;
1448 expr
= strip_parens(expr
);
1452 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1454 *rl
= clone_rl(estate_rl(state
));
1458 if (expr
->type
== EXPR_CALL
) {
1459 if (get_implied_return(expr
, rl
))
1461 *rl
= db_return_vals(expr
);
1467 if (get_implied_value(expr
, &sval
)) {
1468 add_range(rl
, sval
, sval
);
1472 if (get_local_rl(expr
, rl
))
1475 min_known
= get_implied_min(expr
, &min
);
1476 max_known
= get_implied_max(expr
, &max
);
1477 if (!min_known
&& !max_known
)
1480 get_absolute_min(expr
, &min
);
1482 get_absolute_max(expr
, &max
);
1484 *rl
= alloc_rl(min
, max
);
1488 int get_hard_max(struct expression
*expr
, sval_t
*sval
)
1490 struct range_list
*rl
;
1492 rl
= _get_rl(expr
, HARD_MAX
);
1499 int get_fuzzy_min(struct expression
*expr
, sval_t
*sval
)
1501 struct range_list
*rl
;
1503 rl
= _get_rl(expr
, FUZZY_MIN
);
1510 int get_fuzzy_max(struct expression
*expr
, sval_t
*sval
)
1512 struct range_list
*rl
;
1515 rl
= _get_rl(expr
, FUZZY_MAX
);
1519 if (max
.uvalue
> INT_MAX
- 10000)
1525 int get_absolute_min(struct expression
*expr
, sval_t
*sval
)
1527 struct range_list
*rl
;
1528 struct symbol
*type
;
1530 type
= get_type(expr
);
1532 type
= &llong_ctype
; // FIXME: this is wrong but places assume get type can't fail.
1533 rl
= _get_rl(expr
, ABSOLUTE_MIN
);
1537 *sval
= sval_type_min(type
);
1539 if (sval_cmp(*sval
, sval_type_min(type
)) < 0)
1540 *sval
= sval_type_min(type
);
1544 int get_absolute_max(struct expression
*expr
, sval_t
*sval
)
1546 struct range_list
*rl
;
1547 struct symbol
*type
;
1549 type
= get_type(expr
);
1551 type
= &llong_ctype
;
1552 rl
= _get_rl(expr
, ABSOLUTE_MAX
);
1556 *sval
= sval_type_max(type
);
1558 if (sval_cmp(sval_type_max(type
), *sval
) < 0)
1559 *sval
= sval_type_max(type
);
1563 int known_condition_true(struct expression
*expr
)
1570 if (get_value(expr
, &tmp
) && tmp
.value
)
1576 int known_condition_false(struct expression
*expr
)
1584 if (expr
->type
== EXPR_CALL
) {
1585 if (sym_name_is("__builtin_constant_p", expr
->fn
))
1591 int implied_condition_true(struct expression
*expr
)
1598 if (known_condition_true(expr
))
1600 if (get_implied_value(expr
, &tmp
) && tmp
.value
)
1603 if (expr
->type
== EXPR_POSTOP
)
1604 return implied_condition_true(expr
->unop
);
1606 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_DECREMENT
)
1607 return implied_not_equal(expr
->unop
, 1);
1608 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_INCREMENT
)
1609 return implied_not_equal(expr
->unop
, -1);
1611 expr
= strip_expr(expr
);
1612 switch (expr
->type
) {
1614 if (do_comparison(expr
) == 1)
1618 if (expr
->op
== '!') {
1619 if (implied_condition_false(expr
->unop
))
1625 if (implied_not_equal(expr
, 0) == 1)
1632 int implied_condition_false(struct expression
*expr
)
1634 struct expression
*tmp
;
1640 if (known_condition_false(expr
))
1643 switch (expr
->type
) {
1645 if (do_comparison(expr
) == 2)
1648 if (expr
->op
== '!') {
1649 if (implied_condition_true(expr
->unop
))
1653 tmp
= strip_expr(expr
);
1655 return implied_condition_false(tmp
);
1658 if (get_implied_value(expr
, &sval
) && sval
.value
== 0)