vsnprintf and friends modify the va_list argument
Doug Hardie
bc979 at lafn.org
Mon Nov 17 19:15:39 UTC 2014
> On 16 November 2014, at 18:08, Polytropon <freebsd at edvax.de> wrote:
>
> On Sun, 16 Nov 2014 14:15:10 -0800, Doug Hardie wrote:
>> I suspect this needs to be in a WARNING section of the
>> printf(3) man page. The print functions that use variable
>> arguments modify the argument list so that only one can
>> be called.
>
> In "man 3 printf" there is no mentioning that ap is
> being modified, but "man 3 stdarg" where va_start(),
> va_arg(), va_copy() and va_end() are being described,
> states the following (see 3rd sentence):
>
> The va_arg() macro expands to an expression that has the type and value
> of the next argument in the call. The parameter ap is the va_list ap
> initialized by va_start(). Each call to va_arg() modifies ap so that the
> next call returns the next argument. The parameter type is a type name
> specified so that the type of a pointer to an object that has the speci-
> fied type can be obtained simply by adding a * to type.
>
> It's important to understand that functions like vsnprintf(),
> vprintf() and fprintf() rely on the va_* functions / macros
> which _modify_ the va_list pointer.
I had guessed that might be the case, but didn’t take the time to research that far. I had a problem to resolve.
>
> An additional hint is provided by the vprintf() prototypes
> where no "const" is mentioned in regards of the ap parameter:
>
> int vprintf(const char * restrict format, va_list ap);
Thats pretty obtuse ;-)
>
> Maybe adding stdarg(3) to printf(3)'s SEE ALSO section would
> be a helpful choice here.
Probably, but I would normally never chase things that far to figure out there would be a problem. I believe a warning like you quoted above in the printf man page would be more likely to be noticed.
More information about the freebsd-questions
mailing list