Use __builtin_mul_overflow in xmallocarray
authorJanne Blomqvist <jb@gcc.gnu.org>
Fri, 14 Jun 2019 16:05:54 +0000 (19:05 +0300)
committerJanne Blomqvist <jb@gcc.gnu.org>
Fri, 14 Jun 2019 16:05:54 +0000 (19:05 +0300)
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

libgfortran/ChangeLog
libgfortran/runtime/memory.c

index 19c297efa32c7fc9231882ba022a95159706981a..013a03eff119b42d4a8723ac4e5a612ce1b96c4e 100644 (file)
@@ -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
index 1a3d33b59dd29e9b38c387b50366dd0842ba268a..09a4ff8733fff458ee9893ba46c44edd6184fa3e 100644 (file)
@@ -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");