4 * Copyright (C) 2012 Oracle.
6 * Licensed under the Open Software License version 1.1
9 * Basically the point of sval is that it can hold both ULLONG_MAX and
10 * LLONG_MIN. If it is an unsigned type then we use sval.uvalue or if it is
11 * signed we use sval.value.
13 * I considered just using one bit to store whether the value was signed vs
14 * unsigned but I think it might help to have the type information so we know
15 * how to do type promotion.
20 #include "smatch_slist.h"
21 #include "smatch_extra.h"
23 __ALLOCATOR(sval_t
, "svals", sval
);
25 sval_t
*sval_alloc(sval_t sval
)
29 ret
= __alloc_sval(0);
34 sval_t
*sval_alloc_permanent(sval_t sval
)
38 ret
= malloc(sizeof(*ret
));
43 sval_t
sval_blank(struct expression
*expr
)
47 ret
.type
= get_type(expr
);
49 ret
.type
= &llong_ctype
;
50 ret
.value
= 123456789;
55 sval_t
sval_type_val(struct symbol
*type
, long long val
)
64 sval_t
sval_from_val(struct expression
*expr
, long long val
)
68 ret
= sval_blank(expr
);
70 ret
= sval_cast(get_type(expr
), ret
);
75 int sval_unsigned(sval_t sval
)
77 return type_unsigned(sval
.type
);
80 int sval_signed(sval_t sval
)
82 return !type_unsigned(sval
.type
);
85 int sval_bits(sval_t sval
)
87 return type_bits(sval
.type
);
90 int sval_positive_bits(sval_t sval
)
92 return type_positive_bits(sval
.type
);
95 int sval_bits_used(sval_t sval
)
99 for (i
= 64; i
>= 1; i
--) {
100 if (sval
.uvalue
& (1ULL << (i
- 1)))
106 int sval_is_negative(sval_t sval
)
108 if (type_unsigned(sval
.type
))
115 int sval_is_positive(sval_t sval
)
117 return !sval_is_negative(sval
);
120 int sval_is_min(sval_t sval
)
122 sval_t min
= sval_type_min(sval
.type
);
124 if (sval_unsigned(sval
)) {
125 if (sval
.uvalue
== 0)
129 /* return true for less than min as well */
130 return (sval
.value
<= min
.value
);
133 int sval_is_max(sval_t sval
)
135 sval_t max
= sval_type_max(sval
.type
);
137 if (sval_unsigned(sval
))
138 return (sval
.uvalue
>= max
.value
);
139 return (sval
.value
>= max
.value
);
142 int sval_is_a_min(sval_t sval
)
144 if (sval_signed(sval
) && sval
.value
== SHRT_MIN
)
146 if (sval_signed(sval
) && sval
.value
== INT_MIN
)
148 if (sval_signed(sval
) && sval
.value
== LLONG_MIN
)
153 int sval_is_a_max(sval_t sval
)
155 if (sval
.uvalue
== SHRT_MAX
)
157 if (sval
.uvalue
== INT_MAX
)
159 if (sval
.uvalue
== LLONG_MAX
)
161 if (sval
.uvalue
== USHRT_MAX
)
163 if (sval
.uvalue
== UINT_MAX
)
165 if (sval_unsigned(sval
) && sval
.uvalue
== ULLONG_MAX
)
170 int sval_is_negative_min(sval_t sval
)
172 if (!sval_is_negative(sval
))
174 return sval_is_min(sval
);
178 * Returns -1 if one is smaller, 0 if they are the same and 1 if two is larger.
180 int sval_cmp(sval_t one
, sval_t two
)
185 if (sval_positive_bits(two
) > sval_positive_bits(one
))
187 if (type_bits(type
) < 31)
190 one
= sval_cast(type
, one
);
191 two
= sval_cast(type
, two
);
193 if (type_unsigned(type
)) {
194 if (one
.uvalue
< two
.uvalue
)
196 if (one
.uvalue
== two
.uvalue
)
200 /* fix me handle type promotion and unsigned values */
201 if (one
.value
< two
.value
)
203 if (one
.value
== two
.value
)
208 int sval_cmp_t(struct symbol
*type
, sval_t one
, sval_t two
)
210 sval_t one_cast
, two_cast
;
212 one_cast
= sval_cast(type
, one
);
213 two_cast
= sval_cast(type
, two
);
214 return sval_cmp(one_cast
, two_cast
);
217 int sval_cmp_val(sval_t one
, long long val
)
221 sval
= sval_type_val(&llong_ctype
, val
);
222 return sval_cmp(one
, sval
);
225 sval_t
sval_min(sval_t one
, sval_t two
)
227 if (sval_cmp(one
, two
) > 0)
232 sval_t
sval_max(sval_t one
, sval_t two
)
234 if (sval_cmp(one
, two
) < 0)
239 int sval_too_low(struct symbol
*type
, sval_t sval
)
241 if (sval_is_negative(sval
) && type_unsigned(type
))
243 if (type_signed(type
) && sval_unsigned(sval
))
245 if (sval_cmp(sval
, sval_type_min(type
)) < 0)
250 int sval_too_high(struct symbol
*type
, sval_t sval
)
252 if (sval_is_negative(sval
))
254 if (sval
.uvalue
> sval_type_max(type
).uvalue
)
259 int sval_fits(struct symbol
*type
, sval_t sval
)
261 if (sval_too_low(type
, sval
))
263 if (sval_too_high(type
, sval
))
268 sval_t
sval_cast(struct symbol
*type
, sval_t sval
)
276 switch (sval_bits(ret
)) {
278 if (sval_unsigned(ret
))
279 ret
.value
= (long long)(unsigned char)sval
.value
;
281 ret
.value
= (long long)(char)sval
.value
;
284 if (sval_unsigned(ret
))
285 ret
.value
= (long long)(unsigned short)sval
.value
;
287 ret
.value
= (long long)(short)sval
.value
;
290 if (sval_unsigned(ret
))
291 ret
.value
= (long long)(unsigned int)sval
.value
;
293 ret
.value
= (long long)(int)sval
.value
;
296 ret
.value
= sval
.value
;
302 sval_t
sval_preop(sval_t sval
, int op
)
306 sval
.value
= !sval
.value
;
309 sval
.value
= ~sval
.value
;
310 sval
= sval_cast(sval
.type
, sval
);
313 sval
.value
= -sval
.value
;
314 sval
= sval_cast(sval
.type
, sval
);
320 static sval_t
sval_binop_unsigned(struct symbol
*type
, sval_t left
, int op
, sval_t right
)
327 ret
.uvalue
= left
.uvalue
* right
.uvalue
;
330 if (right
.uvalue
== 0) {
331 sm_msg("debug: %s: divide by zero", __func__
);
332 ret
.uvalue
= 123456789;
334 ret
.uvalue
= left
.uvalue
/ right
.uvalue
;
338 ret
.uvalue
= left
.uvalue
+ right
.uvalue
;
341 ret
.uvalue
= left
.uvalue
- right
.uvalue
;
344 if (right
.uvalue
== 0) {
345 sm_msg("internal error: %s: MOD by zero", __func__
);
346 ret
.uvalue
= 123456789;
348 ret
.uvalue
= left
.uvalue
% right
.uvalue
;
352 ret
.uvalue
= left
.uvalue
| right
.uvalue
;
355 ret
.uvalue
= left
.uvalue
& right
.uvalue
;
357 case SPECIAL_RIGHTSHIFT
:
358 ret
.uvalue
= left
.uvalue
>> right
.uvalue
;
360 case SPECIAL_LEFTSHIFT
:
361 ret
.uvalue
= left
.uvalue
<< right
.uvalue
;
364 ret
.uvalue
= left
.uvalue
^ right
.uvalue
;
367 sm_msg("internal error: %s: unhandled binop %s", __func__
,
369 ret
.uvalue
= 1234567;
375 static sval_t
sval_binop_signed(struct symbol
*type
, sval_t left
, int op
, sval_t right
)
382 ret
.value
= left
.value
* right
.value
;
385 if (right
.value
== 0) {
386 sm_msg("debug: %s: divide by zero", __func__
);
387 ret
.value
= 123456789;
388 } else if (left
.value
== LLONG_MIN
&& right
.value
== -1) {
389 sm_msg("debug: %s: invalid divide LLONG_MIN/-1", __func__
);
390 ret
.value
= 12345678;
392 ret
.value
= left
.value
/ right
.value
;
396 ret
.value
= left
.value
+ right
.value
;
399 ret
.value
= left
.value
- right
.value
;
402 if (right
.value
== 0) {
403 sm_msg("internal error: %s: MOD by zero", __func__
);
404 ret
.value
= 123456789;
406 ret
.value
= left
.value
% right
.value
;
410 ret
.value
= left
.value
| right
.value
;
413 ret
.value
= left
.value
& right
.value
;
415 case SPECIAL_RIGHTSHIFT
:
416 ret
.value
= left
.value
>> right
.value
;
418 case SPECIAL_LEFTSHIFT
:
419 ret
.value
= left
.value
<< right
.value
;
422 ret
.value
= left
.value
^ right
.value
;
425 sm_msg("internal error: %s: unhandled binop %s", __func__
,
432 sval_t
sval_binop(sval_t left
, int op
, sval_t right
)
438 if (sval_positive_bits(right
) > sval_positive_bits(left
))
440 if (type_positive_bits(type
) < 31)
443 if (type_unsigned(type
))
444 ret
= sval_binop_unsigned(type
, left
, op
, right
);
446 ret
= sval_binop_signed(type
, left
, op
, right
);
450 int sval_unop_overflows(sval_t sval
, int op
)
454 if (sval_positive_bits(sval
) == 32 && sval
.value
== INT_MIN
)
456 if (sval_positive_bits(sval
) == 64 && sval
.value
== LLONG_MIN
)
458 if (sval_is_negative(sval
))
460 if (sval_signed(sval
))
462 if (sval_bits(sval
) == 32 && sval
.uvalue
> INT_MAX
)
464 if (sval_bits(sval
) == 64 && sval
.uvalue
> LLONG_MAX
)
469 int sval_binop_overflows(sval_t left
, int op
, sval_t right
)
475 if (type_positive_bits(right
.type
) > type_positive_bits(left
.type
))
477 if (type_positive_bits(type
) < 31)
479 max
= sval_type_max(type
);
480 min
= sval_type_min(type
);
484 if (sval_is_negative(right
)) {
485 if (left
.value
< min
.value
- right
.value
)
488 if (left
.uvalue
> max
.uvalue
- right
.uvalue
)
493 return right
.uvalue
!= 0 && left
.uvalue
> max
.uvalue
/ right
.uvalue
;
495 if (type_unsigned(type
)) {
496 if (sval_cmp(left
, right
) < 0)
501 if (sval_unop_overflows(right
, '-'))
503 right
= sval_preop(right
, '-');
504 if (sval_binop_overflows(left
, '+', right
))
511 const char *sval_to_str(sval_t sval
)
515 if (sval_unsigned(sval
) && sval
.value
== ULLONG_MAX
)
517 if (sval_unsigned(sval
) && sval
.value
== UINT_MAX
)
519 if (sval_unsigned(sval
) && sval
.value
== USHRT_MAX
)
522 if (sval_signed(sval
) && sval
.value
== LLONG_MAX
)
524 if (sval_signed(sval
) && sval
.value
== INT_MAX
)
526 if (sval_signed(sval
) && sval
.value
== SHRT_MAX
)
529 if (sval_signed(sval
) && sval
.value
== SHRT_MIN
)
531 if (sval_signed(sval
) && sval
.value
== INT_MIN
)
533 if (sval_signed(sval
) && sval
.value
== LLONG_MIN
)
536 if (sval_unsigned(sval
))
537 snprintf(buf
, sizeof(buf
), "%llu", sval
.value
);
538 else if (sval
.value
< 0)
539 snprintf(buf
, sizeof(buf
), "(%lld)", sval
.value
);
541 snprintf(buf
, sizeof(buf
), "%lld", sval
.value
);
543 return alloc_sname(buf
);
546 const char *sval_to_numstr(sval_t sval
)
550 if (sval_unsigned(sval
))
551 snprintf(buf
, sizeof(buf
), "%llu", sval
.value
);
552 else if (sval
.value
< 0)
553 snprintf(buf
, sizeof(buf
), "(%lld)", sval
.value
);
555 snprintf(buf
, sizeof(buf
), "%lld", sval
.value
);
557 return alloc_sname(buf
);
560 sval_t
ll_to_sval(long long val
)
564 ret
.type
= &llong_ctype
;
569 static void free_svals(struct symbol
*sym
)
576 void register_sval(int my_id
)
578 add_hook(&free_svals
, END_FUNC_HOOK
);