source: mainline/common/include/stdlib.h@ 0437dd5

Last change on this file since 0437dd5 was dd50aa19, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 10 months ago

Allocation function tweaks

  • Add reallocarray() from POSIX 2024 for overflow-safe reallocations.
  • Make realloc(x, 0) act as realloc(x, 1), and print an error message because it's unspecified behavior. Previous handling of realloc(x, 0) as free(x) is problematic, because proper realloc use will mistake it for failure if the case isn't specifically checked for, leading to double-free.
  • Make malloc(0) act as malloc(1), since it "just works" when code forgets to specifically check for zero in cases where zero length is meaningful.
  • Property mode set to 100644
File size: 3.7 KB
Line 
1/*
2 * Copyright (c) 2005 Martin Decky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libc
30 * @{
31 */
32/** @file
33 */
34
35#ifndef _LIBC_STDLIB_H_
36#define _LIBC_STDLIB_H_
37
38#include <_bits/size_t.h>
39#include <_bits/wchar_t.h>
40#include <_bits/uchar.h>
41#include <_bits/decls.h>
42#include <bsearch.h>
43#include <qsort.h>
44
45#define EXIT_SUCCESS 0
46#define EXIT_FAILURE 1
47
48#define RAND_MAX 714025
49
50#define MB_CUR_MAX 4
51
52__C_DECLS_BEGIN;
53
54/** Type returned by the div function */
55typedef struct {
56 /** Quotient */
57 int quot;
58 /** Remainder */
59 int rem;
60} div_t;
61
62/** Type returned by the ldiv function */
63typedef struct {
64 /** Quotient */
65 long quot;
66 /** Remainder */
67 long rem;
68} ldiv_t;
69
70/** Type returned by the lldiv function */
71typedef struct {
72 /** Quotient */
73 long long quot;
74 /** Remainder */
75 long long rem;
76} lldiv_t;
77
78extern long double strtold(const char *, char **);
79
80extern int rand(void);
81extern void srand(unsigned int);
82
83extern void abort(void) __attribute__((noreturn));
84extern int atexit(void (*)(void));
85extern void exit(int) __attribute__((noreturn));
86extern void _Exit(int) __attribute__((noreturn));
87extern int at_quick_exit(void (*)(void));
88extern void quick_exit(int);
89
90extern char *getenv(const char *);
91extern int system(const char *);
92
93extern int abs(int);
94extern long labs(long);
95extern long long llabs(long long);
96
97extern int atoi(const char *);
98extern long atol(const char *);
99extern long long atoll(const char *);
100
101extern long strtol(const char *__restrict__, char **__restrict__, int);
102extern long long strtoll(const char *__restrict__, char **__restrict__, int);
103extern unsigned long strtoul(const char *__restrict__, char **__restrict__, int);
104extern unsigned long long strtoull(const char *__restrict__, char **__restrict__, int);
105
106extern div_t div(int, int);
107extern ldiv_t ldiv(long, long);
108extern lldiv_t lldiv(long long, long long);
109
110extern void *malloc(size_t size)
111 __attribute__((malloc));
112extern void *calloc(size_t nmemb, size_t size)
113 __attribute__((malloc));
114extern void *realloc(void *addr, size_t size)
115 __attribute__((warn_unused_result));
116extern void free(void *addr);
117
118#ifdef _HELENOS_SOURCE
119__HELENOS_DECLS_BEGIN;
120
121extern void *memalign(size_t align, size_t size)
122 __attribute__((malloc));
123
124extern void *reallocarray(void *ptr, size_t nelem, size_t elsize)
125 __attribute__((warn_unused_result));
126
127__HELENOS_DECLS_END;
128#endif
129
130__C_DECLS_END;
131
132#endif
133
134/** @}
135 */
Note: See TracBrowser for help on using the repository browser.