Print this page
11506 smatch resync
*** 65,75 ****
sval_t sval_type_val(struct symbol *type, long long val)
{
sval_t ret;
if (!type)
! type = &int_ctype;
ret.type = type;
ret.value = val;
return ret;
}
--- 65,75 ----
sval_t sval_type_val(struct symbol *type, long long val)
{
sval_t ret;
if (!type)
! type = &llong_ctype;
ret.type = type;
ret.value = val;
return ret;
}
*** 92,101 ****
--- 92,103 ----
return (sval.type->type == SYM_PTR || sval.type->type == SYM_ARRAY);
}
int sval_unsigned(sval_t sval)
{
+ if (is_ptr_type(sval.type))
+ return true;
return type_unsigned(sval.type);
}
int sval_signed(sval_t sval)
{
*** 456,465 ****
--- 458,469 ----
} else {
ret.value = (left.value - right.value) / align;
}
}
+ if (op == '-')
+ ret.type = ssize_t_ctype;
return ret;
}
sval_t sval_binop(sval_t left, int op, sval_t right)
{
*** 581,599 ****
left = sval_cast(type, left);
right = sval_cast(type, right);
return sval_binop_overflows(left, op, right);
}
! unsigned long long fls_mask(unsigned long long uvalue)
{
! unsigned long long high_bit = 0;
while (uvalue) {
uvalue >>= 1;
high_bit++;
}
if (high_bit == 0)
return 0;
return ((unsigned long long)-1) >> (64 - high_bit);
}
--- 585,622 ----
left = sval_cast(type, left);
right = sval_cast(type, right);
return sval_binop_overflows(left, op, right);
}
! int find_first_zero_bit(unsigned long long uvalue)
{
! int i;
+ for (i = 0; i < 64; i++) {
+ if (!(uvalue & (1ULL << i)))
+ return i;
+ }
+ return i;
+ }
+
+ int sm_fls64(unsigned long long uvalue)
+ {
+ int high_bit = 0;
+
while (uvalue) {
uvalue >>= 1;
high_bit++;
}
+ return high_bit;
+ }
+
+ unsigned long long fls_mask(unsigned long long uvalue)
+ {
+ int high_bit = 0;
+
+ high_bit = sm_fls64(uvalue);
if (high_bit == 0)
return 0;
return ((unsigned long long)-1) >> (64 - high_bit);
}
*** 605,614 ****
--- 628,639 ----
const char *sval_to_str(sval_t sval)
{
char buf[30];
+ if (sval_is_ptr(sval) && sval.value == valid_ptr_max)
+ return "ptr_max";
if (sval_unsigned(sval) && sval.value == ULLONG_MAX)
return "u64max";
if (sval_unsigned(sval) && sval.value == UINT_MAX)
return "u32max";
if (sval.value == USHRT_MAX)
*** 636,645 ****
--- 661,686 ----
snprintf(buf, sizeof(buf), "%lld", sval.value);
return alloc_sname(buf);
}
+ const char *sval_to_str_or_err_ptr(sval_t sval)
+ {
+ char buf[12];
+
+ if (option_project != PROJ_KERNEL ||
+ !is_ptr_type(sval.type))
+ return sval_to_str(sval);
+
+ if (sval.uvalue >= -4905ULL) {
+ snprintf(buf, sizeof(buf), "(%lld)", sval.value);
+ return alloc_sname(buf);
+ }
+
+ return sval_to_str(sval);
+ }
+
const char *sval_to_numstr(sval_t sval)
{
char buf[30];
if (sval_unsigned(sval))