extra, modification_hooks: set "*p" to unknown if we call "function(p)"
[smatch.git] / smatch_math.c
blob0c52edf45d8a9f9ec7b79104ec5c1c2a692b63d3
1 /*
2 * smatch/smatch_math.c
4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 #include "smatch.h"
11 #include "smatch_slist.h"
12 #include "smatch_extra.h"
14 static sval_t _get_value(struct expression *expr, int *undefined, int implied);
15 static sval_t _get_implied_value(struct expression *expr, int *undefined, int implied);
17 #define BOGUS 12345
19 static sval_t zero = {.type = &int_ctype, .value = 0};
20 static sval_t one = {.type = &int_ctype, .value = 1};
21 static sval_t bogus = {.type = &int_ctype, .value = BOGUS};
23 enum {
24 NOTIMPLIED,
25 IMPLIED,
26 IMPLIED_MIN,
27 IMPLIED_MAX,
28 FUZZY_MAX,
29 FUZZY_MIN,
30 ABSOLUTE_MIN,
31 ABSOLUTE_MAX,
32 HARD_MAX,
35 static int opposite_implied(int implied)
37 if (implied == IMPLIED_MIN)
38 return IMPLIED_MAX;
39 if (implied == IMPLIED_MAX)
40 return IMPLIED_MIN;
41 if (implied == FUZZY_MIN)
42 return FUZZY_MAX;
43 if (implied == FUZZY_MAX)
44 return FUZZY_MIN;
45 if (implied == ABSOLUTE_MIN)
46 return ABSOLUTE_MAX;
47 if (implied == ABSOLUTE_MAX)
48 return ABSOLUTE_MIN;
50 return implied;
53 static int last_stmt_sval(struct statement *stmt, sval_t *sval)
55 struct expression *expr;
57 if (!stmt)
58 return 0;
60 stmt = last_ptr_list((struct ptr_list *)stmt->stmts);
61 if (stmt->type != STMT_EXPRESSION)
62 return 0;
63 expr = stmt->expression;
64 if (!get_value(expr, sval))
65 return 0;
66 return 1;
69 static sval_t handle_expression_statement(struct expression *expr, int *undefined, int implied)
71 struct statement *stmt;
72 sval_t ret;
74 stmt = get_expression_statement(expr);
75 if (!last_stmt_sval(stmt, &ret)) {
76 *undefined = 1;
77 ret = bogus;
80 return ret;
83 static sval_t handle_ampersand(int *undefined, int implied)
85 sval_t ret;
87 ret.type = &ptr_ctype;
88 ret.value = BOGUS;
90 if (implied == IMPLIED_MIN || implied == FUZZY_MIN || implied == ABSOLUTE_MIN)
91 return valid_ptr_min_sval;
92 if (implied == IMPLIED_MAX || implied == FUZZY_MAX || implied == ABSOLUTE_MAX)
93 return valid_ptr_max_sval;
95 *undefined = 1;
96 return ret;
99 static sval_t handle_negate(struct expression *expr, int *undefined, int implied)
101 sval_t ret;
103 ret = sval_blank(expr->unop);
105 if (known_condition_true(expr->unop)) {
106 ret.value = 0;
107 return ret;
110 if (implied == NOTIMPLIED) {
111 *undefined = 1;
112 return bogus;
115 if (implied_condition_true(expr->unop)) {
116 ret.value = 0;
117 return ret;
119 if (implied_condition_false(expr->unop)) {
120 ret.value = 1;
121 return ret;
123 if (implied == IMPLIED_MIN || implied == FUZZY_MIN || implied == ABSOLUTE_MIN) {
124 ret.value = 0;
125 return ret;
127 if (implied == IMPLIED_MAX || implied == FUZZY_MAX || implied == ABSOLUTE_MAX) {
128 ret.value = 1;
129 return ret;
131 *undefined = 1;
132 return bogus;
135 static sval_t handle_preop(struct expression *expr, int *undefined, int implied)
137 sval_t ret;
139 switch (expr->op) {
140 case '&':
141 ret = handle_ampersand(undefined, implied);
142 break;
143 case '!':
144 ret = handle_negate(expr, undefined, implied);
145 break;
146 case '~':
147 ret = _get_value(expr->unop, undefined, implied);
148 ret = sval_preop(ret, '~');
149 ret = sval_cast(get_type(expr->unop), ret);
150 break;
151 case '-':
152 ret = _get_value(expr->unop, undefined, implied);
153 ret = sval_preop(ret, '-');
154 break;
155 case '*':
156 ret = _get_implied_value(expr, undefined, implied);
157 break;
158 case '(':
159 ret = handle_expression_statement(expr, undefined, implied);
160 break;
161 default:
162 *undefined = 1;
163 ret = sval_blank(expr);
165 ret = sval_cast(get_type(expr), ret);
166 return ret;
169 static sval_t handle_divide(struct expression *expr, int *undefined, int implied)
171 sval_t left, right;
173 left = _get_value(expr->left, undefined, implied);
174 right = _get_value(expr->right, undefined, opposite_implied(implied));
176 if (right.value == 0) {
177 *undefined = 1;
178 return bogus;
181 return sval_binop(left, '/', right);
184 static sval_t handle_subtract(struct expression *expr, int *undefined, int implied)
186 sval_t left, right;
188 left = _get_value(expr->left, undefined, implied);
189 right = _get_value(expr->right, undefined, opposite_implied(implied));
191 return sval_binop(left, '-', right);
194 static sval_t handle_mod(struct expression *expr, int *undefined, int implied)
196 sval_t left, right;
198 /* if we can't figure out the right side it's probably hopeless */
199 right = _get_value(expr->right, undefined, implied);
200 if (*undefined || right.value == 0)
201 return bogus;
203 left = _get_value(expr->left, undefined, implied);
204 if (!*undefined)
205 return sval_binop(left, '%', right);
207 switch (implied) {
208 case NOTIMPLIED:
209 case IMPLIED:
210 return bogus;
211 case IMPLIED_MIN:
212 case FUZZY_MIN:
213 case ABSOLUTE_MIN:
214 *undefined = 0;
215 return sval_type_val(get_type(expr->left), 0);
216 case IMPLIED_MAX:
217 case FUZZY_MAX:
218 case ABSOLUTE_MAX:
219 *undefined = 0;
220 right = sval_cast(get_type(expr), right);
221 right.value--;
222 return right;
224 return bogus;
227 static sval_t handle_binop(struct expression *expr, int *undefined, int implied)
229 struct symbol *type;
230 sval_t left, right;
231 sval_t ret = {.type = &int_ctype, .value = 123456};
232 int local_undef = 0;
234 switch (expr->op) {
235 case '%':
236 return handle_mod(expr, undefined, implied);
237 case '&':
238 left = _get_value(expr->left, &local_undef, implied);
239 if (local_undef) {
240 if (implied == IMPLIED_MIN || implied == ABSOLUTE_MIN) {
241 ret = sval_blank(expr->left);
242 ret.value = 0;
243 return ret;
245 if (implied != IMPLIED_MAX && implied != ABSOLUTE_MAX)
246 *undefined = 1;
247 if (!get_absolute_max(expr->left, &left))
248 *undefined = 1;
250 right = _get_value(expr->right, undefined, implied);
251 if (*undefined)
252 return bogus;
253 return sval_binop(left, '&', right);
255 case SPECIAL_RIGHTSHIFT:
256 left = _get_value(expr->left, &local_undef, implied);
257 if (local_undef) {
258 if (implied == IMPLIED_MIN || implied == ABSOLUTE_MIN) {
259 ret = sval_blank(expr->left);
260 ret.value = 0;
261 return ret;
263 if (implied != IMPLIED_MAX && implied != ABSOLUTE_MAX)
264 *undefined = 1;
265 if (!get_absolute_max(expr->left, &left))
266 *undefined = 1;
268 right = _get_value(expr->right, undefined, implied);
269 if (*undefined)
270 return bogus;
271 return sval_binop(left, SPECIAL_RIGHTSHIFT, right);
274 left = _get_value(expr->left, undefined, implied);
275 right = _get_value(expr->right, undefined, implied);
277 if (*undefined)
278 return bogus;
280 type = get_type(expr);
281 left = sval_cast(type, left);
282 right = sval_cast(type, right);
284 switch (implied) {
285 case IMPLIED_MAX:
286 case ABSOLUTE_MAX:
287 if (sval_binop_overflows(left, expr->op, right))
288 return sval_type_max(get_type(expr));
289 break;
290 case HARD_MAX:
291 case FUZZY_MAX:
292 if (sval_binop_overflows(left, expr->op, right)) {
293 *undefined = 1;
294 return bogus;
298 switch (expr->op) {
299 case '/':
300 return handle_divide(expr, undefined, implied);
301 case '%':
302 if (right.value == 0) {
303 *undefined = 1;
304 return bogus;
305 } else {
306 return sval_binop(left, '%', right);
308 case '-':
309 ret = handle_subtract(expr, undefined, implied);
310 break;
311 default:
312 ret = sval_binop(left, expr->op, right);
314 return ret;
317 static int do_comparison(struct expression *expr)
319 struct range_list *left_ranges = NULL;
320 struct range_list *right_ranges = NULL;
321 int poss_true, poss_false;
323 get_implied_rl(expr->left, &left_ranges);
324 get_implied_rl(expr->right, &right_ranges);
326 poss_true = possibly_true_rl(left_ranges, expr->op, right_ranges);
327 poss_false = possibly_false_rl(left_ranges, expr->op, right_ranges);
329 free_rl(&left_ranges);
330 free_rl(&right_ranges);
332 if (!poss_true && !poss_false)
333 return 0;
334 if (poss_true && !poss_false)
335 return 1;
336 if (!poss_true && poss_false)
337 return 2;
338 return 3;
341 static sval_t handle_comparison(struct expression *expr, int *undefined, int implied)
343 sval_t left, right;
344 int res;
346 if (get_value(expr->left, &left) && get_value(expr->right, &right)) {
347 struct data_range tmp_left, tmp_right;
349 tmp_left.min = left;
350 tmp_left.max = left;
351 tmp_right.min = right;
352 tmp_right.max = right;
353 if (true_comparison_range(&tmp_left, expr->op, &tmp_right))
354 return one;
355 return zero;
358 if (implied == NOTIMPLIED) {
359 *undefined = 1;
360 return bogus;
363 res = do_comparison(expr);
364 if (res == 1)
365 return one;
366 if (res == 2)
367 return zero;
369 if (implied == IMPLIED_MIN || implied == FUZZY_MIN || implied == ABSOLUTE_MIN)
370 return zero;
371 if (implied == IMPLIED_MAX || implied == FUZZY_MAX || implied == ABSOLUTE_MAX)
372 return one;
374 *undefined = 1;
375 return bogus;
378 static sval_t handle_logical(struct expression *expr, int *undefined, int implied)
380 sval_t left, right;
381 int left_known = 0;
382 int right_known = 0;
384 if (implied == NOTIMPLIED) {
385 if (get_value(expr->left, &left))
386 left_known = 1;
387 if (get_value(expr->right, &right))
388 right_known = 1;
389 } else {
390 if (get_implied_value(expr->left, &left))
391 left_known = 1;
392 if (get_implied_value(expr->right, &right))
393 right_known = 1;
396 switch (expr->op) {
397 case SPECIAL_LOGICAL_OR:
398 if (left_known && left.value)
399 return one;
400 if (right_known && right.value)
401 return one;
402 if (left_known && right_known)
403 return zero;
404 break;
405 case SPECIAL_LOGICAL_AND:
406 if (left_known && right_known) {
407 if (left.value && right.value)
408 return one;
409 return zero;
411 break;
412 default:
413 *undefined = 1;
414 return bogus;
417 if (implied == IMPLIED_MIN || implied == FUZZY_MIN || implied == ABSOLUTE_MIN)
418 return zero;
419 if (implied == IMPLIED_MAX || implied == FUZZY_MAX || implied == ABSOLUTE_MAX)
420 return one;
422 *undefined = 1;
423 return bogus;
426 static sval_t handle_conditional(struct expression *expr, int *undefined, int implied)
428 if (known_condition_true(expr->conditional))
429 return _get_value(expr->cond_true, undefined, implied);
430 if (known_condition_false(expr->conditional))
431 return _get_value(expr->cond_false, undefined, implied);
433 if (implied == NOTIMPLIED) {
434 *undefined = 1;
435 return bogus;
438 if (implied_condition_true(expr->conditional))
439 return _get_value(expr->cond_true, undefined, implied);
440 if (implied_condition_false(expr->conditional))
441 return _get_value(expr->cond_false, undefined, implied);
443 *undefined = 1;
444 return bogus;
447 static int get_implied_value_helper(struct expression *expr, sval_t *sval, int implied)
449 struct smatch_state *state;
450 struct symbol *sym;
451 char *name;
453 /* fixme: this should return the casted value */
455 expr = strip_expr(expr);
457 if (get_value(expr, sval))
458 return 1;
460 name = expr_to_var_sym(expr, &sym);
461 if (!name)
462 return 0;
463 *sval = sval_blank(expr);
464 state = get_state(SMATCH_EXTRA, name, sym);
465 free_string(name);
466 if (!state || !state->data)
467 return 0;
468 if (implied == IMPLIED) {
469 if (estate_get_single_value(state, sval))
470 return 1;
471 return 0;
473 if (implied == HARD_MAX) {
474 if (estate_get_hard_max(state, sval))
475 return 1;
476 return 0;
478 if (implied == IMPLIED_MAX) {
479 *sval = estate_max(state);
480 if (sval_is_max(*sval)) /* this means just guessing. fixme. not really */
481 return 0;
482 return 1;
484 *sval = estate_min(state);
485 if (sval_is_min(*sval)) /* fixme */
486 return 0;
487 return 1;
490 static int get_fuzzy_max_helper(struct expression *expr, sval_t *max)
492 struct sm_state *sm;
493 struct sm_state *tmp;
494 sval_t sval;
496 if (get_hard_max(expr, &sval)) {
497 *max = sval;
498 return 1;
501 sm = get_sm_state_expr(SMATCH_EXTRA, expr);
502 if (!sm)
503 return 0;
505 sval = sval_type_min(estate_type(sm->state));
506 FOR_EACH_PTR(sm->possible, tmp) {
507 sval_t new_min;
509 new_min = estate_min(tmp->state);
510 if (sval_cmp(new_min, sval) > 0)
511 sval = new_min;
512 } END_FOR_EACH_PTR(tmp);
514 if (sval_is_min(sval))
515 return 0;
516 if (sval.value == sval_type_min(sval.type).value + 1) /* it's common to be on off */
517 return 0;
519 *max = sval_cast(get_type(expr), sval);
520 return 1;
523 static int get_fuzzy_min_helper(struct expression *expr, sval_t *min)
525 struct sm_state *sm;
526 struct sm_state *tmp;
527 sval_t sval;
529 if (get_implied_min(expr, min))
530 return 1;
532 sm = get_sm_state_expr(SMATCH_EXTRA, expr);
533 if (!sm)
534 return 0;
536 sval = sval_type_max(estate_type(sm->state));
537 FOR_EACH_PTR(sm->possible, tmp) {
538 sval_t new_max;
540 new_max = estate_max(tmp->state);
541 if (sval_cmp(new_max, sval) < 0)
542 sval = new_max;
543 } END_FOR_EACH_PTR(tmp);
545 if (sval_is_max(sval))
546 return 0;
547 *min = sval_cast(get_type(expr), sval);
548 return 1;
551 static sval_t _get_implied_value(struct expression *expr, int *undefined, int implied)
553 sval_t ret;
555 ret = sval_blank(expr);
557 switch (implied) {
558 case IMPLIED:
559 case IMPLIED_MAX:
560 case IMPLIED_MIN:
561 case HARD_MAX:
562 if (!get_implied_value_helper(expr, &ret, implied))
563 *undefined = 1;
564 break;
565 case ABSOLUTE_MIN:
566 if (!get_absolute_min_helper(expr, &ret))
567 *undefined = 1;
568 break;
569 case ABSOLUTE_MAX:
570 if (!get_absolute_max_helper(expr, &ret))
571 *undefined = 1;
572 break;
573 case FUZZY_MAX:
574 if (!get_fuzzy_max_helper(expr, &ret))
575 *undefined = 1;
576 break;
577 case FUZZY_MIN:
578 if (!get_fuzzy_min_helper(expr, &ret))
579 *undefined = 1;
580 break;
581 default:
582 *undefined = 1;
584 return ret;
587 static int get_const_value(struct expression *expr, sval_t *sval)
589 struct symbol *sym;
590 sval_t right;
592 if (expr->type != EXPR_SYMBOL || !expr->symbol)
593 return 0;
594 sym = expr->symbol;
595 if (!(sym->ctype.modifiers & MOD_CONST))
596 return 0;
597 if (get_value(sym->initializer, &right)) {
598 *sval = sval_cast(get_type(expr), right);
599 return 1;
601 return 0;
604 static sval_t _get_value(struct expression *expr, int *undefined, int implied)
606 sval_t ret;
608 if (!expr) {
609 *undefined = 1;
610 return bogus;
612 if (*undefined)
613 return bogus;
615 expr = strip_parens(expr);
617 switch (expr->type) {
618 case EXPR_VALUE:
619 ret = sval_from_val(expr, expr->value);
620 break;
621 case EXPR_PREOP:
622 ret = handle_preop(expr, undefined, implied);
623 break;
624 case EXPR_POSTOP:
625 ret = _get_value(expr->unop, undefined, implied);
626 break;
627 case EXPR_CAST:
628 case EXPR_FORCE_CAST:
629 case EXPR_IMPLIED_CAST:
630 ret = _get_value(expr->cast_expression, undefined, implied);
631 ret = sval_cast(get_type(expr), ret);
632 break;
633 case EXPR_BINOP:
634 ret = handle_binop(expr, undefined, implied);
635 break;
636 case EXPR_COMPARE:
637 ret = handle_comparison(expr, undefined, implied);
638 break;
639 case EXPR_LOGICAL:
640 ret = handle_logical(expr, undefined, implied);
641 break;
642 case EXPR_PTRSIZEOF:
643 case EXPR_SIZEOF:
644 ret = sval_blank(expr);
645 ret.value = get_expression_value_nomod(expr);
646 break;
647 case EXPR_SYMBOL:
648 if (get_const_value(expr, &ret)) {
649 break;
651 ret = _get_implied_value(expr, undefined, implied);
652 break;
653 case EXPR_SELECT:
654 case EXPR_CONDITIONAL:
655 ret = handle_conditional(expr, undefined, implied);
656 break;
657 default:
658 ret = _get_implied_value(expr, undefined, implied);
660 if (*undefined)
661 return bogus;
662 return ret;
665 /* returns 1 if it can get a value literal or else returns 0 */
666 int get_value(struct expression *expr, sval_t *sval)
668 int undefined = 0;
669 sval_t ret;
671 ret = _get_value(expr, &undefined, NOTIMPLIED);
672 if (undefined)
673 return 0;
674 *sval = ret;
675 return 1;
678 int get_implied_value(struct expression *expr, sval_t *sval)
680 int undefined = 0;
681 sval_t ret;
683 ret = _get_value(expr, &undefined, IMPLIED);
684 if (undefined)
685 return 0;
686 *sval = ret;
687 return 1;
690 int get_implied_min(struct expression *expr, sval_t *sval)
692 int undefined = 0;
693 sval_t ret;
695 ret = _get_value(expr, &undefined, IMPLIED_MIN);
696 if (undefined)
697 return 0;
698 *sval = ret;
699 return 1;
702 int get_implied_max(struct expression *expr, sval_t *sval)
704 int undefined = 0;
705 sval_t ret;
707 ret = _get_value(expr, &undefined, IMPLIED_MAX);
708 if (undefined)
709 return 0;
710 *sval = ret;
711 return 1;
714 int get_implied_rl(struct expression *expr, struct range_list **rl)
716 sval_t sval;
717 struct smatch_state *state;
718 sval_t min, max;
719 int min_known = 0;
720 int max_known = 0;
722 *rl = NULL;
724 expr = strip_parens(expr);
725 if (!expr)
726 return 0;
728 state = get_state_expr(SMATCH_EXTRA, expr);
729 if (state) {
730 *rl = clone_rl(estate_rl(state));
731 return 1;
734 if (expr->type == EXPR_CALL) {
735 if (get_implied_return(expr, rl))
736 return 1;
737 *rl = db_return_vals(expr);
738 if (*rl)
739 return 1;
740 return 0;
743 if (get_implied_value(expr, &sval)) {
744 add_range(rl, sval, sval);
745 return 1;
748 min_known = get_implied_min(expr, &min);
749 max_known = get_implied_max(expr, &max);
750 if (!min_known && !max_known)
751 return 0;
752 if (!min_known)
753 get_absolute_min(expr, &min);
754 if (!max_known)
755 get_absolute_max(expr, &max);
757 *rl = alloc_rl(min, max);
758 return 1;
761 int get_hard_max(struct expression *expr, sval_t *sval)
763 int undefined = 0;
764 sval_t ret;
766 ret = _get_value(expr, &undefined, HARD_MAX);
767 if (undefined)
768 return 0;
769 *sval = ret;
770 return 1;
773 int get_fuzzy_min(struct expression *expr, sval_t *sval)
775 int undefined = 0;
776 sval_t ret;
778 ret = _get_value(expr, &undefined, FUZZY_MIN);
779 if (undefined)
780 return 0;
781 *sval = ret;
782 return 1;
785 int get_fuzzy_max(struct expression *expr, sval_t *sval)
787 int undefined = 0;
788 sval_t ret;
790 ret = _get_value(expr, &undefined, FUZZY_MAX);
791 if (undefined)
792 return 0;
793 *sval = ret;
794 return 1;
797 int get_absolute_min(struct expression *expr, sval_t *sval)
799 int undefined = 0;
800 struct symbol *type;
802 type = get_type(expr);
803 if (!type)
804 type = &llong_ctype; // FIXME: this is wrong but places assume get type can't fail.
805 *sval = _get_value(expr, &undefined, ABSOLUTE_MIN);
806 if (undefined) {
807 *sval = sval_type_min(type);
808 return 1;
811 if (sval_cmp(*sval, sval_type_min(type)) < 0)
812 *sval = sval_type_min(type);
813 return 1;
816 int get_absolute_max(struct expression *expr, sval_t *sval)
818 int undefined = 0;
819 struct symbol *type;
821 type = get_type(expr);
822 if (!type)
823 type = &llong_ctype;
824 *sval = _get_value(expr, &undefined, ABSOLUTE_MAX);
825 if (undefined) {
826 *sval = sval_type_max(type);
827 return 1;
830 if (sval_cmp(sval_type_max(type), *sval) < 0)
831 *sval = sval_type_max(type);
832 return 1;
835 int known_condition_true(struct expression *expr)
837 sval_t tmp;
839 if (!expr)
840 return 0;
842 if (get_value(expr, &tmp) && tmp.value)
843 return 1;
845 return 0;
848 int known_condition_false(struct expression *expr)
850 if (!expr)
851 return 0;
853 if (is_zero(expr))
854 return 1;
856 if (expr->type == EXPR_CALL) {
857 if (sym_name_is("__builtin_constant_p", expr->fn))
858 return 1;
860 return 0;
863 int implied_condition_true(struct expression *expr)
865 sval_t tmp;
867 if (!expr)
868 return 0;
870 if (known_condition_true(expr))
871 return 1;
872 if (get_implied_value(expr, &tmp) && tmp.value)
873 return 1;
875 if (expr->type == EXPR_POSTOP)
876 return implied_condition_true(expr->unop);
878 if (expr->type == EXPR_PREOP && expr->op == SPECIAL_DECREMENT)
879 return implied_not_equal(expr->unop, 1);
880 if (expr->type == EXPR_PREOP && expr->op == SPECIAL_INCREMENT)
881 return implied_not_equal(expr->unop, -1);
883 expr = strip_expr(expr);
884 switch (expr->type) {
885 case EXPR_COMPARE:
886 if (do_comparison(expr) == 1)
887 return 1;
888 break;
889 case EXPR_PREOP:
890 if (expr->op == '!') {
891 if (implied_condition_false(expr->unop))
892 return 1;
893 break;
895 break;
896 default:
897 if (implied_not_equal(expr, 0) == 1)
898 return 1;
899 break;
901 return 0;
904 int implied_condition_false(struct expression *expr)
906 struct expression *tmp;
907 sval_t sval;
909 if (!expr)
910 return 0;
912 if (known_condition_false(expr))
913 return 1;
915 switch (expr->type) {
916 case EXPR_COMPARE:
917 if (do_comparison(expr) == 2)
918 return 1;
919 case EXPR_PREOP:
920 if (expr->op == '!') {
921 if (implied_condition_true(expr->unop))
922 return 1;
923 break;
925 tmp = strip_expr(expr);
926 if (tmp != expr)
927 return implied_condition_false(tmp);
928 break;
929 default:
930 if (get_implied_value(expr, &sval) && sval.value == 0)
931 return 1;
932 break;
934 return 0;