Avoid -Wuse-after-free in tests [BZ #26779].

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Martin Sebor 2022-01-25 15:39:38 -07:00
parent e4ba8fee1a
commit c094c232eb
6 changed files with 60 additions and 2 deletions

View File

@ -20,6 +20,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <support/support.h> #include <support/support.h>
#include <libc-diag.h>
#define SIZE 4096 #define SIZE 4096
@ -29,7 +30,15 @@ __attribute__((noinline))
call_free (void *ptr) call_free (void *ptr)
{ {
free (ptr); free (ptr);
#if __GNUC_PREREQ (12, 0)
/* Ignore a valid warning about using a pointer made indeterminate
by a prior call to free(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
*(size_t *)(ptr - sizeof (size_t)) = 1; *(size_t *)(ptr - sizeof (size_t)) = 1;
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
} }
int int

View File

@ -86,7 +86,15 @@ do_test (void)
merror ("errno is not set correctly."); merror ("errno is not set correctly.");
DIAG_POP_NEEDS_COMMENT; DIAG_POP_NEEDS_COMMENT;
#if __GNUC_PREREQ (12, 0)
/* Ignore a valid warning about using a pointer made indeterminate
by a prior call to realloc(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
free (p); free (p);
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
p = malloc (512); p = malloc (512);
if (p == NULL) if (p == NULL)
@ -104,7 +112,15 @@ do_test (void)
merror ("errno is not set correctly."); merror ("errno is not set correctly.");
DIAG_POP_NEEDS_COMMENT; DIAG_POP_NEEDS_COMMENT;
#if __GNUC_PREREQ (12, 0)
/* Ignore a valid warning about using a pointer made indeterminate
by a prior call to realloc(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
free (p); free (p);
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
free (q); free (q);
return errors != 0; return errors != 0;

View File

@ -95,7 +95,15 @@ test_large_allocations (size_t size)
DIAG_POP_NEEDS_COMMENT; DIAG_POP_NEEDS_COMMENT;
#endif #endif
TEST_VERIFY (errno == ENOMEM); TEST_VERIFY (errno == ENOMEM);
#if __GNUC_PREREQ (12, 0)
/* Ignore a warning about using a pointer made indeterminate by
a prior call to realloc(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
free (ptr_to_realloc); free (ptr_to_realloc);
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
for (size_t nmemb = 1; nmemb <= 8; nmemb *= 2) for (size_t nmemb = 1; nmemb <= 8; nmemb *= 2)
if ((size % nmemb) == 0) if ((size % nmemb) == 0)
@ -113,14 +121,30 @@ test_large_allocations (size_t size)
test_setup (); test_setup ();
TEST_VERIFY (reallocarray (ptr_to_realloc, nmemb, size / nmemb) == NULL); TEST_VERIFY (reallocarray (ptr_to_realloc, nmemb, size / nmemb) == NULL);
TEST_VERIFY (errno == ENOMEM); TEST_VERIFY (errno == ENOMEM);
#if __GNUC_PREREQ (12, 0)
/* Ignore a warning about using a pointer made indeterminate by
a prior call to realloc(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
free (ptr_to_realloc); free (ptr_to_realloc);
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
ptr_to_realloc = malloc (16); ptr_to_realloc = malloc (16);
TEST_VERIFY_EXIT (ptr_to_realloc != NULL); TEST_VERIFY_EXIT (ptr_to_realloc != NULL);
test_setup (); test_setup ();
TEST_VERIFY (reallocarray (ptr_to_realloc, size / nmemb, nmemb) == NULL); TEST_VERIFY (reallocarray (ptr_to_realloc, size / nmemb, nmemb) == NULL);
TEST_VERIFY (errno == ENOMEM); TEST_VERIFY (errno == ENOMEM);
#if __GNUC_PREREQ (12, 0)
/* Ignore a warning about using a pointer made indeterminate by
a prior call to realloc(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
free (ptr_to_realloc); free (ptr_to_realloc);
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
} }
else else
break; break;

View File

@ -20,8 +20,8 @@ verbose_malloc (size_t size)
static void static void
verbose_free (void *buf) verbose_free (void *buf)
{ {
free (buf);
printf ("free (%p)\n", buf); printf ("free (%p)\n", buf);
free (buf);
} }
static int static int

View File

@ -138,8 +138,16 @@ do_test (void)
if (ok == 0) if (ok == 0)
merror ("first 16 bytes were not correct after failed realloc"); merror ("first 16 bytes were not correct after failed realloc");
#if __GNUC_PREREQ (12, 0)
/* Ignore a valid warning about using a pointer made indeterminate
by a prior call to realloc(). */
DIAG_IGNORE_NEEDS_COMMENT (12, "-Wuse-after-free");
#endif
/* realloc (p, 0) frees p (C89) and returns NULL (glibc). */ /* realloc (p, 0) frees p (C89) and returns NULL (glibc). */
p = realloc (p, 0); p = realloc (p, 0);
#if __GNUC_PREREQ (12, 0)
DIAG_POP_NEEDS_COMMENT;
#endif
if (p != NULL) if (p != NULL)
merror ("realloc (p, 0) returned non-NULL."); merror ("realloc (p, 0) returned non-NULL.");

View File

@ -39,10 +39,11 @@ check_path (int fd)
char file_path[PATH_MAX]; char file_path[PATH_MAX];
ssize_t file_path_length ssize_t file_path_length
= readlink (proc_fd_path, file_path, sizeof (file_path)); = readlink (proc_fd_path, file_path, sizeof (file_path));
free (proc_fd_path);
if (file_path_length < 0) if (file_path_length < 0)
FAIL_EXIT1 ("readlink (%s, %p, %zu)", proc_fd_path, file_path, FAIL_EXIT1 ("readlink (%s, %p, %zu)", proc_fd_path, file_path,
sizeof (file_path)); sizeof (file_path));
free (proc_fd_path);
file_path[file_path_length] = '\0'; file_path[file_path_length] = '\0';
TEST_COMPARE_STRING (file_path, "/dev/null"); TEST_COMPARE_STRING (file_path, "/dev/null");
} }