summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2019-06-14 19:05:54 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2019-06-14 19:05:54 +0300
commit84d38abbc982db405cfe7a45ed53c64745da5511 (patch)
tree03bfc61b8b6fe932def2e36c89dae37cbdaeefc9 /libgfortran
parent66574c5374ecbd358e68d63922927fc03f2f232a (diff)
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')
-rw-r--r--libgfortran/ChangeLog5
-rw-r--r--libgfortran/runtime/memory.c13
2 files changed, 9 insertions, 9 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 19c297efa32..013a03eff11 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-14 Janne Blomqvist <jb@gcc.gnu.org>
+
+ * runtime/memory.c (SIZE_MAX):Remove macro definition.
+ (xmallocarray): Use __builtin_mul_overflow.
+
2019-05-22 Jeff Law <law@redhat.com>
PR fortran/89100
diff --git a/libgfortran/runtime/memory.c b/libgfortran/runtime/memory.c
index 1a3d33b59dd..09a4ff8733f 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");