1 /* Copyright (C) 2005-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <errno.h>
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <libc-diag.h>
22 
23 static int errors = 0;
24 
25 static void
merror(const char * msg)26 merror (const char *msg)
27 {
28   ++errors;
29   printf ("Error: %s\n", msg);
30 }
31 
32 static int
do_test(void)33 do_test (void)
34 {
35   void *p, *q;
36 
37   errno = 0;
38 
39   DIAG_PUSH_NEEDS_COMMENT;
40 #if __GNUC_PREREQ (7, 0)
41   /* GCC 7 warns about too-large allocations; here we want to test
42      that they fail.  */
43   DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
44 #endif
45   p = malloc (-1);
46   DIAG_POP_NEEDS_COMMENT;
47 
48   if (p != NULL)
49     merror ("malloc (-1) succeeded.");
50   else if (errno != ENOMEM)
51     merror ("errno is not set correctly.");
52 
53   p = malloc (10);
54   if (p == NULL)
55     merror ("malloc (10) failed.");
56 
57   p = realloc (p, 0);
58   if (p != NULL)
59     merror ("realloc (p, 0) failed.");
60 
61   p = malloc (0);
62   if (p == NULL)
63     merror ("malloc (0) failed.");
64 
65   p = realloc (p, 0);
66   if (p != NULL)
67     merror ("realloc (p, 0) failed.");
68 
69   q = malloc (256);
70   if (q == NULL)
71     merror ("malloc (256) failed.");
72 
73   p = malloc (512);
74   if (p == NULL)
75     merror ("malloc (512) failed.");
76 
77   DIAG_PUSH_NEEDS_COMMENT;
78 #if __GNUC_PREREQ (7, 0)
79   /* GCC 7 warns about too-large allocations; here we want to test
80      that they fail.  */
81   DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
82 #endif
83   if (realloc (p, -256) != NULL)
84     merror ("realloc (p, -256) succeeded.");
85   else if (errno != ENOMEM)
86     merror ("errno is not set correctly.");
87   DIAG_POP_NEEDS_COMMENT;
88 
89 #if __GNUC_PREREQ (12, 0)
90   /* Ignore a valid warning about using a pointer made indeterminate
91      by a prior call to realloc().  */
92   DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
93 #endif
94   free (p);
95 #if __GNUC_PREREQ (12, 0)
96   DIAG_POP_NEEDS_COMMENT;
97 #endif
98 
99   p = malloc (512);
100   if (p == NULL)
101     merror ("malloc (512) failed.");
102 
103   DIAG_PUSH_NEEDS_COMMENT;
104 #if __GNUC_PREREQ (7, 0)
105   /* GCC 7 warns about too-large allocations; here we want to test
106      that they fail.  */
107   DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
108 #endif
109   if (realloc (p, -1) != NULL)
110     merror ("realloc (p, -1) succeeded.");
111   else if (errno != ENOMEM)
112     merror ("errno is not set correctly.");
113   DIAG_POP_NEEDS_COMMENT;
114 
115 #if __GNUC_PREREQ (12, 0)
116   /* Ignore a valid warning about using a pointer made indeterminate
117      by a prior call to realloc().  */
118   DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
119 #endif
120   free (p);
121 #if __GNUC_PREREQ (12, 0)
122   DIAG_POP_NEEDS_COMMENT;
123 #endif
124   free (q);
125 
126   return errors != 0;
127 }
128 
129 #define TEST_FUNCTION do_test ()
130 #include "../test-skeleton.c"
131