xref: /dflybsd-src/lib/libc/stdlib/reallocarray.3 (revision d79aa16ac35fbe0bd81d40b6558ad7f2fd4c2205)
166932323SSascha Wildner.\" Copyright (c) 1980, 1991, 1993
266932323SSascha Wildner.\"	The Regents of the University of California.  All rights reserved.
366932323SSascha Wildner.\"
466932323SSascha Wildner.\" This code is derived from software contributed to Berkeley by
566932323SSascha Wildner.\" the American National Standards Committee X3, on Information
666932323SSascha Wildner.\" Processing Systems.
766932323SSascha Wildner.\"
866932323SSascha Wildner.\" Redistribution and use in source and binary forms, with or without
966932323SSascha Wildner.\" modification, are permitted provided that the following conditions
1066932323SSascha Wildner.\" are met:
1166932323SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright
1266932323SSascha Wildner.\"    notice, this list of conditions and the following disclaimer.
1366932323SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright
1466932323SSascha Wildner.\"    notice, this list of conditions and the following disclaimer in the
1566932323SSascha Wildner.\"    documentation and/or other materials provided with the distribution.
1666932323SSascha Wildner.\"
1766932323SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1866932323SSascha Wildner.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1966932323SSascha Wildner.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2066932323SSascha Wildner.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2166932323SSascha Wildner.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2266932323SSascha Wildner.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2366932323SSascha Wildner.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2466932323SSascha Wildner.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2566932323SSascha Wildner.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2666932323SSascha Wildner.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2766932323SSascha Wildner.\" SUCH DAMAGE.
2866932323SSascha Wildner.\"
2966932323SSascha Wildner.\" $FreeBSD: head/lib/libc/stdlib/reallocarray.3 282472 2015-05-05 10:44:17Z pluknet $
3066932323SSascha Wildner.\"
3164c3fdb4Szrj.Dd April 11, 2019
3266932323SSascha Wildner.Dt REALLOCARRAY 3
3366932323SSascha Wildner.Os
3466932323SSascha Wildner.Sh NAME
3564c3fdb4Szrj.Nm reallocarray ,
3664c3fdb4Szrj.Nm recallocarray
3764c3fdb4Szrj.Nd memory reallocation functions
3866932323SSascha Wildner.Sh LIBRARY
3966932323SSascha Wildner.Lb libc
4066932323SSascha Wildner.Sh SYNOPSIS
4166932323SSascha Wildner.In stdlib.h
4266932323SSascha Wildner.Ft void *
4366932323SSascha Wildner.Fn reallocarray "void *ptr" "size_t number" "size_t size"
4464c3fdb4Szrj.Ft void *
4564c3fdb4Szrj.Fn recallocarray "void *ptr" "size_t oldnmemb" "size_t nmemb" "size_t size"
4666932323SSascha Wildner.Sh DESCRIPTION
4766932323SSascha WildnerThe
4866932323SSascha Wildner.Fn reallocarray
4966932323SSascha Wildnerfunction is similar to the
5066932323SSascha Wildner.Fn realloc
5164c3fdb4Szrjfunction except it operates on
5266932323SSascha Wildner.Fa number
5366932323SSascha Wildnermembers of size
5466932323SSascha Wildner.Fa size
5566932323SSascha Wildnerand checks for integer overflow in the calculation
5666932323SSascha Wildner.Fa number
5766932323SSascha Wildner*
5866932323SSascha Wildner.Fa size .
5964c3fdb4Szrj.Pp
6064c3fdb4SzrjThe
6164c3fdb4Szrj.Fn recallocarray
6264c3fdb4Szrjfunction is similar to
6364c3fdb4Szrj.Fn reallocarray
6464c3fdb4Szrjexcept it ensures newly allocated memory is cleared similar to
6564c3fdb4Szrj.Fn calloc .
6666932323SSascha Wildner.Sh RETURN VALUES
6766932323SSascha WildnerThe
6866932323SSascha Wildner.Fn reallocarray
6966932323SSascha Wildnerfunction returns a pointer to the allocated space; otherwise, a
7066932323SSascha Wildner.Dv NULL
7166932323SSascha Wildnerpointer is returned and
7266932323SSascha Wildner.Va errno
7366932323SSascha Wildneris set to
7466932323SSascha Wildner.Er ENOMEM .
7566932323SSascha Wildner.Sh EXAMPLES
7666932323SSascha WildnerConsider
7766932323SSascha Wildner.Fn reallocarray
7866932323SSascha Wildnerwhen there is multiplication in the
7966932323SSascha Wildner.Fa size
8066932323SSascha Wildnerargument of
8166932323SSascha Wildner.Fn malloc
8266932323SSascha Wildneror
8366932323SSascha Wildner.Fn realloc .
8466932323SSascha WildnerFor example, avoid this common idiom as it may lead to integer overflow:
8566932323SSascha Wildner.Bd -literal -offset indent
8666932323SSascha Wildnerif ((p = malloc(num * size)) == NULL)
8766932323SSascha Wildner	err(1, "malloc");
8866932323SSascha Wildner.Ed
8966932323SSascha Wildner.Pp
9066932323SSascha WildnerA drop-in replacement is the
9166932323SSascha Wildner.Ox
9266932323SSascha Wildnerextension
9366932323SSascha Wildner.Fn reallocarray :
9466932323SSascha Wildner.Bd -literal -offset indent
9566932323SSascha Wildnerif ((p = reallocarray(NULL, num, size)) == NULL)
9666932323SSascha Wildner	err(1, "reallocarray");
9766932323SSascha Wildner.Ed
9866932323SSascha Wildner.Pp
9966932323SSascha WildnerWhen using
10066932323SSascha Wildner.Fn realloc ,
10166932323SSascha Wildnerbe careful to avoid the following idiom:
10266932323SSascha Wildner.Bd -literal -offset indent
10366932323SSascha Wildnersize += 50;
10466932323SSascha Wildnerif ((p = realloc(p, size)) == NULL)
10566932323SSascha Wildner	return (NULL);
10666932323SSascha Wildner.Ed
10766932323SSascha Wildner.Pp
10866932323SSascha WildnerDo not adjust the variable describing how much memory has been allocated
10966932323SSascha Wildneruntil the allocation has been successful.
11066932323SSascha WildnerThis can cause aberrant program behavior if the incorrect size value is used.
11166932323SSascha WildnerIn most cases, the above sample will also result in a leak of memory.
11266932323SSascha WildnerAs stated earlier, a return value of
11366932323SSascha Wildner.Dv NULL
11466932323SSascha Wildnerindicates that the old object still remains allocated.
11566932323SSascha WildnerBetter code looks like this:
11666932323SSascha Wildner.Bd -literal -offset indent
11766932323SSascha Wildnernewsize = size + 50;
11866932323SSascha Wildnerif ((newp = realloc(p, newsize)) == NULL) {
11966932323SSascha Wildner	free(p);
12066932323SSascha Wildner	p = NULL;
12166932323SSascha Wildner	size = 0;
12266932323SSascha Wildner	return (NULL);
12366932323SSascha Wildner}
12466932323SSascha Wildnerp = newp;
12566932323SSascha Wildnersize = newsize;
12666932323SSascha Wildner.Ed
12766932323SSascha Wildner.Pp
12866932323SSascha WildnerAs with
12966932323SSascha Wildner.Fn malloc ,
13066932323SSascha Wildnerit is important to ensure the new size value will not overflow;
13166932323SSascha Wildneri.e. avoid allocations like the following:
13266932323SSascha Wildner.Bd -literal -offset indent
13366932323SSascha Wildnerif ((newp = realloc(p, num * size)) == NULL) {
13466932323SSascha Wildner	...
13566932323SSascha Wildner.Ed
13666932323SSascha Wildner.Pp
13766932323SSascha WildnerInstead, use
13866932323SSascha Wildner.Fn reallocarray :
13966932323SSascha Wildner.Bd -literal -offset indent
14066932323SSascha Wildnerif ((newp = reallocarray(p, num, size)) == NULL) {
14166932323SSascha Wildner	...
14266932323SSascha Wildner.Ed
14366932323SSascha Wildner.Sh SEE ALSO
14466932323SSascha Wildner.Xr realloc 3
14566932323SSascha Wildner.Sh HISTORY
14666932323SSascha WildnerThe
14766932323SSascha Wildner.Fn reallocarray
14866932323SSascha Wildnerfunction first appeared in
149*d79aa16aSSascha Wildner.Ox 5.6
150*d79aa16aSSascha Wildnerand
151*d79aa16aSSascha Wildner.Dx 5.5 .
15264c3fdb4Szrj.Pp
15364c3fdb4SzrjThe
15464c3fdb4Szrj.Fn recallocarray
15564c3fdb4Szrjfunction appeared in
15664c3fdb4Szrj.Ox 6.1
15766932323SSascha Wildnerand
158*d79aa16aSSascha Wildner.Dx 5.5 .
159