malloc: Add posix_memalign test.
[platform/upstream/glibc.git] / malloc / tst-posix_memalign.c
1 /* Copyright (C) 2013 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    <http://www.gnu.org/licenses/>.  */
17
18 #include <errno.h>
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <unistd.h>
23
24 static int errors = 0;
25
26 static void
27 merror (const char *msg)
28 {
29   ++errors;
30   printf ("Error: %s\n", msg);
31 }
32
33 static int
34 do_test (void)
35 {
36   void *p;
37   int ret;
38   unsigned long pagesize = getpagesize();
39   unsigned long ptrval;
40
41   p = NULL;
42
43   ret = posix_memalign (&p, sizeof (void *), -1);
44
45   if (ret != ENOMEM)
46     merror ("posix_memalign (&p, sizeof (void *), -1) succeeded.");
47
48   if (ret == ENOMEM && p != NULL)
49     merror ("returned an error but pointer was modified");
50
51   p = NULL;
52
53   ret = posix_memalign (&p, pagesize, -pagesize);
54
55   if (ret != ENOMEM)
56     merror ("posix_memalign (&p, pagesize, -pagesize) succeeded.");
57
58   p = NULL;
59
60   ret = posix_memalign (&p, sizeof (void *), 0);
61
62   if (ret != 0 || p == NULL)
63     merror ("posix_memalign (&p, sizeof (void *), 0) failed.");
64
65   free (p);
66
67   ret = posix_memalign (&p, 0x300, 10);
68
69   if (ret != EINVAL)
70     merror ("posix_memalign (&p, 0x300, 10) succeeded.");
71
72   ret = posix_memalign (&p, 0, 10);
73
74   if (ret != EINVAL)
75     merror ("posix_memalign (&p, 0, 10) succeeded.");
76
77   p = NULL;
78
79   ret = posix_memalign (&p, 0x100, 10);
80
81   if (ret != 0)
82     merror ("posix_memalign (&p, 0x100, 10) failed.");
83
84   if (ret == 0 && p == NULL)
85     merror ("returned success but pointer is NULL");
86
87   ptrval = (unsigned long)p;
88
89   if (ret == 0 && (ptrval & 0xff))
90     merror ("pointer is not aligned to 0x100");
91
92   free (p);
93
94   return errors != 0;
95 }
96
97 #define TEST_FUNCTION do_test ()
98 #include "../test-skeleton.c"