问题描述
一个初级同事写了这样的东西:
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
),但是那是标准吗?我是否可以指出“不要这样做”,或者说它绝对安全(按标准/定义)?
充其量看来,这是不必要的声明,但最糟糕的是,我担心另一个编译器可能在这里引起段错误...
解决方法
这种调用会调用未定义的行为,因为(7.21.6.1 fprintf函数;这对sprintf有效)
3格式应为多字节字符序列...