是否定义了带有NULL格式字符串的sprintf行为?

问题描述

一个初级同事写了这样的东西:

char str[20] = "normal"; // declared globally

void somefunc(void)
{
  sprintf(str,NULL);
  if (var == TARGET)
  {
    sprintf(str,"Set");
  }
  else
  {
    sprintf(str,"normal");
  }
}

除了建议使用snprintf之外,我还在考虑sprintfNULL格式字符串(在函数的第一行)会做什么-不是NULL value 字符串,但是格式控件本身。在阅读的文档中没有看到任何内容

这是否包含在标准中,或者也许定义了实现?由于他显然正在运行此代码,因此它一定不会在这里引起分段错误(取消引用NULL),但是那是标准吗?我是否可以指出“不要这样做”,或者说它绝对安全(按标准/定义)?

充其量看来,这是不必要的声明,但最糟糕的是,我担心另一个编译器可能在这里引起段错误...

解决方法

这种调用会调用未定义的行为,因为(7.21.6.1 fprintf函数;这对sprintf有效)

3格式为多字节字符序列...