Improve safety of log2 functions

parent 52848dab
...@@ -2785,9 +2785,25 @@ t_buddy(size_t free) ...@@ -2785,9 +2785,25 @@ t_buddy(size_t free)
BUDDYF(fini)(&buddy, BUDDYF(unmap), NULL, NULL, NULL); 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) int main(void)
{ {
t_cramlimit(); 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_bitf();
t_buddy(1 << 15); t_buddy(1 << 15);
t_buddy((1 << 15) - 1); t_buddy((1 << 15) - 1);
......
...@@ -50,7 +50,9 @@ rdown_min(size_t size, unsigned minbits) ...@@ -50,7 +50,9 @@ rdown_min(size_t size, unsigned minbits)
static inline unsigned static inline unsigned
log2up(size_t sz) log2up(size_t sz)
{ {
if (sz == 1)
return (0);
assert(sz > 1);
sz--; sz--;
sz = bitsof(sz); sz = bitsof(sz);
assert(sz > 0); assert(sz > 0);
...@@ -58,11 +60,13 @@ log2up(size_t sz) ...@@ -58,11 +60,13 @@ log2up(size_t sz)
return ((unsigned) sz); return ((unsigned) sz);
} }
// #define log2down(x) (log2up(x+1) - 1)
/* prev log 2 of sz */ /* prev log 2 of sz */
static inline unsigned static inline unsigned
log2down(size_t sz) log2down(size_t sz)
{ {
assert(sz > 0);
sz = bitsof(sz) - 1; sz = bitsof(sz) - 1;
assert(sz <= UINT_MAX); assert(sz <= UINT_MAX);
return ((unsigned) sz); 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