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
/* Test of malloc 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 "macros.h"
/* Work around clang bug
<https://github.com/llvm/llvm-project/issues/114772>. */
void *(*volatile my_malloc) (size_t) = malloc;
#undef malloc
#define malloc my_malloc
int
main (int argc, _GL_UNUSED char **argv)
{
/* Check that malloc (0) is not a NULL pointer. */
void *p = malloc (0);
ASSERT (p != NULL);
free (p);
/* Check that malloc (n) fails when n exceeds PTRDIFF_MAX. */
if (PTRDIFF_MAX < SIZE_MAX)
{
size_t one = argc != 12345;
p = malloc (PTRDIFF_MAX + one);
ASSERT (p == NULL);
ASSERT (errno == ENOMEM);
}
return test_exit_status;
}