664
665 if (!left_orig && !right_orig)
666 return;
667 if (left_orig && right_orig)
668 return;
669
670 if (left_orig) {
671 set_true_false_states_expr(my_id, expr->left,
672 expr->op == SPECIAL_EQUAL ? alloc_estate_empty() : NULL,
673 expr->op == SPECIAL_EQUAL ? NULL : alloc_estate_empty());
674 } else {
675 set_true_false_states_expr(my_id, expr->right,
676 expr->op == SPECIAL_EQUAL ? alloc_estate_empty() : NULL,
677 expr->op == SPECIAL_EQUAL ? NULL : alloc_estate_empty());
678 }
679 }
680
681 static struct range_list *strip_negatives(struct range_list *rl)
682 {
683 sval_t min = rl_min(rl);
684 sval_t minus_one = { .type = rl_type(rl), .value = -1 };
685 sval_t over = { .type = rl_type(rl), .value = INT_MAX + 1ULL };
686 sval_t max = sval_type_max(rl_type(rl));
687
688 if (!rl)
689 return NULL;
690
691 if (type_unsigned(rl_type(rl)) && type_bits(rl_type(rl)) > 31)
692 return remove_range(rl, over, max);
693
694 return remove_range(rl, min, minus_one);
695 }
696
697 static void handle_compare(struct expression *expr)
698 {
699 struct expression *left, *right;
700 struct range_list *left_rl = NULL;
701 struct range_list *right_rl = NULL;
702 struct range_list *user_rl;
703 struct smatch_state *capped_state;
704 struct smatch_state *left_true = NULL;
705 struct smatch_state *left_false = NULL;
706 struct smatch_state *right_true = NULL;
707 struct smatch_state *right_false = NULL;
|
664
665 if (!left_orig && !right_orig)
666 return;
667 if (left_orig && right_orig)
668 return;
669
670 if (left_orig) {
671 set_true_false_states_expr(my_id, expr->left,
672 expr->op == SPECIAL_EQUAL ? alloc_estate_empty() : NULL,
673 expr->op == SPECIAL_EQUAL ? NULL : alloc_estate_empty());
674 } else {
675 set_true_false_states_expr(my_id, expr->right,
676 expr->op == SPECIAL_EQUAL ? alloc_estate_empty() : NULL,
677 expr->op == SPECIAL_EQUAL ? NULL : alloc_estate_empty());
678 }
679 }
680
681 static struct range_list *strip_negatives(struct range_list *rl)
682 {
683 sval_t min = rl_min(rl);
684 sval_t minus_one;
685 sval_t over;
686 sval_t max = sval_type_max(rl_type(rl));
687
688 minus_one.type = rl_type(rl);
689 minus_one.value = -1;
690 over.type = rl_type(rl);
691 over.value = INT_MAX + 1ULL;
692
693 if (!rl)
694 return NULL;
695
696 if (type_unsigned(rl_type(rl)) && type_bits(rl_type(rl)) > 31)
697 return remove_range(rl, over, max);
698
699 return remove_range(rl, min, minus_one);
700 }
701
702 static void handle_compare(struct expression *expr)
703 {
704 struct expression *left, *right;
705 struct range_list *left_rl = NULL;
706 struct range_list *right_rl = NULL;
707 struct range_list *user_rl;
708 struct smatch_state *capped_state;
709 struct smatch_state *left_true = NULL;
710 struct smatch_state *left_false = NULL;
711 struct smatch_state *right_true = NULL;
712 struct smatch_state *right_false = NULL;
|