c-vsnprintf和NULL输入字符串参数



当输入NULL字符串和/或大小为0时,vsnprintf的预期行为是什么,例如

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

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

这是未定义的行为还是有效的场景?它不会在输入字符串为NULL和长度为0的情况下崩溃,并返回-1(对于有效的非NULL字符串和零长度也是如此),但它确实会以另一种方式崩溃(NULL输入字符串和正长度)。

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不为零,您违反了一个约束,得到了未定义的行为。无论哪种方式,您都可能编写一个NULL指针来表示尊重,这也是未定义的行为。如果幸运的话,你的程序会崩溃。如果你没有,它会继续运行,并对你的程序做一些奇怪的事情。

引用C11,第7.21.6.12章,vsnprintf函数

vsnprintf函数等效于snprintf,具有变量参数列表由va_start宏(以及可能的后续va_arg调用)已经初始化的arg代替。[….]

然后,对于snprintf(),§7.21.6.5

[…]如果n为零,则不写入任何内容,并且s可以是空指针。

因此,定义了第一种情况,而第二种情况通过尝试访问无效(NULL)指针来调用未定义的行为。

最新更新