是否定义了带有 `NULL` 格式字符串的 `sprintf` 的行为?
Is the behavior of `sprintf` with a `NULL` format string defined?
一个小同事写的是这样的:
char str[20] = "Normal"; // declared globally
void somefunc(void)
{
sprintf(str, NULL);
if (var == TARGET)
{
sprintf(str, "Set");
}
else
{
sprintf(str, "Normal");
}
}
除了推荐使用 snprintf
之外,我还在考虑 sprintf
对 NULL
格式字符串(在函数的第一行)的作用 - 而不是 NULL
value 字符串,但是格式自己控制。我在阅读的文档中没有看到任何内容。
这是否包含在标准中,或者它是否可能定义了实现?由于他显然是 运行 这段代码,因此它一定不会在此处引起分段错误(取消引用 NULL
),但这是标准吗?有什么我可以指出的,上面写着“不要这样做。”,或者它可能是完全安全的(作者 standard/definition)?
充其量这似乎是一个不必要的陈述,但在最坏的情况下我担心另一个编译器可能会在这里导致段错误...
这样的调用会调用未定义的行为,因为(7.21.6.1 fprintf 函数;这对 sprintf 有效)
3 The format shall be a multibyte character sequence...
一个小同事写的是这样的:
char str[20] = "Normal"; // declared globally
void somefunc(void)
{
sprintf(str, NULL);
if (var == TARGET)
{
sprintf(str, "Set");
}
else
{
sprintf(str, "Normal");
}
}
除了推荐使用 snprintf
之外,我还在考虑 sprintf
对 NULL
格式字符串(在函数的第一行)的作用 - 而不是 NULL
value 字符串,但是格式自己控制。我在阅读的文档中没有看到任何内容。
这是否包含在标准中,或者它是否可能定义了实现?由于他显然是 运行 这段代码,因此它一定不会在此处引起分段错误(取消引用 NULL
),但这是标准吗?有什么我可以指出的,上面写着“不要这样做。”,或者它可能是完全安全的(作者 standard/definition)?
充其量这似乎是一个不必要的陈述,但在最坏的情况下我担心另一个编译器可能会在这里导致段错误...
这样的调用会调用未定义的行为,因为(7.21.6.1 fprintf 函数;这对 sprintf 有效)
3 The format shall be a multibyte character sequence...