2 * Copyright (C) 2012 Oracle.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
19 * Basically the point of sval is that it can hold both ULLONG_MAX and
20 * LLONG_MIN. If it is an unsigned type then we use sval.uvalue or if it is
21 * signed we use sval.value.
23 * I considered just using one bit to store whether the value was signed vs
24 * unsigned but I think it might help to have the type information so we know
25 * how to do type promotion.
30 #include "smatch_slist.h"
31 #include "smatch_extra.h"
33 __ALLOCATOR(sval_t
, "svals", sval
);
35 sval_t
*sval_alloc(sval_t sval
)
39 ret
= __alloc_sval(0);
44 sval_t
*sval_alloc_permanent(sval_t sval
)
48 ret
= malloc(sizeof(*ret
));
53 sval_t
sval_blank(struct expression
*expr
)
57 ret
.type
= get_type(expr
);
59 ret
.type
= &llong_ctype
;
60 ret
.value
= 123456789;
65 sval_t
sval_type_val(struct symbol
*type
, long long val
)
74 sval_t
sval_from_val(struct expression
*expr
, long long val
)
78 ret
= sval_blank(expr
);
80 ret
= sval_cast(get_type(expr
), ret
);
85 int sval_unsigned(sval_t sval
)
87 return type_unsigned(sval
.type
);
90 int sval_signed(sval_t sval
)
92 return !type_unsigned(sval
.type
);
95 int sval_bits(sval_t sval
)
97 return type_bits(sval
.type
);
100 int sval_positive_bits(sval_t sval
)
102 return type_positive_bits(sval
.type
);
105 int sval_bits_used(sval_t sval
)
109 for (i
= 64; i
>= 1; i
--) {
110 if (sval
.uvalue
& (1ULL << (i
- 1)))
116 int sval_is_negative(sval_t sval
)
118 if (type_unsigned(sval
.type
))
125 int sval_is_positive(sval_t sval
)
127 return !sval_is_negative(sval
);
130 int sval_is_min(sval_t sval
)
132 sval_t min
= sval_type_min(sval
.type
);
134 if (sval_unsigned(sval
)) {
135 if (sval
.uvalue
== 0)
139 /* return true for less than min as well */
140 return (sval
.value
<= min
.value
);
143 int sval_is_max(sval_t sval
)
145 sval_t max
= sval_type_max(sval
.type
);
147 if (sval_unsigned(sval
))
148 return (sval
.uvalue
>= max
.value
);
149 return (sval
.value
>= max
.value
);
152 int sval_is_a_min(sval_t sval
)
154 if (sval_signed(sval
) && sval
.value
== SHRT_MIN
)
156 if (sval_signed(sval
) && sval
.value
== INT_MIN
)
158 if (sval_signed(sval
) && sval
.value
== LLONG_MIN
)
163 int sval_is_a_max(sval_t sval
)
165 if (sval
.uvalue
== SHRT_MAX
)
167 if (sval
.uvalue
== INT_MAX
)
169 if (sval
.uvalue
== LLONG_MAX
)
171 if (sval
.uvalue
== USHRT_MAX
)
173 if (sval
.uvalue
== UINT_MAX
)
175 if (sval_unsigned(sval
) && sval
.uvalue
== ULLONG_MAX
)
177 if (sval
.value
> valid_ptr_max
- 1000 &&
178 sval
.value
< valid_ptr_max
+ 1000)
183 int sval_is_negative_min(sval_t sval
)
185 if (!sval_is_negative(sval
))
187 return sval_is_min(sval
);
191 * Returns -1 if one is smaller, 0 if they are the same and 1 if two is larger.
193 int sval_cmp(sval_t one
, sval_t two
)
198 if (sval_positive_bits(two
) > sval_positive_bits(one
))
200 if (type_bits(type
) < 31)
203 one
= sval_cast(type
, one
);
204 two
= sval_cast(type
, two
);
206 if (type_unsigned(type
)) {
207 if (one
.uvalue
< two
.uvalue
)
209 if (one
.uvalue
== two
.uvalue
)
213 /* fix me handle type promotion and unsigned values */
214 if (one
.value
< two
.value
)
216 if (one
.value
== two
.value
)
221 int sval_cmp_t(struct symbol
*type
, sval_t one
, sval_t two
)
223 sval_t one_cast
, two_cast
;
225 one_cast
= sval_cast(type
, one
);
226 two_cast
= sval_cast(type
, two
);
227 return sval_cmp(one_cast
, two_cast
);
230 int sval_cmp_val(sval_t one
, long long val
)
234 sval
= sval_type_val(&llong_ctype
, val
);
235 return sval_cmp(one
, sval
);
238 sval_t
sval_min(sval_t one
, sval_t two
)
240 if (sval_cmp(one
, two
) > 0)
245 sval_t
sval_max(sval_t one
, sval_t two
)
247 if (sval_cmp(one
, two
) < 0)
252 int sval_too_low(struct symbol
*type
, sval_t sval
)
254 if (sval_is_negative(sval
) && type_unsigned(type
))
256 if (type_signed(type
) && sval_unsigned(sval
))
258 if (sval_cmp(sval
, sval_type_min(type
)) < 0)
263 int sval_too_high(struct symbol
*type
, sval_t sval
)
265 if (sval_is_negative(sval
))
267 if (sval
.uvalue
> sval_type_max(type
).uvalue
)
272 int sval_fits(struct symbol
*type
, sval_t sval
)
274 if (sval_too_low(type
, sval
))
276 if (sval_too_high(type
, sval
))
281 sval_t
sval_cast(struct symbol
*type
, sval_t sval
)
289 switch (sval_bits(ret
)) {
291 if (sval_unsigned(ret
))
292 ret
.value
= (long long)(unsigned char)sval
.value
;
294 ret
.value
= (long long)(char)sval
.value
;
297 if (sval_unsigned(ret
))
298 ret
.value
= (long long)(unsigned short)sval
.value
;
300 ret
.value
= (long long)(short)sval
.value
;
303 if (sval_unsigned(ret
))
304 ret
.value
= (long long)(unsigned int)sval
.value
;
306 ret
.value
= (long long)(int)sval
.value
;
309 ret
.value
= sval
.value
;
315 sval_t
sval_preop(sval_t sval
, int op
)
319 sval
.value
= !sval
.value
;
322 sval
.value
= ~sval
.value
;
323 sval
= sval_cast(sval
.type
, sval
);
326 sval
.value
= -sval
.value
;
327 sval
= sval_cast(sval
.type
, sval
);
333 static sval_t
sval_binop_unsigned(struct symbol
*type
, sval_t left
, int op
, sval_t right
)
340 ret
.uvalue
= left
.uvalue
* right
.uvalue
;
343 if (right
.uvalue
== 0) {
344 sm_msg("debug: %s: divide by zero", __func__
);
345 ret
.uvalue
= 123456789;
347 ret
.uvalue
= left
.uvalue
/ right
.uvalue
;
351 ret
.uvalue
= left
.uvalue
+ right
.uvalue
;
354 ret
.uvalue
= left
.uvalue
- right
.uvalue
;
357 if (right
.uvalue
== 0) {
358 sm_msg("internal error: %s: MOD by zero", __func__
);
359 ret
.uvalue
= 123456789;
361 ret
.uvalue
= left
.uvalue
% right
.uvalue
;
365 ret
.uvalue
= left
.uvalue
| right
.uvalue
;
368 ret
.uvalue
= left
.uvalue
& right
.uvalue
;
370 case SPECIAL_RIGHTSHIFT
:
371 ret
.uvalue
= left
.uvalue
>> right
.uvalue
;
373 case SPECIAL_LEFTSHIFT
:
374 ret
.uvalue
= left
.uvalue
<< right
.uvalue
;
377 ret
.uvalue
= left
.uvalue
^ right
.uvalue
;
380 sm_msg("internal error: %s: unhandled binop %s", __func__
,
382 ret
.uvalue
= 1234567;
388 static sval_t
sval_binop_signed(struct symbol
*type
, sval_t left
, int op
, sval_t right
)
395 ret
.value
= left
.value
* right
.value
;
398 if (right
.value
== 0) {
399 sm_msg("debug: %s: divide by zero", __func__
);
400 ret
.value
= 123456789;
401 } else if (left
.value
== LLONG_MIN
&& right
.value
== -1) {
402 sm_msg("debug: %s: invalid divide LLONG_MIN/-1", __func__
);
403 ret
.value
= 12345678;
405 ret
.value
= left
.value
/ right
.value
;
409 ret
.value
= left
.value
+ right
.value
;
412 ret
.value
= left
.value
- right
.value
;
415 if (right
.value
== 0) {
416 sm_msg("internal error: %s: MOD by zero", __func__
);
417 ret
.value
= 123456789;
419 ret
.value
= left
.value
% right
.value
;
423 ret
.value
= left
.value
| right
.value
;
426 ret
.value
= left
.value
& right
.value
;
428 case SPECIAL_RIGHTSHIFT
:
429 ret
.value
= left
.value
>> right
.value
;
431 case SPECIAL_LEFTSHIFT
:
432 ret
.value
= left
.value
<< right
.value
;
435 ret
.value
= left
.value
^ right
.value
;
438 sm_msg("internal error: %s: unhandled binop %s", __func__
,
445 sval_t
sval_binop(sval_t left
, int op
, sval_t right
)
451 if (sval_positive_bits(right
) > sval_positive_bits(left
))
453 if (type_positive_bits(type
) < 31)
456 if (type_unsigned(type
))
457 ret
= sval_binop_unsigned(type
, left
, op
, right
);
459 ret
= sval_binop_signed(type
, left
, op
, right
);
463 int sval_unop_overflows(sval_t sval
, int op
)
467 if (sval_positive_bits(sval
) == 32 && sval
.value
== INT_MIN
)
469 if (sval_positive_bits(sval
) == 64 && sval
.value
== LLONG_MIN
)
471 if (sval_is_negative(sval
))
473 if (sval_signed(sval
))
475 if (sval_bits(sval
) == 32 && sval
.uvalue
> INT_MAX
)
477 if (sval_bits(sval
) == 64 && sval
.uvalue
> LLONG_MAX
)
482 int sval_binop_overflows(sval_t left
, int op
, sval_t right
)
488 if (type_positive_bits(right
.type
) > type_positive_bits(left
.type
))
490 if (type_positive_bits(type
) < 31)
492 max
= sval_type_max(type
);
493 min
= sval_type_min(type
);
497 if (sval_is_negative(right
)) {
498 if (left
.value
< min
.value
- right
.value
)
501 if (left
.uvalue
> max
.uvalue
- right
.uvalue
)
506 return right
.uvalue
!= 0 && left
.uvalue
> max
.uvalue
/ right
.uvalue
;
508 if (type_unsigned(type
)) {
509 if (sval_cmp(left
, right
) < 0)
514 if (sval_unop_overflows(right
, '-'))
516 right
= sval_preop(right
, '-');
517 if (sval_binop_overflows(left
, '+', right
))
524 const char *sval_to_str(sval_t sval
)
528 if (sval_unsigned(sval
) && sval
.value
== ULLONG_MAX
)
530 if (sval_unsigned(sval
) && sval
.value
== UINT_MAX
)
532 if (sval_unsigned(sval
) && sval
.value
== USHRT_MAX
)
535 if (sval_signed(sval
) && sval
.value
== LLONG_MAX
)
537 if (sval_signed(sval
) && sval
.value
== INT_MAX
)
539 if (sval_signed(sval
) && sval
.value
== SHRT_MAX
)
542 if (sval_signed(sval
) && sval
.value
== SHRT_MIN
)
544 if (sval_signed(sval
) && sval
.value
== INT_MIN
)
546 if (sval_signed(sval
) && sval
.value
== LLONG_MIN
)
549 if (sval_unsigned(sval
))
550 snprintf(buf
, sizeof(buf
), "%llu", sval
.value
);
551 else if (sval
.value
< 0)
552 snprintf(buf
, sizeof(buf
), "(%lld)", sval
.value
);
554 snprintf(buf
, sizeof(buf
), "%lld", sval
.value
);
556 return alloc_sname(buf
);
559 const char *sval_to_numstr(sval_t sval
)
563 if (sval_unsigned(sval
))
564 snprintf(buf
, sizeof(buf
), "%llu", sval
.value
);
565 else if (sval
.value
< 0)
566 snprintf(buf
, sizeof(buf
), "(%lld)", sval
.value
);
568 snprintf(buf
, sizeof(buf
), "%lld", sval
.value
);
570 return alloc_sname(buf
);
573 sval_t
ll_to_sval(long long val
)
577 ret
.type
= &llong_ctype
;
582 static void free_svals(struct symbol
*sym
)
589 void register_sval(int my_id
)
591 add_hook(&free_svals
, END_FUNC_HOOK
);