是否定义了带有 `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 之外,我还在考虑 sprintfNULL 格式字符串(在函数的第一行)的作用 - 而不是 NULL value 字符串,但是格式自己控制。我在阅读的文档中没有看到任何内容。

这是否包含在标准中,或者它是否可能定义了实现?由于他显然是 运行 这段代码,因此它一定不会在此处引起分段错误(取消引用 NULL),但这是标准吗?有什么我可以指出的,上面写着“不要这样做。”,或者它可能是完全安全的(作者 standard/definition)?

充其量这似乎是一个不必要的陈述,但在最坏的情况下我担心另一个编译器可能会在这里导致段错误...

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

3 The format shall be a multibyte character sequence...