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"
20 static long long cast_to_type(struct expression
*expr
, long long val
)
22 struct symbol
*type
= get_type(expr
);
27 switch (type
->bit_size
) {
29 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
30 val
= (long long)(unsigned char) val
;
32 val
= (long long)(char) val
;
35 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
36 val
= (long long)(unsigned short) val
;
38 val
= (long long)(short) val
;
41 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
42 val
= (long long)(unsigned int) val
;
44 val
= (long long)(int) val
;
50 static long long _get_value(struct expression
*expr
, int *discard
, int *undefined
, int implied
)
53 long long ret
= BOGUS
;
66 expr
= strip_parens(expr
);
71 ret
= cast_to_type(expr
, ret
);
76 ret
= ~ _get_value(expr
->unop
, discard
, undefined
, implied
);
77 ret
= cast_to_type(expr
->unop
, ret
);
80 ret
= - _get_value(expr
->unop
, discard
, undefined
, implied
);
89 case EXPR_IMPLIED_CAST
:
91 struct symbol
*type
= get_base_type(expr
->cast_type
);
93 ret
= _get_value(expr
->cast_expression
, discard
, undefined
, implied
);
94 switch (type
->bit_size
) {
96 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
97 ret
= (long long)(unsigned char) ret
;
99 ret
= (long long)(char) ret
;
102 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
103 ret
= (long long)(unsigned short) ret
;
105 ret
= (long long)(short) ret
;
108 if (type
->ctype
.modifiers
& MOD_UNSIGNED
)
109 ret
= (long long)(unsigned int) ret
;
111 ret
= (long long)(int) ret
;
120 left
= _get_value(expr
->left
, discard
, undefined
, implied
);
121 right
= _get_value(expr
->right
, discard
, undefined
, implied
);
122 if (expr
->op
== '*') {
124 } else if (expr
->op
== '/') {
126 } else if (expr
->op
== '+') {
128 } else if (expr
->op
== '-') {
130 } else if (expr
->op
== '|') {
132 } else if (expr
->op
== '&') {
134 } else if (expr
->op
== SPECIAL_RIGHTSHIFT
) {
136 } else if (expr
->op
== SPECIAL_LEFTSHIFT
) {
138 } else if (expr
->op
== '^') {
148 ret
= get_expression_value(expr
);
153 if (!get_implied_single_val(expr
, &ret
)) {
159 if (!get_implied_single_fuzzy_max(expr
, &ret
)) {
165 if (!get_implied_single_fuzzy_min(expr
, &ret
)) {
182 /* returns 1 if it can get a value literal or else returns 0 */
183 int get_value(struct expression
*expr
, long long *val
)
187 *val
= _get_value(expr
, NULL
, &undefined
, NOTIMPLIED
);
193 int get_implied_value(struct expression
*expr
, long long *val
)
197 *val
= _get_value(expr
, NULL
, &undefined
, IMPLIED
);
201 int get_fuzzy_max(struct expression
*expr
, long long *val
)
205 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMAX
);
209 int get_fuzzy_min(struct expression
*expr
, long long *val
)
213 *val
= _get_value(expr
, NULL
, &undefined
, FUZZYMIN
);