diff options
author | DJ Delorie <dj@redhat.com> | 2023-03-21 00:46:43 -0400 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2023-05-08 16:40:10 -0400 |
commit | d1417176a35d27ffb8da0ffb1e33154163b6eeb2 (patch) | |
tree | aa3e8cd61cadf5fec88e4cf57cfaf4b0e0ae6538 /malloc/tst-aligned-alloc.c | |
parent | cea74a4a24c36202309e8254f1f938e2166488f3 (diff) | |
download | glibc-d1417176a35d27ffb8da0ffb1e33154163b6eeb2.zip glibc-d1417176a35d27ffb8da0ffb1e33154163b6eeb2.tar.gz glibc-d1417176a35d27ffb8da0ffb1e33154163b6eeb2.tar.bz2 |
aligned_alloc: conform to C17
This patch adds the strict checking for power-of-two alignments
in aligned_alloc(), and updates the manual accordingly.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'malloc/tst-aligned-alloc.c')
-rw-r--r-- | malloc/tst-aligned-alloc.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/malloc/tst-aligned-alloc.c b/malloc/tst-aligned-alloc.c new file mode 100644 index 0000000..8bd6527 --- /dev/null +++ b/malloc/tst-aligned-alloc.c @@ -0,0 +1,80 @@ +/* Test for C17 alignment requirements. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <malloc.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <libc-diag.h> +#include <support/check.h> + +static int +do_test (void) +{ + void *p1; + void *p2; + void *p3; + void *p4; + void *p5; + + errno = 0; + + /* The implementation supports alignments that are non-negative powers of 2. + We test 5 distinct conditions here: + - A non-negative power of 2 alignment e.g. 64. + - A degenerate zero power of 2 alignment e.g. 1. + - A non-power-of-2 alignment e.g. 65. + - A zero alignment. + - A corner case SIZE_MAX / 2 + 1 alignment. + */ + + p1 = aligned_alloc (64, 64); + + if (p1 == NULL) + FAIL_EXIT1 ("aligned_alloc(64, 64) failed"); + + p2 = aligned_alloc (1, 64); + + if (p2 == NULL) + FAIL_EXIT1 ("aligned_alloc(1, 64) failed"); + + p3 = aligned_alloc (65, 64); + + if (p3 != NULL) + FAIL_EXIT1 ("aligned_alloc(65, 64) did not fail"); + + p4 = aligned_alloc (0, 64); + + if (p4 != NULL) + FAIL_EXIT1 ("aligned_alloc(0, 64) did not fail"); + + /* This is an alignment like 0x80000000...UL */ + p5 = aligned_alloc (SIZE_MAX / 2 + 1, 64); + + if (p5 != NULL) + FAIL_EXIT1 ("aligned_alloc(SIZE_MAX/2+1, 64) did not fail"); + + free (p1); + free (p2); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |