Improve safety of log2 functions

parent 52848dab
......@@ -2785,9 +2785,25 @@ t_buddy(size_t free)
BUDDYF(fini)(&buddy, BUDDYF(unmap), NULL, NULL, NULL);
}
static void
t_log2(size_t min, size_t max)
{
size_t s;
assert(min > 0);
for (s = min; s <= max; s++) {
assert(log2down(s) == log2up(s + 1) - 1);
}
fprintf(stderr, "log2 %zu..%zu OK\n", min, max);
}
int main(void)
{
t_cramlimit();
t_log2(1, (size_t)1 << 30);
t_log2(SIZE_MAX - 5, SIZE_MAX - 1);
assert(log2up(SIZE_MAX) == sizeof(size_t) * 8);
assert(log2down(SIZE_MAX) == sizeof(size_t) * 8 - 1);
t_bitf();
t_buddy(1 << 15);
t_buddy((1 << 15) - 1);
......
......@@ -50,7 +50,9 @@ rdown_min(size_t size, unsigned minbits)
static inline unsigned
log2up(size_t sz)
{
if (sz == 1)
return (0);
assert(sz > 1);
sz--;
sz = bitsof(sz);
assert(sz > 0);
......@@ -58,11 +60,13 @@ log2up(size_t sz)
return ((unsigned) sz);
}
// #define log2down(x) (log2up(x+1) - 1)
/* prev log 2 of sz */
static inline unsigned
log2down(size_t sz)
{
assert(sz > 0);
sz = bitsof(sz) - 1;
assert(sz <= UINT_MAX);
return ((unsigned) sz);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment