vsnprintf和NULL输入字符串参数

时间:2016-05-11 21:23:15

标签: c string printf variadic-functions

vsnprintf在输入NULL字符串和/或size = 0时的预期行为是什么,例如

vsnprintf(NULL, 0, "%d", p);

vsnprintf(NULL, 10, "%d", p);

是未定义的行为还是有效的情况?它不会因输入字符串NULL和长度0而崩溃,并返回-1(对于有效的非NULL字符串和零长度相同),但它会以相反的方式崩溃around(NULL输入字符串和正长度)。

2 个答案:

答案 0 :(得分:4)

vsnprintf(NULL, 0, "%d", p);实际上是定义的行为。

  

7.19.6.5/2 snprintf函数等效于fprintf,但输出被写入数组(由参数s指定)   而不是流。如果n为零,则不写入任何内容,s可以   是一个空指针。 ...

     

7.19.6.12/2 vsnprintf函数等同于snprintf ...

vsnprintf(NULL, 10, "%d", p);不是。由于n不为零,因此您违反了约束,并且您获得了未定义的行为。无论哪种方式,您都可能写入deference一个NULL指针,这又是未定义的行为。如果你很幸运你的程序崩溃了。如果你不这样做,它会继续运行并为你的程序做些奇怪的事情。

答案 1 :(得分:2)

引用C11,章节§7.21.6.12, vsnprintf功能

  

vsnprintf函数等效于snprintf,带有变量参数列表   由arg替换,va_start已由va_arg宏初始化(和   可能是后续snprintf()次来电。 [....]

然后,对于n,§7.21.6.5

  

[...]如果s为零,则不写任何内容,NULL可能是空指针。

因此,您定义了第一个案例ID,而第二个案例ID通过尝试访问无效(<div id="inside_content"> </div> )指针来调用undefined behavior