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>