为什么以下程序在使用cppcheck分析器检查时会出错

时间:2011-03-08 12:31:10

标签: cc

#include "stdio.h"

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

::: :(错误)未定义的行为:在调用sprintf或snprintf时错误地使用了xx。 Quote:如果由于调用sprintf()或snprintf()而重叠的对象之间发生复制,结果是未定义的。

2 个答案:

答案 0 :(得分:1)

准确地说是什么。您将相同的数组作为输入和输出传递给sprintf(),这不是受支持的用法,因为无法保证sprintf将按升序写入输出字符串。

答案 1 :(得分:1)

您正在写入char数组xx以及将其用作副本的源。此行为未定义。这是关于这种情况的现有问题:

Is sprintf(buffer, "%s […]", buffer, […]) safe?