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 struct range_list
*handle_divide_rl(struct expression
*expr
, int implied
)
300 struct range_list
*left_rl
, *right_rl
;
304 type
= get_type(expr
);
306 left_rl
= _get_rl(expr
->left
, implied
);
307 left_rl
= cast_rl(type
, left_rl
);
308 right_rl
= _get_rl(expr
->right
, implied
);
309 right_rl
= cast_rl(type
, right_rl
);
311 if (!left_rl
|| !right_rl
)
313 if (is_whole_rl(left_rl
) || is_whole_rl(right_rl
))
315 if (sval_is_negative(rl_min(left_rl
)) || sval_cmp_val(rl_min(right_rl
), 0) <= 0)
318 max
= rl_max(left_rl
);
319 if (sval_is_max(max
))
320 max
= sval_binop(max
, '/', rl_min(right_rl
));
321 min
= sval_binop(rl_min(left_rl
), '/', rl_max(right_rl
));
322 return alloc_rl(min
, max
);
325 static sval_t
handle_divide(struct expression
*expr
, int *undefined
, int implied
)
329 left
= _get_value(expr
->left
, undefined
, implied
);
330 right
= _get_value(expr
->right
, undefined
, opposite_implied(implied
));
332 if (right
.value
== 0) {
337 return sval_binop(left
, '/', right
);
340 static struct range_list
*handle_subtract_rl(struct expression
*expr
, int implied
)
343 struct range_list
*left_rl
, *right_rl
;
344 sval_t max
, min
, tmp
;
347 type
= get_type(expr
);
348 left_rl
= _get_rl(expr
->left
, implied
);
349 left_rl
= cast_rl(type
, left_rl
);
351 left_rl
= alloc_whole_rl(type
);
352 right_rl
= _get_rl(expr
->right
, implied
);
353 right_rl
= cast_rl(type
, right_rl
);
355 right_rl
= alloc_whole_rl(type
);
356 comparison
= get_comparison(expr
->left
, expr
->right
);
358 /* negative values complicate everything fix this later */
359 if (sval_is_negative(rl_min(right_rl
)))
361 max
= rl_max(left_rl
);
363 switch (comparison
) {
365 case SPECIAL_UNSIGNED_GT
:
366 min
= sval_type_val(type
, 1);
367 max
= rl_max(left_rl
);
370 case SPECIAL_UNSIGNED_GTE
:
371 min
= sval_type_val(type
, 0);
372 max
= rl_max(left_rl
);
375 if (sval_binop_overflows(rl_min(left_rl
), '-', rl_max(right_rl
)))
377 min
= sval_type_min(type
);
380 if (!sval_binop_overflows(rl_min(left_rl
), '-', rl_max(right_rl
))) {
381 tmp
= sval_binop(rl_min(left_rl
), '-', rl_max(right_rl
));
382 if (sval_cmp(tmp
, min
) > 0)
386 if (!sval_is_max(rl_max(left_rl
))) {
387 tmp
= sval_binop(rl_max(left_rl
), '-', rl_min(right_rl
));
388 if (sval_cmp(tmp
, max
) < 0)
392 if (sval_is_min(min
) && sval_is_max(max
))
395 return cast_rl(type
, alloc_rl(min
, max
));
398 static sval_t
handle_subtract(struct expression
*expr
, int *undefined
, int implied
)
401 sval_t left
, right
, ret
;
402 int left_undefined
= 0;
403 int right_undefined
= 0;
404 int known_but_negative
= 0;
407 left
= _get_value(expr
->left
, &left_undefined
, implied
);
408 right
= _get_value(expr
->right
, &right_undefined
, opposite_implied(implied
));
410 if (!left_undefined
&& !right_undefined
) {
411 ret
= sval_binop(left
, '-', right
);
412 if (sval_is_negative(ret
))
413 known_but_negative
= 1;
415 return ret
; /* best case scenario */
418 comparison
= get_comparison(expr
->left
, expr
->right
);
422 type
= get_type(expr
);
424 switch (comparison
) {
426 case SPECIAL_UNSIGNED_GT
:
431 return sval_type_val(type
, 1);
435 return _get_value(expr
->left
, undefined
, implied
);
439 case SPECIAL_UNSIGNED_GTE
:
444 return sval_type_val(type
, 0);
448 return _get_value(expr
->left
, undefined
, implied
);
453 if (known_but_negative
)
461 static struct range_list
*handle_mod_rl(struct expression
*expr
, int implied
)
463 struct range_list
*rl
;
464 sval_t left
, right
, sval
;
466 if (implied
== EXACT
) {
467 if (!get_value(expr
->right
, &right
))
469 if (!get_value(expr
->left
, &left
))
471 sval
= sval_binop(left
, '%', right
);
472 return alloc_rl(sval
, sval
);
474 /* if we can't figure out the right side it's probably hopeless */
475 if (!get_implied_value(expr
->right
, &right
))
478 right
= sval_cast(get_type(expr
), right
);
481 rl
= _get_rl(expr
->left
, implied
);
482 if (rl
&& rl_max(rl
).uvalue
< right
.uvalue
)
483 right
.uvalue
= rl_max(rl
).uvalue
;
485 return alloc_rl(zero
, right
);
488 static sval_t
handle_mod(struct expression
*expr
, int *undefined
, int implied
)
492 /* if we can't figure out the right side it's probably hopeless */
493 right
= _get_value(expr
->right
, undefined
, implied
);
494 if (*undefined
|| right
.value
== 0) {
502 left
= _get_value(expr
->left
, undefined
, implied
);
504 return sval_binop(left
, '%', right
);
510 return sval_type_val(get_type(expr
), 0);
515 right
= sval_cast(get_type(expr
), right
);
522 static struct range_list
*handle_bitwise_AND(struct expression
*expr
, int implied
)
525 struct range_list
*left_rl
, *right_rl
;
527 if (implied
== EXACT
|| implied
== HARD_MAX
)
529 type
= get_type(expr
);
531 left_rl
= _get_rl(expr
->left
, implied
);
533 left_rl
= cast_rl(type
, left_rl
);
534 left_rl
= alloc_rl(sval_type_val(type
, 0), rl_max(left_rl
));
536 left_rl
= alloc_whole_rl(type
);
539 right_rl
= _get_rl(expr
->right
, implied
);
541 right_rl
= cast_rl(type
, right_rl
);
542 right_rl
= alloc_rl(sval_type_val(type
, 0), rl_max(right_rl
));
544 right_rl
= alloc_whole_rl(type
);
547 return rl_intersection(left_rl
, right_rl
);
550 static struct range_list
*handle_right_shift(struct expression
*expr
, int implied
)
552 struct range_list
*left_rl
;
556 if (implied
== HARD_MAX
)
558 /* this is hopeless without the right side */
559 if (!get_implied_value(expr
->right
, &right
))
561 left_rl
= _get_rl(expr
->left
, implied
);
563 max
= rl_max(left_rl
);
564 min
= rl_min(left_rl
);
566 if (implied_to_rl_enum(implied
) == RL_FUZZY
)
568 if (implied_to_rl_enum(implied
) == RL_HARD
)
570 max
= sval_type_max(get_type(expr
->left
));
571 min
= sval_type_val(get_type(expr
->left
), 0);
574 max
= sval_binop(max
, SPECIAL_RIGHTSHIFT
, right
);
575 min
= sval_binop(min
, SPECIAL_RIGHTSHIFT
, right
);
576 return alloc_rl(min
, max
);
579 static struct range_list
*handle_known_binop(struct expression
*expr
)
583 if (!get_value(expr
->left
, &left
))
585 if (!get_value(expr
->right
, &right
))
587 left
= sval_binop(left
, expr
->op
, right
);
588 return alloc_rl(left
, left
);
591 static struct range_list
*handle_binop_rl(struct expression
*expr
, int implied
)
594 struct range_list
*left_rl
, *right_rl
, *rl
;
597 rl
= handle_known_binop(expr
);
600 if (implied
== EXACT
)
605 return handle_mod_rl(expr
, implied
);
607 return handle_bitwise_AND(expr
, implied
);
608 case SPECIAL_RIGHTSHIFT
:
609 return handle_right_shift(expr
, implied
);
611 return handle_subtract_rl(expr
, implied
);
613 return handle_divide_rl(expr
, implied
);
616 type
= get_type(expr
);
617 left_rl
= _get_rl(expr
->left
, implied
);
618 left_rl
= cast_rl(type
, left_rl
);
619 right_rl
= _get_rl(expr
->right
, implied
);
620 right_rl
= cast_rl(type
, right_rl
);
622 if (!left_rl
|| !right_rl
)
625 if (sval_binop_overflows(rl_min(left_rl
), expr
->op
, rl_min(right_rl
)))
627 min
= sval_binop(rl_min(left_rl
), expr
->op
, rl_min(right_rl
));
629 if (sval_binop_overflows(rl_max(left_rl
), expr
->op
, rl_max(right_rl
))) {
630 switch (implied_to_rl_enum(implied
)) {
635 max
= sval_type_max(get_type(expr
));
638 max
= sval_binop(rl_max(left_rl
), expr
->op
, rl_max(right_rl
));
641 return alloc_rl(min
, max
);
644 static sval_t
handle_binop(struct expression
*expr
, int *undefined
, int implied
)
648 sval_t ret
= {.type
= &int_ctype
, {.value
= 123456} };
653 return handle_mod(expr
, undefined
, implied
);
655 if (implied
== HARD_MAX
) {
659 left
= _get_value(expr
->left
, &local_undef
, implied
);
661 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
662 ret
= sval_blank(expr
->left
);
666 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
668 if (!get_absolute_max(expr
->left
, &left
))
671 right
= _get_value(expr
->right
, undefined
, implied
);
674 return sval_binop(left
, '&', right
);
676 case SPECIAL_RIGHTSHIFT
:
677 if (implied
== HARD_MAX
) {
681 left
= _get_value(expr
->left
, &local_undef
, implied
);
683 if (implied
== IMPLIED_MIN
|| implied
== ABSOLUTE_MIN
) {
684 ret
= sval_blank(expr
->left
);
688 if (implied
!= IMPLIED_MAX
&& implied
!= ABSOLUTE_MAX
)
690 if (!get_absolute_max(expr
->left
, &left
))
693 right
= _get_value(expr
->right
, undefined
, implied
);
696 return sval_binop(left
, SPECIAL_RIGHTSHIFT
, right
);
698 return handle_subtract(expr
, undefined
, implied
);
701 left
= _get_value(expr
->left
, undefined
, implied
);
702 right
= _get_value(expr
->right
, undefined
, implied
);
707 type
= get_type(expr
);
708 left
= sval_cast(type
, left
);
709 right
= sval_cast(type
, right
);
714 if (sval_binop_overflows(left
, expr
->op
, right
))
715 return sval_type_max(get_type(expr
));
719 if (sval_binop_overflows(left
, expr
->op
, right
)) {
727 return handle_divide(expr
, undefined
, implied
);
729 if (right
.value
== 0) {
733 return sval_binop(left
, '%', right
);
736 ret
= sval_binop(left
, expr
->op
, right
);
741 static int do_comparison(struct expression
*expr
)
743 struct range_list
*left_ranges
= NULL
;
744 struct range_list
*right_ranges
= NULL
;
745 int poss_true
, poss_false
;
748 type
= get_type(expr
);
750 get_implied_rl(expr
->left
, &left_ranges
);
751 get_implied_rl(expr
->right
, &right_ranges
);
752 left_ranges
= cast_rl(type
, left_ranges
);
753 right_ranges
= cast_rl(type
, right_ranges
);
755 poss_true
= possibly_true_rl(left_ranges
, expr
->op
, right_ranges
);
756 poss_false
= possibly_false_rl(left_ranges
, expr
->op
, right_ranges
);
758 free_rl(&left_ranges
);
759 free_rl(&right_ranges
);
761 if (!poss_true
&& !poss_false
)
763 if (poss_true
&& !poss_false
)
765 if (!poss_true
&& poss_false
)
770 static struct range_list
*handle_comparison_rl(struct expression
*expr
, int implied
)
775 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
776 struct data_range tmp_left
, tmp_right
;
780 tmp_right
.min
= right
;
781 tmp_right
.max
= right
;
782 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
787 if (implied
== EXACT
)
790 res
= do_comparison(expr
);
796 return alloc_rl(zero
, one
);
799 static sval_t
handle_comparison(struct expression
*expr
, int *undefined
, int implied
)
804 if (get_value(expr
->left
, &left
) && get_value(expr
->right
, &right
)) {
805 struct data_range tmp_left
, tmp_right
;
809 tmp_right
.min
= right
;
810 tmp_right
.max
= right
;
811 if (true_comparison_range(&tmp_left
, expr
->op
, &tmp_right
))
816 if (implied
== EXACT
) {
821 res
= do_comparison(expr
);
827 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
829 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
836 static struct range_list
*handle_logical_rl(struct expression
*expr
, int implied
)
842 if (implied
== EXACT
) {
843 if (get_value(expr
->left
, &left
))
845 if (get_value(expr
->right
, &right
))
848 if (get_implied_value(expr
->left
, &left
))
850 if (get_implied_value(expr
->right
, &right
))
855 case SPECIAL_LOGICAL_OR
:
856 if (left_known
&& left
.value
)
858 if (right_known
&& right
.value
)
860 if (left_known
&& right_known
)
863 case SPECIAL_LOGICAL_AND
:
864 if (left_known
&& right_known
) {
865 if (left
.value
&& right
.value
)
874 if (implied
== EXACT
)
877 return alloc_rl(zero
, one
);
880 static sval_t
handle_logical(struct expression
*expr
, int *undefined
, int implied
)
886 if (implied
== EXACT
) {
887 if (get_value(expr
->left
, &left
))
889 if (get_value(expr
->right
, &right
))
892 if (get_implied_value(expr
->left
, &left
))
894 if (get_implied_value(expr
->right
, &right
))
899 case SPECIAL_LOGICAL_OR
:
900 if (left_known
&& left
.value
)
902 if (right_known
&& right
.value
)
904 if (left_known
&& right_known
)
907 case SPECIAL_LOGICAL_AND
:
908 if (left_known
&& right_known
) {
909 if (left
.value
&& right
.value
)
919 if (implied
== IMPLIED_MIN
|| implied
== FUZZY_MIN
|| implied
== ABSOLUTE_MIN
)
921 if (implied
== IMPLIED_MAX
|| implied
== FUZZY_MAX
|| implied
== ABSOLUTE_MAX
)
928 static struct range_list
*handle_conditional_rl(struct expression
*expr
, int implied
)
930 struct range_list
*true_rl
, *false_rl
;
932 int final_pass_orig
= final_pass
;
934 if (known_condition_true(expr
->conditional
))
935 return _get_rl(expr
->cond_true
, implied
);
936 if (known_condition_false(expr
->conditional
))
937 return _get_rl(expr
->cond_false
, implied
);
939 if (implied
== EXACT
)
942 if (implied_condition_true(expr
->conditional
))
943 return _get_rl(expr
->cond_true
, implied
);
944 if (implied_condition_false(expr
->conditional
))
945 return _get_rl(expr
->cond_false
, implied
);
947 type
= get_type(expr
);
949 __push_fake_cur_slist();
951 __split_whole_condition(expr
);
952 true_rl
= _get_rl(expr
->cond_true
, implied
);
953 __push_true_states();
954 __use_false_states();
955 false_rl
= _get_rl(expr
->cond_false
, implied
);
956 __merge_true_states();
957 __pop_fake_cur_slist();
958 final_pass
= final_pass_orig
;
960 if (!true_rl
|| !false_rl
)
962 true_rl
= cast_rl(type
, true_rl
);
963 false_rl
= cast_rl(type
, false_rl
);
965 return rl_union(true_rl
, false_rl
);
968 static sval_t
handle_conditional(struct expression
*expr
, int *undefined
, int implied
)
970 if (known_condition_true(expr
->conditional
))
971 return _get_value(expr
->cond_true
, undefined
, implied
);
972 if (known_condition_false(expr
->conditional
))
973 return _get_value(expr
->cond_false
, undefined
, implied
);
975 if (implied
== EXACT
) {
980 if (implied_condition_true(expr
->conditional
))
981 return _get_value(expr
->cond_true
, undefined
, implied
);
982 if (implied_condition_false(expr
->conditional
))
983 return _get_value(expr
->cond_false
, undefined
, implied
);
989 static int get_local_value(struct expression
*expr
, sval_t
*sval
, int implied
)
998 return get_local_min_helper(expr
, sval
);
1003 return get_local_max_helper(expr
, sval
);
1008 static int get_implied_value_helper(struct expression
*expr
, sval_t
*sval
, int implied
)
1010 struct smatch_state
*state
;
1014 /* fixme: this should return the casted value */
1016 expr
= strip_expr(expr
);
1018 if (get_value(expr
, sval
))
1021 name
= expr_to_var_sym(expr
, &sym
);
1024 *sval
= sval_blank(expr
);
1025 state
= get_state(SMATCH_EXTRA
, name
, sym
);
1027 if (!state
|| !state
->data
)
1028 return get_local_value(expr
, sval
, implied
);
1029 if (implied
== IMPLIED
) {
1030 if (estate_get_single_value(state
, sval
))
1034 if (implied
== HARD_MAX
) {
1035 if (estate_get_hard_max(state
, sval
))
1039 if (implied
== IMPLIED_MAX
|| implied
== ABSOLUTE_MAX
) {
1040 *sval
= estate_max(state
);
1043 *sval
= estate_min(state
);
1047 static int get_fuzzy_max_helper(struct expression
*expr
, sval_t
*max
)
1049 struct sm_state
*sm
;
1050 struct sm_state
*tmp
;
1053 if (get_hard_max(expr
, &sval
)) {
1058 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
1062 sval
= sval_type_min(estate_type(sm
->state
));
1063 FOR_EACH_PTR(sm
->possible
, tmp
) {
1066 new_min
= estate_min(tmp
->state
);
1067 if (sval_cmp(new_min
, sval
) > 0)
1069 } END_FOR_EACH_PTR(tmp
);
1071 if (sval_is_min(sval
))
1073 if (sval
.value
== sval_type_min(sval
.type
).value
+ 1) /* it's common to be on off */
1076 *max
= sval_cast(get_type(expr
), sval
);
1080 static int get_fuzzy_min_helper(struct expression
*expr
, sval_t
*min
)
1082 struct sm_state
*sm
;
1083 struct sm_state
*tmp
;
1086 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
1090 if (!sval_is_min(estate_min(sm
->state
))) {
1091 *min
= estate_min(sm
->state
);
1095 sval
= sval_type_max(estate_type(sm
->state
));
1096 FOR_EACH_PTR(sm
->possible
, tmp
) {
1099 new_max
= estate_max(tmp
->state
);
1100 if (sval_cmp(new_max
, sval
) < 0)
1102 } END_FOR_EACH_PTR(tmp
);
1104 if (sval_is_max(sval
))
1106 *min
= sval_cast(get_type(expr
), sval
);
1110 static int get_const_value(struct expression
*expr
, sval_t
*sval
)
1115 if (expr
->type
!= EXPR_SYMBOL
|| !expr
->symbol
)
1118 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
1120 if (get_value(sym
->initializer
, &right
)) {
1121 *sval
= sval_cast(get_type(expr
), right
);
1127 static struct range_list
*handle_variable(struct expression
*expr
, int implied
)
1129 struct smatch_state
*state
;
1130 struct range_list
*rl
;
1131 sval_t sval
, min
, max
;
1133 if (get_const_value(expr
, &sval
))
1134 return alloc_rl(sval
, sval
);
1136 switch (implied_to_rl_enum(implied
)) {
1142 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1143 if (!state
|| !state
->data
) {
1144 if (get_local_rl(expr
, &rl
))
1148 if (implied
== HARD_MAX
&& !estate_has_hard_max(state
))
1150 return estate_rl(state
);
1152 if (!get_fuzzy_min_helper(expr
, &min
))
1153 min
= sval_type_min(get_type(expr
));
1154 if (!get_fuzzy_max_helper(expr
, &max
))
1156 return alloc_rl(min
, max
);
1161 static sval_t
_get_implied_value(struct expression
*expr
, int *undefined
, int implied
)
1165 ret
= sval_blank(expr
);
1174 if (!get_implied_value_helper(expr
, &ret
, implied
))
1178 if (!get_fuzzy_max_helper(expr
, &ret
))
1182 if (!get_fuzzy_min_helper(expr
, &ret
))
1191 static sval_t
handle_sizeof(struct expression
*expr
)
1196 ret
= sval_blank(expr
);
1197 sym
= expr
->cast_type
;
1199 sym
= evaluate_expression(expr
->cast_expression
);
1201 * Expressions of restricted types will possibly get
1202 * promoted - check that here
1204 if (is_restricted_type(sym
)) {
1205 if (sym
->bit_size
< bits_in_int
)
1207 } else if (is_fouled_type(sym
)) {
1211 examine_symbol_type(sym
);
1213 ret
.type
= size_t_ctype
;
1214 if (sym
->bit_size
<= 0) /* sizeof(void) */ {
1215 if (get_real_base_type(sym
) == &void_ctype
)
1220 ret
.value
= bits_to_bytes(sym
->bit_size
);
1225 static struct range_list
*handle_call_rl(struct expression
*expr
, int implied
)
1227 struct range_list
*rl
;
1229 if (implied
== EXACT
)
1232 if (get_implied_return(expr
, &rl
))
1234 return db_return_vals(expr
);
1237 static sval_t
handle_call(struct expression
*expr
, int *undefined
, int implied
)
1239 struct range_list
*rl
;
1241 if (!get_implied_rl(expr
, &rl
)) {
1248 if (sval_cmp(rl_min(rl
), rl_max(rl
)) == 0)
1267 static struct range_list
*_get_rl(struct expression
*expr
, int implied
)
1269 struct range_list
*rl
;
1270 struct symbol
*type
;
1274 expr
= strip_parens(expr
);
1277 type
= get_type(expr
);
1280 switch (expr
->type
) {
1282 sval
= sval_from_val(expr
, expr
->value
);
1285 rl
= handle_preop_rl(expr
, implied
);
1291 return _get_rl(expr
->unop
, implied
);
1293 case EXPR_FORCE_CAST
:
1294 case EXPR_IMPLIED_CAST
:
1295 rl
= _get_rl(expr
->cast_expression
, implied
);
1299 return cast_rl(type
, rl
);
1302 rl
= handle_binop_rl(expr
, implied
);
1308 rl
= handle_comparison_rl(expr
, implied
);
1314 rl
= handle_logical_rl(expr
, implied
);
1319 case EXPR_PTRSIZEOF
:
1321 sval
= handle_sizeof(expr
);
1324 case EXPR_CONDITIONAL
:
1325 rl
= handle_conditional_rl(expr
, implied
);
1331 rl
= handle_call_rl(expr
, implied
);
1338 rl
= handle_variable(expr
, implied
);
1345 if (undefined
&& type
&&
1346 (implied
== ABSOLUTE_MAX
|| implied
== ABSOLUTE_MIN
))
1347 return alloc_whole_rl(type
);
1350 rl
= alloc_rl(sval
, sval
);
1354 static sval_t
_get_value(struct expression
*expr
, int *undefined
, int implied
)
1356 struct symbol
*type
;
1366 expr
= strip_parens(expr
);
1367 type
= get_type(expr
);
1369 switch (expr
->type
) {
1371 ret
= sval_from_val(expr
, expr
->value
);
1374 ret
= handle_preop(expr
, undefined
, implied
);
1377 ret
= _get_value(expr
->unop
, undefined
, implied
);
1380 case EXPR_FORCE_CAST
:
1381 case EXPR_IMPLIED_CAST
:
1382 ret
= _get_value(expr
->cast_expression
, undefined
, implied
);
1383 ret
= sval_cast(type
, ret
);
1386 ret
= handle_binop(expr
, undefined
, implied
);
1389 ret
= handle_comparison(expr
, undefined
, implied
);
1392 ret
= handle_logical(expr
, undefined
, implied
);
1394 case EXPR_PTRSIZEOF
:
1396 ret
= handle_sizeof(expr
);
1399 if (get_const_value(expr
, &ret
)) {
1402 ret
= _get_implied_value(expr
, undefined
, implied
);
1405 case EXPR_CONDITIONAL
:
1406 ret
= handle_conditional(expr
, undefined
, implied
);
1409 ret
= handle_call(expr
, undefined
, implied
);
1412 ret
= _get_implied_value(expr
, undefined
, implied
);
1420 /* returns 1 if it can get a value literal or else returns 0 */
1421 int get_value(struct expression
*expr
, sval_t
*sval
)
1423 struct range_list
*rl
;
1425 rl
= _get_rl(expr
, EXACT
);
1426 if (!rl_to_sval(rl
, sval
))
1431 int get_implied_value(struct expression
*expr
, sval_t
*sval
)
1433 struct range_list
*rl
;
1435 rl
= _get_rl(expr
, IMPLIED
);
1436 if (!rl_to_sval(rl
, sval
))
1441 int get_implied_min(struct expression
*expr
, sval_t
*sval
)
1443 struct range_list
*rl
;
1445 rl
= _get_rl(expr
, IMPLIED_MIN
);
1452 int get_implied_max(struct expression
*expr
, sval_t
*sval
)
1454 struct range_list
*rl
;
1456 rl
= _get_rl(expr
, IMPLIED_MAX
);
1463 int get_implied_rl(struct expression
*expr
, struct range_list
**rl
)
1466 struct smatch_state
*state
;
1473 expr
= strip_parens(expr
);
1477 state
= get_state_expr(SMATCH_EXTRA
, expr
);
1479 *rl
= clone_rl(estate_rl(state
));
1483 if (expr
->type
== EXPR_CALL
) {
1484 if (get_implied_return(expr
, rl
))
1486 *rl
= db_return_vals(expr
);
1492 if (get_implied_value(expr
, &sval
)) {
1493 add_range(rl
, sval
, sval
);
1497 if (get_local_rl(expr
, rl
))
1500 min_known
= get_implied_min(expr
, &min
);
1501 max_known
= get_implied_max(expr
, &max
);
1502 if (!min_known
&& !max_known
)
1505 get_absolute_min(expr
, &min
);
1507 get_absolute_max(expr
, &max
);
1509 *rl
= alloc_rl(min
, max
);
1513 int get_hard_max(struct expression
*expr
, sval_t
*sval
)
1515 struct range_list
*rl
;
1517 rl
= _get_rl(expr
, HARD_MAX
);
1524 int get_fuzzy_min(struct expression
*expr
, sval_t
*sval
)
1526 struct range_list
*rl
;
1528 rl
= _get_rl(expr
, FUZZY_MIN
);
1535 int get_fuzzy_max(struct expression
*expr
, sval_t
*sval
)
1537 struct range_list
*rl
;
1540 rl
= _get_rl(expr
, FUZZY_MAX
);
1544 if (max
.uvalue
> INT_MAX
- 10000)
1550 int get_absolute_min(struct expression
*expr
, sval_t
*sval
)
1552 struct range_list
*rl
;
1553 struct symbol
*type
;
1555 type
= get_type(expr
);
1557 type
= &llong_ctype
; // FIXME: this is wrong but places assume get type can't fail.
1558 rl
= _get_rl(expr
, ABSOLUTE_MIN
);
1562 *sval
= sval_type_min(type
);
1564 if (sval_cmp(*sval
, sval_type_min(type
)) < 0)
1565 *sval
= sval_type_min(type
);
1569 int get_absolute_max(struct expression
*expr
, sval_t
*sval
)
1571 struct range_list
*rl
;
1572 struct symbol
*type
;
1574 type
= get_type(expr
);
1576 type
= &llong_ctype
;
1577 rl
= _get_rl(expr
, ABSOLUTE_MAX
);
1581 *sval
= sval_type_max(type
);
1583 if (sval_cmp(sval_type_max(type
), *sval
) < 0)
1584 *sval
= sval_type_max(type
);
1588 int known_condition_true(struct expression
*expr
)
1595 if (get_value(expr
, &tmp
) && tmp
.value
)
1601 int known_condition_false(struct expression
*expr
)
1609 if (expr
->type
== EXPR_CALL
) {
1610 if (sym_name_is("__builtin_constant_p", expr
->fn
))
1616 int implied_condition_true(struct expression
*expr
)
1623 if (known_condition_true(expr
))
1625 if (get_implied_value(expr
, &tmp
) && tmp
.value
)
1628 if (expr
->type
== EXPR_POSTOP
)
1629 return implied_condition_true(expr
->unop
);
1631 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_DECREMENT
)
1632 return implied_not_equal(expr
->unop
, 1);
1633 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_INCREMENT
)
1634 return implied_not_equal(expr
->unop
, -1);
1636 expr
= strip_expr(expr
);
1637 switch (expr
->type
) {
1639 if (do_comparison(expr
) == 1)
1643 if (expr
->op
== '!') {
1644 if (implied_condition_false(expr
->unop
))
1650 if (implied_not_equal(expr
, 0) == 1)
1657 int implied_condition_false(struct expression
*expr
)
1659 struct expression
*tmp
;
1665 if (known_condition_false(expr
))
1668 switch (expr
->type
) {
1670 if (do_comparison(expr
) == 2)
1673 if (expr
->op
== '!') {
1674 if (implied_condition_true(expr
->unop
))
1678 tmp
= strip_expr(expr
);
1680 return implied_condition_false(tmp
);
1683 if (get_implied_value(expr
, &sval
) && sval
.value
== 0)