4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 #include "smatch_slist.h"
12 #include "smatch_extra.h"
14 static long long _get_implied_value(struct expression
*expr
, int *undefined
, int implied
);
15 static long long _get_value(struct expression
*expr
, int *undefined
, int implied
);
26 static long long cast_to_type(struct expression
*expr
, long long val
)
28 struct symbol
*type
= get_type(expr
);
33 switch (type
->bit_size
) {
35 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
36 val
= (long long)(unsigned char) val
;
38 val
= (long long)(char) val
;
41 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
42 val
= (long long)(unsigned short) val
;
44 val
= (long long)(short) val
;
47 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
48 val
= (long long)(unsigned int) val
;
50 val
= (long long)(int) val
;
56 static int opposite_implied(int implied
)
58 if (implied
== IMPLIED_MIN
)
60 if (implied
== IMPLIED_MAX
)
65 static int last_stmt_val(struct statement
*stmt
, long long *val
)
67 struct expression
*expr
;
72 stmt
= last_ptr_list((struct ptr_list
*)stmt
->stmts
);
73 if (stmt
->type
!= STMT_EXPRESSION
)
75 expr
= stmt
->expression
;
76 return get_value(expr
, val
);
79 static long long handle_preop(struct expression
*expr
, int *undefined
, int implied
)
81 long long ret
= BOGUS
;
85 ret
= ~_get_value(expr
->unop
, undefined
, implied
);
86 ret
= cast_to_type(expr
->unop
, ret
);
89 ret
= -_get_value(expr
->unop
, undefined
, implied
);
92 ret
= _get_implied_value(expr
, undefined
, implied
);
100 static long long handle_divide(struct expression
*expr
, int *undefined
, int implied
)
104 long long ret
= BOGUS
;
106 left
= _get_value(expr
->left
, undefined
, implied
);
107 right
= _get_value(expr
->right
, undefined
, opposite_implied(implied
));
117 static long long handle_subtract(struct expression
*expr
, int *undefined
, int implied
)
122 left
= _get_value(expr
->left
, undefined
, implied
);
123 right
= _get_value(expr
->right
, undefined
, opposite_implied(implied
));
128 static long long handle_binop(struct expression
*expr
, int *undefined
, int implied
)
132 long long ret
= BOGUS
;
134 if (expr
->type
!= EXPR_BINOP
) {
139 left
= _get_value(expr
->left
, undefined
, implied
);
140 right
= _get_value(expr
->right
, undefined
, implied
);
147 ret
= handle_divide(expr
, undefined
, implied
);
153 ret
= handle_subtract(expr
, undefined
, implied
);
167 case SPECIAL_RIGHTSHIFT
:
170 case SPECIAL_LEFTSHIFT
:
182 static int get_implied_value_helper(struct expression
*expr
, long long *val
, int what
)
184 struct smatch_state
*state
;
188 if (get_value(expr
, val
))
191 name
= get_variable_from_expr(expr
, &sym
);
194 state
= get_state(SMATCH_EXTRA
, name
, sym
);
196 if (!state
|| !state
->data
)
199 return estate_get_single_value(state
, val
);
200 if (what
== IMPLIED_MAX
) {
201 *val
= estate_max(state
);
202 if (*val
== whole_range
.max
) /* this means just guessing */
206 *val
= estate_min(state
);
207 if (*val
== whole_range
.min
)
212 static int get_fuzzy_max_helper(struct expression
*expr
, long long *max
)
215 struct sm_state
*tmp
;
217 if (get_implied_max(expr
, max
))
220 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
224 *max
= whole_range
.min
;
225 FOR_EACH_PTR(sm
->possible
, tmp
) {
228 new_min
= estate_min(tmp
->state
);
231 } END_FOR_EACH_PTR(tmp
);
233 if (*max
> whole_range
.min
)
238 static int get_fuzzy_min_helper(struct expression
*expr
, long long *min
)
241 struct sm_state
*tmp
;
243 if (get_implied_min(expr
, min
))
246 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
250 *min
= whole_range
.max
;
251 FOR_EACH_PTR(sm
->possible
, tmp
) {
254 new_max
= estate_max(tmp
->state
);
257 } END_FOR_EACH_PTR(tmp
);
259 if (*min
< whole_range
.max
)
264 static long long _get_implied_value(struct expression
*expr
, int *undefined
, int implied
)
266 long long ret
= BOGUS
;
272 if (!get_implied_value_helper(expr
, &ret
, implied
))
276 if (!get_fuzzy_max_helper(expr
, &ret
))
280 if (!get_fuzzy_min_helper(expr
, &ret
))
289 static int get_const_value(struct expression
*expr
, long long *val
)
296 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
298 if (get_value(sym
->initializer
, val
))
303 static long long _get_value(struct expression
*expr
, int *undefined
, int implied
)
305 long long ret
= BOGUS
;
314 expr
= strip_parens(expr
);
316 switch (expr
->type
) {
319 ret
= cast_to_type(expr
, ret
);
322 ret
= handle_preop(expr
, undefined
, implied
);
325 ret
= _get_value(expr
->unop
, undefined
, implied
);
328 case EXPR_FORCE_CAST
:
329 case EXPR_IMPLIED_CAST
:
330 ret
= _get_value(expr
->cast_expression
, undefined
, implied
);
331 return cast_to_type(expr
, ret
);
333 ret
= handle_binop(expr
, undefined
, implied
);
337 ret
= get_expression_value(expr
);
340 if (get_const_value(expr
, &ret
))
343 ret
= _get_implied_value(expr
, undefined
, implied
);
350 /* returns 1 if it can get a value literal or else returns 0 */
351 int get_value(struct expression
*expr
, long long *val
)
355 *val
= _get_value(expr
, &undefined
, NOTIMPLIED
);
361 int get_implied_value(struct expression
*expr
, long long *val
)
365 *val
= _get_value(expr
, &undefined
, IMPLIED
);
369 int get_implied_min(struct expression
*expr
, long long *val
)
373 *val
= _get_value(expr
, &undefined
, IMPLIED_MIN
);
377 int get_implied_max(struct expression
*expr
, long long *val
)
381 *val
= _get_value(expr
, &undefined
, IMPLIED_MAX
);
385 int get_fuzzy_min(struct expression
*expr
, long long *val
)
389 *val
= _get_value(expr
, &undefined
, FUZZYMIN
);
393 int get_fuzzy_max(struct expression
*expr
, long long *val
)
397 *val
= _get_value(expr
, &undefined
, FUZZYMAX
);
401 int get_absolute_min(struct expression
*expr
, long long *val
)
406 type
= get_type(expr
);
408 if (get_value(expr
, val
))
412 min
= type_min(type
);
413 if (!get_implied_min(expr
, val
) || *val
< min
)
418 int get_absolute_max(struct expression
*expr
, long long *val
)
423 type
= get_type(expr
);
425 if (get_value(expr
, val
))
429 max
= type_max(type
);
430 if (!get_implied_max(expr
, val
) || *val
> max
)
432 if (*val
< type_min(type
))
437 int known_condition_true(struct expression
*expr
)
440 struct statement
*stmt
;
445 if (get_value(expr
, &tmp
) && tmp
)
448 expr
= strip_expr(expr
);
449 switch (expr
->type
) {
451 if (expr
->op
== '!') {
452 if (known_condition_false(expr
->unop
))
456 stmt
= get_expression_statement(expr
);
457 if (last_stmt_val(stmt
, &tmp
) && tmp
== 1)
466 int known_condition_false(struct expression
*expr
)
469 struct statement
*stmt
;
477 switch (expr
->type
) {
479 if (expr
->op
== '!') {
480 if (known_condition_true(expr
->unop
))
484 stmt
= get_expression_statement(expr
);
485 if (last_stmt_val(stmt
, &tmp
) && tmp
== 0)
489 if (sym_name_is("__builtin_constant_p", expr
->fn
))
498 static int do_comparison(struct expression
*expr
)
500 struct range_list
*left_ranges
= NULL
;
501 struct range_list
*right_ranges
= NULL
;
502 int poss_true
, poss_false
;
504 get_implied_range_list(expr
->left
, &left_ranges
);
505 get_implied_range_list(expr
->right
, &right_ranges
);
507 poss_true
= possibly_true_range_lists(left_ranges
, expr
->op
, right_ranges
);
508 poss_false
= possibly_false_range_lists(left_ranges
, expr
->op
, right_ranges
);
510 free_range_list(&left_ranges
);
511 free_range_list(&right_ranges
);
513 if (!poss_true
&& !poss_false
)
515 if (poss_true
&& !poss_false
)
517 if (!poss_true
&& poss_false
)
522 int implied_condition_true(struct expression
*expr
)
524 struct statement
*stmt
;
531 if (known_condition_true(expr
))
533 if (get_implied_value(expr
, &tmp
) && tmp
)
536 if (expr
->type
== EXPR_POSTOP
)
537 return implied_condition_true(expr
->unop
);
539 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_DECREMENT
)
540 return implied_not_equal(expr
->unop
, 1);
541 if (expr
->type
== EXPR_PREOP
&& expr
->op
== SPECIAL_INCREMENT
)
542 return implied_not_equal(expr
->unop
, -1);
544 expr
= strip_expr(expr
);
545 switch (expr
->type
) {
547 if (do_comparison(expr
) == 1)
551 if (expr
->op
== '!') {
552 if (implied_condition_false(expr
->unop
))
556 stmt
= get_expression_statement(expr
);
557 if (last_stmt_val(stmt
, &val
) && val
== 1)
561 if (implied_not_equal(expr
, 0) == 1)
568 int implied_condition_false(struct expression
*expr
)
570 struct statement
*stmt
;
571 struct expression
*tmp
;
577 if (known_condition_false(expr
))
580 switch (expr
->type
) {
582 if (do_comparison(expr
) == 2)
585 if (expr
->op
== '!') {
586 if (implied_condition_true(expr
->unop
))
590 stmt
= get_expression_statement(expr
);
591 if (last_stmt_val(stmt
, &val
) && val
== 0)
593 tmp
= strip_expr(expr
);
595 return implied_condition_false(tmp
);
598 if (get_implied_value(expr
, &val
) && val
== 0)