Mercurial > gnulib
changeset 14442:099915a3d0a0
stdio: don't require ignore_value around fwrite
This patch works around libc bug 11959
<http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>.
Without this patch, applications must often write
ignore_value (fwrite (...)) even though the ignore_value is
not helpful here. It's common to write many objects, using
fwrite/printf/etc., and then use ferror to detect output error.
I considered making this patch optional, but decided against it,
because libc is obviously being inconsistent here: there is no
reason libc should insist that user code must inspect fwrite
return's value without also insisting that it inspect printf's,
putchar's, etc. If user code wants to have a strict style where
all these functions' values are checked (so that ferror need not
be checked), we could add support for that style in a new gnulib
module, but in the meantime it's better to be consistent and to
support common usage.
* lib/stdio.in.h (rpl_fwrite): Define this wrapper around fwrite,
to work around libc bug 11959, if __USE_FORTIFY_LEVEL indicates
that we are compiling in checking mode, and if not C++, and
if not already wrapping fwrite for some other reason.
(fwrite): #define to rpl_fwrite if the latter is defined.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Sun, 20 Mar 2011 20:02:28 -0700 |
parents | 9d264f6041b5 |
children | fa909c29c50e |
files | ChangeLog lib/stdio.in.h |
diffstat | 2 files changed, 44 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Sun Mar 20 22:34:13 2011 +0100 +++ b/ChangeLog Sun Mar 20 20:02:28 2011 -0700 @@ -1,3 +1,30 @@ +2011-03-20 Paul Eggert <eggert@cs.ucla.edu> + + stdio: don't require ignore_value around fwrite + + This patch works around libc bug 11959 + <http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>. + Without this patch, applications must often write + ignore_value (fwrite (...)) even though the ignore_value is + not helpful here. It's common to write many objects, using + fwrite/printf/etc., and then use ferror to detect output error. + + I considered making this patch optional, but decided against it, + because libc is obviously being inconsistent here: there is no + reason libc should insist that user code must inspect fwrite + return's value without also insisting that it inspect printf's, + putchar's, etc. If user code wants to have a strict style where + all these functions' values are checked (so that ferror need not + be checked), we could add support for that style in a new gnulib + module, but in the meantime it's better to be consistent and to + support common usage. + + * lib/stdio.in.h (rpl_fwrite): Define this wrapper around fwrite, + to work around libc bug 11959, if __USE_FORTIFY_LEVEL indicates + that we are compiling in checking mode, and if not C++, and + if not already wrapping fwrite for some other reason. + (fwrite): #define to rpl_fwrite if the latter is defined. + 2011-03-20 Bruno Haible <bruno@clisp.org> verror: Fix compilation error introduced on 2011-02-13.
--- a/lib/stdio.in.h Sun Mar 20 22:34:13 2011 +0100 +++ b/lib/stdio.in.h Sun Mar 20 20:02:28 2011 -0700 @@ -496,6 +496,23 @@ # else _GL_CXXALIAS_SYS (fwrite, size_t, (const void *ptr, size_t s, size_t n, FILE *stream)); + +/* Work around glibc bug 11959 + <http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>, + which sometimes causes an unwanted diagnostic for fwrite calls. + This affects only function declaration attributes, so it's not + needed for C++. */ +# if !defined __cplusplus && 0 < __USE_FORTIFY_LEVEL +static inline size_t _GL_ARG_NONNULL ((1, 4)) +rpl_fwrite (const void *ptr, size_t s, size_t n, FILE *stream) +{ + size_t r = fwrite (ptr, s, n, stream); + (void) r; + return r; +} +# undef fwrite +# define fwrite rpl_fwrite +# endif # endif _GL_CXXALIASWARN (fwrite); #endif