Add (x != 0) assertion to lg_floor(x).
lg_floor(0) is undefined, but depending on compiler options may not cause a crash. This assertion makes it harder to accidentally abuse lg_floor().
This commit is contained in:
parent
f500a10b2e
commit
c810fcea1f
@ -136,14 +136,14 @@ JEMALLOC_ALWAYS_INLINE int
|
|||||||
jemalloc_ffsl(long bitmap)
|
jemalloc_ffsl(long bitmap)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (JEMALLOC_INTERNAL_FFSL(bitmap));
|
return (JEMALLOC_INTERNAL_FFSL(bitmap));
|
||||||
}
|
}
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE int
|
JEMALLOC_ALWAYS_INLINE int
|
||||||
jemalloc_ffs(int bitmap)
|
jemalloc_ffs(int bitmap)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (JEMALLOC_INTERNAL_FFS(bitmap));
|
return (JEMALLOC_INTERNAL_FFS(bitmap));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the smallest power of 2 that is >= x. */
|
/* Compute the smallest power of 2 that is >= x. */
|
||||||
@ -170,6 +170,8 @@ lg_floor(size_t x)
|
|||||||
{
|
{
|
||||||
size_t ret;
|
size_t ret;
|
||||||
|
|
||||||
|
assert(x != 0);
|
||||||
|
|
||||||
asm ("bsr %1, %0"
|
asm ("bsr %1, %0"
|
||||||
: "=r"(ret) // Outputs.
|
: "=r"(ret) // Outputs.
|
||||||
: "r"(x) // Inputs.
|
: "r"(x) // Inputs.
|
||||||
@ -180,22 +182,26 @@ lg_floor(size_t x)
|
|||||||
JEMALLOC_INLINE size_t
|
JEMALLOC_INLINE size_t
|
||||||
lg_floor(size_t x)
|
lg_floor(size_t x)
|
||||||
{
|
{
|
||||||
unsigned long ret;
|
unsigned long ret;
|
||||||
|
|
||||||
|
assert(x != 0);
|
||||||
|
|
||||||
#if (LG_SIZEOF_PTR == 3)
|
#if (LG_SIZEOF_PTR == 3)
|
||||||
_BitScanReverse64(&ret, x);
|
_BitScanReverse64(&ret, x);
|
||||||
#elif (LG_SIZEOF_PTR == 2)
|
#elif (LG_SIZEOF_PTR == 2)
|
||||||
_BitScanReverse(&ret, x);
|
_BitScanReverse(&ret, x);
|
||||||
#else
|
#else
|
||||||
# error "Unsupported type sizes for lg_floor()"
|
# error "Unsupported type sizes for lg_floor()"
|
||||||
#endif
|
#endif
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
#elif (defined(JEMALLOC_HAVE_BUILTIN_CLZ))
|
#elif (defined(JEMALLOC_HAVE_BUILTIN_CLZ))
|
||||||
JEMALLOC_INLINE size_t
|
JEMALLOC_INLINE size_t
|
||||||
lg_floor(size_t x)
|
lg_floor(size_t x)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
assert(x != 0);
|
||||||
|
|
||||||
#if (LG_SIZEOF_PTR == LG_SIZEOF_INT)
|
#if (LG_SIZEOF_PTR == LG_SIZEOF_INT)
|
||||||
return (((8 << LG_SIZEOF_PTR) - 1) - __builtin_clz(x));
|
return (((8 << LG_SIZEOF_PTR) - 1) - __builtin_clz(x));
|
||||||
#elif (LG_SIZEOF_PTR == LG_SIZEOF_LONG)
|
#elif (LG_SIZEOF_PTR == LG_SIZEOF_LONG)
|
||||||
@ -209,6 +215,8 @@ JEMALLOC_INLINE size_t
|
|||||||
lg_floor(size_t x)
|
lg_floor(size_t x)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
assert(x != 0);
|
||||||
|
|
||||||
x |= (x >> 1);
|
x |= (x >> 1);
|
||||||
x |= (x >> 2);
|
x |= (x >> 2);
|
||||||
x |= (x >> 4);
|
x |= (x >> 4);
|
||||||
|
Loading…
Reference in New Issue
Block a user