What is the expected behavior of vsnprintf when it has an input NULL string and/or size=0, e.g.
vsnprintf(NULL, 0, "%d", p);
or
vsnprintf(NULL, 10, "%d", p);
Is it undefined behavior or valid scenario? It doesn't crash with both input string as NULL and its length as 0, and returns -1 (the same for valid non-NULL string and zero length), however it does crash the other way around (NULL input string and positive length).
vsnprintf(NULL, 0, "%d", p); is actually defined behavior.
7.19.6.5/2 The
snprintffunction is equivalent tofprintf, except that the output is written into an array (specified by arguments) rather than to a stream. If n is zero, nothing is written,andsmay be a null pointer. ...7.19.6.12/2 The
vsnprintffunction is equivalent tosnprintf...
vsnprintf(NULL, 10, "%d", p); is not. Since n is not zero, you've violated a constraint and you got undefined behavior. Either way, you're likely writing to deference a NULL pointer which is again undefined behavior. If you're lucky your program crashes. If you're not, it'll keep running and do weird things to your program.
Quoting C11, chapter §7.21.6.12, The vsnprintf function
The
vsnprintffunction is equivalent tosnprintf, with the variable argument list replaced byarg, which shall have been initialized by theva_startmacro (and possibly subsequentva_argcalls). [....]
and then, for snprintf(), §7.21.6.5
[...] If
nis zero, nothing is written, andsmay be a null pointer.
So, your first case is defined, while the second case invokes undefined behavior by attempting to access an invalid (NULL) pointer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With