diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2019-06-14 19:05:54 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2019-06-14 19:05:54 +0300 |
commit | 84d38abbc982db405cfe7a45ed53c64745da5511 (patch) | |
tree | 03bfc61b8b6fe932def2e36c89dae37cbdaeefc9 /libgfortran/runtime/memory.c | |
parent | 66574c5374ecbd358e68d63922927fc03f2f232a (diff) | |
download | gcc-84d38abbc982db405cfe7a45ed53c64745da5511.zip gcc-84d38abbc982db405cfe7a45ed53c64745da5511.tar.gz gcc-84d38abbc982db405cfe7a45ed53c64745da5511.tar.bz2 |
Use __builtin_mul_overflow in xmallocarray
As GCC now provides builtins for doing integer overflow checking, lets
use it when checking for overflow in xmallocarray.
Regtested on x86_64-pc-linux-gnu.
libgfortran/ChangeLog:
2019-06-14 Janne Blomqvist <jb@gcc.gnu.org>
* runtime/memory.c (SIZE_MAX):Remove macro definition.
(xmallocarray): Use __builtin_mul_overflow.
From-SVN: r272295
Diffstat (limited to 'libgfortran/runtime/memory.c')
-rw-r--r-- | libgfortran/runtime/memory.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/libgfortran/runtime/memory.c b/libgfortran/runtime/memory.c index 1a3d33b..09a4ff8 100644 --- a/libgfortran/runtime/memory.c +++ b/libgfortran/runtime/memory.c @@ -26,10 +26,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "libgfortran.h" #include <errno.h> -#ifndef SIZE_MAX -#define SIZE_MAX ((size_t)-1) -#endif - void * xmalloc (size_t n) @@ -52,18 +48,17 @@ void * xmallocarray (size_t nmemb, size_t size) { void *p; + size_t prod; if (!nmemb || !size) - size = nmemb = 1; -#define HALF_SIZE_T (((size_t) 1) << (__CHAR_BIT__ * sizeof (size_t) / 2)) - else if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0) - && nmemb > SIZE_MAX / size) + prod = 1; + else if (__builtin_mul_overflow (nmemb, size, &prod)) { errno = ENOMEM; os_error ("Integer overflow in xmallocarray"); } - p = malloc (nmemb * size); + p = malloc (prod); if (!p) os_error ("Memory allocation failed in xmallocarray"); |