建议我在编译期间何时会发生以下警告

时间:2011-03-08 05:29:32

标签: cc

temp ....在调用sprintf或snprintf时使用错误。

如果由于调用sprintf()或snprintf()而重叠的对象之间发生了复制,则结果是未定义的。

1 个答案:

答案 0 :(得分:1)

即使使用-Wall -Wextra -pedantic

,这也不会引发gcc的警告
#include "stdio.h"

int main (void) {
    char xx[1000] = "hello";
    sprintf (xx, "xyzzy plugh %s", xx);
    printf ("%s\n", xx);
    return 0;
}

然而,从输出中可以看出这被认为是一个坏主意的原因。而不是得到:

xyzzy plugh hello
正如一个普通人所预料的那样,你实际得到:

xyzzy plugh xyzzy plugh

但是,与所有未定义的行为一样,您的里程可能会有所不同。

最终参考是C99标准,7.19.6.6 The sprintf function部分,其中指出:

  

sprintf函数等效于fprintf,除了输出被写入数组(由参数s指定)而不是流。在写入的字符末尾写入空字符;它不计入返回值的一部分。如果在重叠的对象之间进行复制,则行为未定义。

C ++标准(好吧,实际上是C ++ 0x 草案,但它现在肯定会在任何一天到来,希望 - 来吧,伙计们,让它 out 那里)引用它,因为它将C标准的一部分合并为已弃用的功能。