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_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
);
22 static long long cast_to_type(struct expression
*expr
, long long val
)
24 struct symbol
*type
= get_type(expr
);
29 switch (type
->bit_size
) {
31 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
32 val
= (long long)(unsigned char) val
;
34 val
= (long long)(char) val
;
37 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
38 val
= (long long)(unsigned short) val
;
40 val
= (long long)(short) val
;
43 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
44 val
= (long long)(unsigned int) val
;
46 val
= (long long)(int) val
;
52 static long long handle_preop(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
54 long long ret
= BOGUS
;
58 ret
= ~ _get_value(expr
->unop
, discard
, undefined
, implied
);
59 ret
= cast_to_type(expr
->unop
, ret
);
62 ret
= - _get_value(expr
->unop
, discard
, undefined
, implied
);
71 static long long handle_binop(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
75 long long ret
= BOGUS
;
77 if (expr
->type
!= EXPR_BINOP
) {
83 left
= _get_value(expr
->left
, discard
, undefined
, implied
);
84 right
= _get_value(expr
->right
, discard
, undefined
, implied
);
85 if (expr
->op
== '*') {
87 } else if (expr
->op
== '/') {
89 } else if (expr
->op
== '+') {
91 } else if (expr
->op
== '-') {
93 } else if (expr
->op
== '|') {
95 } else if (expr
->op
== '&') {
97 } else if (expr
->op
== SPECIAL_RIGHTSHIFT
) {
99 } else if (expr
->op
== SPECIAL_LEFTSHIFT
) {
101 } else if (expr
->op
== '^') {
110 static long long _get_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
113 long long ret
= BOGUS
;
126 expr
= strip_parens(expr
);
131 ret
= cast_to_type(expr
, ret
);
134 ret
= handle_preop(expr
, discard
, undefined
, implied
);
137 case EXPR_FORCE_CAST
:
138 case EXPR_IMPLIED_CAST
:
139 ret
= _get_value(expr
->cast_expression
, discard
, undefined
, implied
);
140 return cast_to_type(expr
, ret
);
142 ret
= handle_binop(expr
, discard
, undefined
, implied
);
146 ret
= get_expression_value(expr
);
151 if (!get_implied_single_val(expr
, &ret
)) {
157 if (!get_implied_single_fuzzy_max(expr
, &ret
)) {
163 if (!get_implied_single_fuzzy_min(expr
, &ret
)) {
180 /* returns 1 if it can get a value literal or else returns 0 */
181 int get_value(struct expression
*expr
, long long *val
)
185 *val
= _get_value(expr
, NULL
, &undefined
, NOTIMPLIED
);
191 int get_implied_value(struct expression
*expr
, long long *val
)
195 *val
= _get_value(expr
, NULL
, &undefined
, IMPLIED
);
199 int get_fuzzy_max(struct expression
*expr
, long long *val
)
203 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMAX
);
207 int get_fuzzy_min(struct expression
*expr
, long long *val
)
211 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMIN
);