Permalink
Browse files

Speedup calloc size overflow check by preventing division if small va…

…lues

* malloc.c (GC_SQRT_SIZE_MAX): New macro.
* malloc.c (calloc): Add fast initial size overflow check to avoid
integer division for reasonably small values passed.
  • Loading branch information...
1 parent 6a93f8e commit 83231d0ab5ed60015797c3d1ad9056295ac3b2bb Hans Boehm committed with Mar 15, 2012
Showing with 4 additions and 1 deletion.
  1. +4 −1 malloc.c
View
5 malloc.c
@@ -381,9 +381,12 @@ void * malloc(size_t lb)
# define GC_SIZE_MAX (~(size_t)0)
#endif
+#define GC_SQRT_SIZE_MAX ((1U << (WORDSZ / 2)) - 1)
+
void * calloc(size_t n, size_t lb)
{
- if (lb && n > GC_SIZE_MAX / lb)
+ if ((lb | n) > GC_SQRT_SIZE_MAX /* fast initial test */
+ && lb && n > GC_SIZE_MAX / lb)
return NULL;
# if defined(GC_LINUX_THREADS) /* && !defined(USE_PROC_FOR_LIBRARIES) */
/* libpthread allocated some memory that is only pointed to by */

0 comments on commit 83231d0

Please sign in to comment.