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