2 * sparse/smatch_helper.c
4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 #include "smatch_extra.h"
13 static long long _get_implied_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
);
14 static long long _get_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
);
23 static long long cast_to_type(struct expression
*expr
, long long val
)
25 struct symbol
*type
= get_type(expr
);
30 switch (type
->bit_size
) {
32 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
33 val
= (long long)(unsigned char) val
;
35 val
= (long long)(char) val
;
38 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
39 val
= (long long)(unsigned short) val
;
41 val
= (long long)(short) val
;
44 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
45 val
= (long long)(unsigned int) val
;
47 val
= (long long)(int) val
;
53 static long long handle_preop(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
55 long long ret
= BOGUS
;
59 ret
= ~ _get_value(expr
->unop
, discard
, undefined
, implied
);
60 ret
= cast_to_type(expr
->unop
, ret
);
63 ret
= - _get_value(expr
->unop
, discard
, undefined
, implied
);
66 ret
= _get_implied_value(expr
, discard
, undefined
, implied
);
75 static long long handle_binop(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
79 long long ret
= BOGUS
;
81 if (expr
->type
!= EXPR_BINOP
) {
87 left
= _get_value(expr
->left
, discard
, undefined
, implied
);
88 right
= _get_value(expr
->right
, discard
, undefined
, implied
);
112 case SPECIAL_RIGHTSHIFT
:
115 case SPECIAL_LEFTSHIFT
:
128 static long long _get_implied_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
130 long long ret
= BOGUS
;
134 if (!get_implied_single_val(expr
, &ret
)) {
140 if (!get_implied_single_fuzzy_max(expr
, &ret
)) {
146 if (!get_implied_single_fuzzy_min(expr
, &ret
)) {
158 static long long _get_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
161 long long ret
= BOGUS
;
174 expr
= strip_parens(expr
);
179 ret
= cast_to_type(expr
, ret
);
182 ret
= handle_preop(expr
, discard
, undefined
, implied
);
185 ret
= _get_value(expr
->unop
, discard
, undefined
, implied
);
188 case EXPR_FORCE_CAST
:
189 case EXPR_IMPLIED_CAST
:
190 ret
= _get_value(expr
->cast_expression
, discard
, undefined
, implied
);
191 return cast_to_type(expr
, ret
);
193 ret
= handle_binop(expr
, discard
, undefined
, implied
);
197 ret
= get_expression_value(expr
);
200 ret
= _get_implied_value(expr
, discard
, undefined
, implied
);
209 /* returns 1 if it can get a value literal or else returns 0 */
210 int get_value(struct expression
*expr
, long long *val
)
214 *val
= _get_value(expr
, NULL
, &undefined
, NOTIMPLIED
);
220 int get_implied_value(struct expression
*expr
, long long *val
)
224 *val
= _get_value(expr
, NULL
, &undefined
, IMPLIED
);
228 int get_fuzzy_max(struct expression
*expr
, long long *val
)
232 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMAX
);
236 int get_fuzzy_min(struct expression
*expr
, long long *val
)
240 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMIN
);