Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Nov 2014 11:15:28 -0800
From:      Doug Hardie <bc979@lafn.org>
To:        Polytropon <freebsd@edvax.de>
Cc:        "freebsd-questions@freebsd.org" <freebsd-questions@freebsd.org>
Subject:   Re: vsnprintf and friends modify the va_list argument
Message-ID:  <617C3C28-2107-4D41-9E59-4C002FBDD33D@lafn.org>
In-Reply-To: <20141117030844.d83bbae3.freebsd@edvax.de>
References:  <C9A11AB7-0085-464E-A6FB-F6A3603B6372@lafn.org> <20141117030844.d83bbae3.freebsd@edvax.de>

next in thread | previous in thread | raw e-mail | index | archive | help

> On 16 November 2014, at 18:08, Polytropon <freebsd@edvax.de> wrote:
>=20
> 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.
>=20
> 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):
>=20
>     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.
>=20
> 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=E2=80=99t take the time =
to research that far.  I had a problem to resolve.

>=20
> An additional hint is provided by the vprintf() prototypes
> where no "const" is mentioned in regards of the ap parameter:
>=20
> 	int vprintf(const char * restrict format, va_list ap);

Thats pretty obtuse ;-)

>=20
> 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.






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?617C3C28-2107-4D41-9E59-4C002FBDD33D>