summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2021-08-07 18:17:55 +0200
committerBruno Haible <bruno@clisp.org>2021-08-07 18:17:55 +0200
commita2dcb11b99a4f3b52c6df3c4657405cb857b0e63 (patch)
tree45bdc1546898da30c23e976e3403fabfc4a4ec5e /lib
parentd57726cabd19ee22e9ab9c00ca53bc7eaa368f8e (diff)
downloadgnulib-a2dcb11b99a4f3b52c6df3c4657405cb857b0e63.tar.gz
stdio: Improve GCC 11 allocation-deallocation checking.
* lib/stdio.in.h (fdopen, fopen, tmpfile): Declare that deallocation must happen through 'fclose'. (popen): Declare that deallocation must happen through 'pclose'. * lib/stdio-safer.h (fopen_safer, tmpfile_safer): Declare that deallocation must happen through 'fclose'. (popen_safer): Declare that deallocation must happen through 'pclose'. (freopen_safer): Declare that arguments must be non-NULL.
Diffstat (limited to 'lib')
-rw-r--r--lib/stdio-safer.h12
-rw-r--r--lib/stdio.in.h20
2 files changed, 20 insertions, 12 deletions
diff --git a/lib/stdio-safer.h b/lib/stdio-safer.h
index 464ffcf933..53ee971b47 100644
--- a/lib/stdio-safer.h
+++ b/lib/stdio-safer.h
@@ -20,17 +20,21 @@
#include <stdio.h>
#if GNULIB_FOPEN_SAFER
-FILE *fopen_safer (char const *, char const *);
+FILE *fopen_safer (char const *, char const *)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1);
#endif
#if GNULIB_FREOPEN_SAFER
-FILE *freopen_safer (char const *, char const *, FILE *);
+FILE *freopen_safer (char const *, char const *, FILE *)
+ _GL_ARG_NONNULL ((2, 3));
#endif
#if GNULIB_POPEN_SAFER
-FILE *popen_safer (char const *, char const *);
+FILE *popen_safer (char const *, char const *)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1);
#endif
#if GNULIB_TMPFILE_SAFER
-FILE *tmpfile_safer (void);
+FILE *tmpfile_safer (void)
+ _GL_ATTRIBUTE_DEALLOC (fclose, 1);
#endif
diff --git a/lib/stdio.in.h b/lib/stdio.in.h
index 20ba488a47..7986f72d10 100644
--- a/lib/stdio.in.h
+++ b/lib/stdio.in.h
@@ -260,8 +260,9 @@ _GL_CXXALIASWARN (fcloseall);
# undef fdopen
# define fdopen rpl_fdopen
# endif
-_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
- _GL_ARG_NONNULL ((2)));
+_GL_FUNCDECL_RPL (fdopen, FILE *,
+ (int fd, const char *mode)
+ _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
# elif defined _WIN32 && !defined __CYGWIN__
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -380,7 +381,7 @@ _GL_CXXALIASWARN (fileno);
# endif
_GL_FUNCDECL_RPL (fopen, FILE *,
(const char *restrict filename, const char *restrict mode)
- _GL_ARG_NONNULL ((1, 2)));
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
_GL_CXXALIAS_RPL (fopen, FILE *,
(const char *restrict filename, const char *restrict mode));
# else
@@ -1009,13 +1010,15 @@ _GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
# undef popen
# define popen rpl_popen
# endif
-_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
- _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_RPL (popen, FILE *,
+ (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
# else
# if !@HAVE_POPEN@
-_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
- _GL_ARG_NONNULL ((1, 2)));
+_GL_FUNCDECL_SYS (popen, FILE *,
+ (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
# endif
_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
# endif
@@ -1346,7 +1349,8 @@ _GL_CXXALIASWARN (tempnam);
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# define tmpfile rpl_tmpfile
# endif
-_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
+ _GL_ATTRIBUTE_DEALLOC (fclose, 1));
_GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
# else
_GL_CXXALIAS_SYS (tmpfile, FILE *, (void));