]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/runtime/memory.c
Use __builtin_mul_overflow in xmallocarray
[thirdparty/gcc.git] / libgfortran / runtime / memory.c
CommitLineData
a2ffc2c4 1/* Memory management routines.
fbd26352 2 Copyright (C) 2002-2019 Free Software Foundation, Inc.
4ee9c684 3 Contributed by Paul Brook <paul@nowt.org>
4
5e62a3cc 5This file is part of the GNU Fortran runtime library (libgfortran).
4ee9c684 6
b417ea8c 7Libgfortran is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public
4ee9c684 9License as published by the Free Software Foundation; either
6bc9506f 10version 3 of the License, or (at your option) any later version.
b417ea8c 11
12Libgfortran is distributed in the hope that it will be useful,
4ee9c684 13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b417ea8c 15GNU General Public License for more details.
4ee9c684 16
6bc9506f 17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
4ee9c684 25
4ee9c684 26#include "libgfortran.h"
af1e9051 27#include <errno.h>
28
4ee9c684 29
4ee9c684 30void *
25c067ae 31xmalloc (size_t n)
4ee9c684 32{
33 void *p;
34
25c067ae 35 if (n == 0)
36 n = 1;
37
38 p = malloc (n);
39
4ee9c684 40 if (p == NULL)
41 os_error ("Memory allocation failed");
42
43 return p;
44}
45
46
af1e9051 47void *
48xmallocarray (size_t nmemb, size_t size)
49{
50 void *p;
6bc936d3 51 size_t prod;
af1e9051 52
53 if (!nmemb || !size)
6bc936d3 54 prod = 1;
55 else if (__builtin_mul_overflow (nmemb, size, &prod))
af1e9051 56 {
57 errno = ENOMEM;
58 os_error ("Integer overflow in xmallocarray");
59 }
60
6bc936d3 61 p = malloc (prod);
af1e9051 62
63 if (!p)
64 os_error ("Memory allocation failed in xmallocarray");
65
66 return p;
67}
68
69
33123ed7 70/* calloc wrapper that aborts on error. */
71
72void *
73xcalloc (size_t nmemb, size_t size)
74{
af1e9051 75 if (!nmemb || !size)
33123ed7 76 nmemb = size = 1;
77
78 void *p = calloc (nmemb, size);
79 if (!p)
80 os_error ("Allocating cleared memory failed");
81
82 return p;
83}
3e52c822 84
85
86void *
87xrealloc (void *ptr, size_t size)
88{
89 if (size == 0)
90 size = 1;
91
92 void *newp = realloc (ptr, size);
93 if (!newp)
94 os_error ("Memory allocation failure in xrealloc");
95
96 return newp;
97}