Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
The va_list pointer is unspecified after a call to vfprintf [BZ #18982]
This adjusts the documentation to the existing implementation.
  • Loading branch information
Florian Weimer committed Oct 17, 2015
1 parent 213938e commit f546f87
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 17 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
@@ -1,3 +1,9 @@
2015-10-17 Florian Weimer <fweimer@redhat.com>

[BZ #18982]
* manual/stdio.texi (Variable Arguments Output): Add portability
note, explaining that vfprintf clobbers the va_list pointer.

2015-10-16 Joseph Myers <joseph@codesourcery.com>

* math/libm-test.inc (fabs_test_data): Add more tests.
Expand Down
6 changes: 3 additions & 3 deletions NEWS
Expand Up @@ -18,9 +18,9 @@ Version 2.23
18790, 18795, 18796, 18803, 18820, 18823, 18824, 18825, 18857, 18863,
18870, 18872, 18873, 18875, 18887, 18918, 18921, 18928, 18951, 18952,
18953, 18956, 18961, 18966, 18967, 18969, 18970, 18977, 18980, 18981,
18985, 19003, 19007, 19012, 19016, 19018, 19032, 19046, 19049, 19050,
19059, 19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088,
19094, 19095, 19124, 19125, 19129, 19134, 19137.
18982, 18985, 19003, 19007, 19012, 19016, 19018, 19032, 19046, 19049,
19050, 19059, 19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086,
19088, 19094, 19095, 19124, 19125, 19129, 19134, 19137.

* The LD_POINTER_GUARD environment variable can no longer be used to
disable the pointer guard feature. It is always enabled.
Expand Down
24 changes: 10 additions & 14 deletions manual/stdio.texi
Expand Up @@ -2621,20 +2621,16 @@ choice, you are ready to call @code{vprintf}. That argument and all
subsequent arguments that were passed to your function are used by
@code{vprintf} along with the template that you specified separately.

In some other systems, the @code{va_list} pointer may become invalid
after the call to @code{vprintf}, so you must not use @code{va_arg}
after you call @code{vprintf}. Instead, you should call @code{va_end}
to retire the pointer from service. However, you can safely call
@code{va_start} on another pointer variable and begin fetching the
arguments again through that pointer. Calling @code{vprintf} does not
destroy the argument list of your function, merely the particular
pointer that you passed to it.

GNU C does not have such restrictions. You can safely continue to fetch
arguments from a @code{va_list} pointer after passing it to
@code{vprintf}, and @code{va_end} is a no-op. (Note, however, that
subsequent @code{va_arg} calls will fetch the same arguments which
@code{vprintf} previously used.)
@strong{Portability Note:} The value of the @code{va_list} pointer is
undetermined after the call to @code{vprintf}, so you must not use
@code{va_arg} after you call @code{vprintf}. Instead, you should call
@code{va_end} to retire the pointer from service. You can call
@code{va_start} again and begin fetching the arguments from the start of
the variable argument list. (Alternatively, you can use @code{va_copy}
to make a copy of the @code{va_list} pointer before calling
@code{vfprintf}.) Calling @code{vprintf} does not destroy the argument
list of your function, merely the particular pointer that you passed to
it.

Prototypes for these functions are declared in @file{stdio.h}.
@pindex stdio.h
Expand Down

0 comments on commit f546f87

Please sign in to comment.