2 * sparse/smatch_helper.c
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 *discard
, int *undefined
, int implied
);
15 static long long _get_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
);
28 static long long cast_to_type(struct expression
*expr
, long long val
)
30 struct symbol
*type
= get_type(expr
);
35 switch (type
->bit_size
) {
37 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
38 val
= (long long)(unsigned char) val
;
40 val
= (long long)(char) val
;
43 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
44 val
= (long long)(unsigned short) val
;
46 val
= (long long)(short) val
;
49 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
50 val
= (long long)(unsigned int) val
;
52 val
= (long long)(int) val
;
58 static long long handle_preop(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
60 long long ret
= BOGUS
;
64 ret
= ~ _get_value(expr
->unop
, discard
, undefined
, implied
);
65 ret
= cast_to_type(expr
->unop
, ret
);
68 ret
= - _get_value(expr
->unop
, discard
, undefined
, implied
);
71 ret
= _get_implied_value(expr
, discard
, undefined
, implied
);
80 static long long handle_binop(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
84 long long ret
= BOGUS
;
86 if (expr
->type
!= EXPR_BINOP
) {
92 left
= _get_value(expr
->left
, discard
, undefined
, implied
);
93 right
= _get_value(expr
->right
, discard
, undefined
, implied
);
127 case SPECIAL_RIGHTSHIFT
:
130 case SPECIAL_LEFTSHIFT
:
143 static int get_implied_value_helper(struct expression
*expr
, long long *val
, int what
)
145 struct smatch_state
*state
;
149 if (get_value(expr
, val
))
152 name
= get_variable_from_expr(expr
, &sym
);
155 state
= get_state(SMATCH_EXTRA
, name
, sym
);
157 if (!state
|| !state
->data
)
159 if (what
== VAL_SINGLE
)
160 return get_single_value_from_dinfo(get_dinfo(state
), val
);
161 if (what
== VAL_MAX
) {
162 *val
= get_dinfo_max(get_dinfo(state
));
163 if (*val
== whole_range
.max
) /* this means just guessing */
167 *val
= get_dinfo_min(get_dinfo(state
));
168 if (*val
== whole_range
.min
)
173 static int get_implied_single_fuzzy_max(struct expression
*expr
, long long *max
)
176 struct sm_state
*tmp
;
178 if (get_implied_max(expr
, max
))
181 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
185 *max
= whole_range
.min
;
186 FOR_EACH_PTR(sm
->possible
, tmp
) {
189 new_min
= get_dinfo_min(get_dinfo(tmp
->state
));
192 } END_FOR_EACH_PTR(tmp
);
194 if (*max
> whole_range
.min
)
199 static int get_implied_single_fuzzy_min(struct expression
*expr
, long long *min
)
202 struct sm_state
*tmp
;
204 if (get_implied_min(expr
, min
))
207 sm
= get_sm_state_expr(SMATCH_EXTRA
, expr
);
211 *min
= whole_range
.max
;
212 FOR_EACH_PTR(sm
->possible
, tmp
) {
215 new_max
= get_dinfo_max(get_dinfo(tmp
->state
));
218 } END_FOR_EACH_PTR(tmp
);
220 if (*min
< whole_range
.max
)
225 static long long _get_implied_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
227 long long ret
= BOGUS
;
231 if (!get_implied_value_helper(expr
, &ret
, VAL_SINGLE
)) {
237 if (!get_implied_single_fuzzy_max(expr
, &ret
)) {
243 if (!get_implied_single_fuzzy_min(expr
, &ret
)) {
255 static int get_const_value(struct expression
*expr
, long long *val
)
262 if (!(sym
->ctype
.modifiers
& MOD_CONST
))
264 if (get_value(sym
->initializer
, val
))
269 static long long _get_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
272 long long ret
= BOGUS
;
285 expr
= strip_parens(expr
);
290 ret
= cast_to_type(expr
, ret
);
293 ret
= handle_preop(expr
, discard
, undefined
, implied
);
296 ret
= _get_value(expr
->unop
, discard
, undefined
, implied
);
299 case EXPR_FORCE_CAST
:
300 case EXPR_IMPLIED_CAST
:
301 ret
= _get_value(expr
->cast_expression
, discard
, undefined
, implied
);
302 return cast_to_type(expr
, ret
);
304 ret
= handle_binop(expr
, discard
, undefined
, implied
);
308 ret
= get_expression_value(expr
);
311 if (get_const_value(expr
, &ret
))
314 ret
= _get_implied_value(expr
, discard
, undefined
, implied
);
323 /* returns 1 if it can get a value literal or else returns 0 */
324 int get_value(struct expression
*expr
, long long *val
)
328 *val
= _get_value(expr
, NULL
, &undefined
, NOTIMPLIED
);
334 int get_implied_max(struct expression
*expr
, long long *val
)
336 return get_implied_value_helper(expr
, val
, VAL_MAX
);
339 int get_implied_min(struct expression
*expr
, long long *val
)
341 return get_implied_value_helper(expr
, val
, VAL_MIN
);
344 int get_implied_value(struct expression
*expr
, long long *val
)
348 *val
= _get_value(expr
, NULL
, &undefined
, IMPLIED
);
352 int get_fuzzy_max(struct expression
*expr
, long long *val
)
356 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMAX
);
360 int get_fuzzy_min(struct expression
*expr
, long long *val
)
364 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMIN
);