Hash :
41be6842
Author :
Date :
2024-11-04T09:38:03
malloc etc. tests: use volatile more consistently Typically it’s ineffective to use ‘void *volatile p’ when testing malloc and similar functions, as the compiler can optimize the call to malloc before assigning the result to the volatile pointer variable. Instead, be more systematic about calling malloc through a volatile function pointer so that the compiler cannot infer that it is a malloc call. This fix can’t be done for alloca-like functions which may not have a function address, so continue to trust to luck there. * tests/test-aligned-malloc.c (aligned4_malloc, aligned4_free) (aligned8_malloc, aligned8_free, aligned16_malloc) (aligned16_free, aligned32_malloc, aligned32_free): * tests/test-aligned_alloc.c (aligned_alloc): * tests/test-calloc-gnu.c (calloc): * tests/test-free.c (free): * tests/test-malloc-gnu.c (malloc): * tests/test-reallocarray.c (reallocarray): Test indirectly, by calling through a volatile pointer. * tests/test-aligned-malloc.c, tests/test-aligned_alloc.c: * tests/test-calloc-gnu.c, tests/test-calloc-posix.c: * tests/test-free.c, tests/test-malloc-gnu.c: * tests/test-malloc-posix.c, tests/test-realloc-posix.c: * tests/test-reallocarray.c: (main) Don’t bother making data pointers olatile, as it’s ineffective. * tests/test-calloc-gnu.c (identity): * tests/test-free.c (get_errno, get_errno_func): Remove; all uses removed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
/* Test of reallocarray function.
Copyright (C) 2010-2024 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
/* Specification. */
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
#include "signature.h"
SIGNATURE_CHECK (reallocarray, void *, (void *, size_t, size_t));
#include "macros.h"
/* Work around clang bug
<https://github.com/llvm/llvm-project/issues/114772>. */
void *(*volatile my_reallocarray) (void *, size_t, size_t) = reallocarray;
#undef reallocarray
#define reallocarray my_reallocarray
int
main ()
{
/* Check that reallocarray fails when requested to allocate a block
of memory larger than PTRDIFF_MAX or SIZE_MAX bytes. */
for (size_t n = 2; n != 0; n <<= 1)
{
void *p = NULL;
if (PTRDIFF_MAX / n + 1 <= SIZE_MAX)
{
p = reallocarray (p, PTRDIFF_MAX / n + 1, n);
ASSERT (p == NULL);
ASSERT (errno == ENOMEM);
}
p = reallocarray (p, SIZE_MAX / n + 1, n);
ASSERT (p == NULL);
ASSERT (errno == ENOMEM
|| errno == EOVERFLOW /* NetBSD */);
/* Reallocarray should not crash with zero sizes. */
p = reallocarray (p, 0, n);
p = reallocarray (p, n, 0);
free (p);
}
return test_exit_status;
}