C++ 覆盖性问题:sprintf语句上重叠内存的拷贝(重叠拷贝)

C++ 覆盖性问题:sprintf语句上重叠内存的拷贝(重叠拷贝),c++,memory-management,printf,coverity,memory-corruption,C++,Memory Management,Printf,Coverity,Memory Corruption,对于sprintf语句,我得到以下消息: 在对函数sprintf的调用中,参数arr和arr可能指向同一个对象 是否有其他方法实现这种格式设置?重叠警告与您正在将arr复制到自身,从而覆盖其内容有关 此外,在守则中: char arr[512]; ... sprintf(arr, "%s %30s", arr, "Some Text"); %s采用arr字符串,但%0x没有采用应有的无符号十六进制整数变量,因此您可能缺少一个参数 大致如下: sprintf(arr, "%s %0x", arr

对于sprintf语句,我得到以下消息: 在对函数sprintf的调用中,参数arr和arr可能指向同一个对象


是否有其他方法实现这种格式设置?

重叠警告与您正在将arr复制到自身,从而覆盖其内容有关

此外,在守则中:

char arr[512];
...
sprintf(arr, "%s %30s", arr, "Some Text");
%s采用arr字符串,但%0x没有采用应有的无符号十六进制整数变量,因此您可能缺少一个参数

大致如下:

sprintf(arr, "%s %0x", arr);
                  ^^^

重叠警告与以下事实有关:您正在将arr复制到自身,从而覆盖其内容

此外,在守则中:

char arr[512];
...
sprintf(arr, "%s %30s", arr, "Some Text");
%s采用arr字符串,但%0x没有采用应有的无符号十六进制整数变量,因此您可能缺少一个参数

大致如下:

sprintf(arr, "%s %0x", arr);
                  ^^^

此代码包含两个不相关的错误。对于PVS Studio analyzer,它会发出以下两个警告:

V576格式不正确。调用“sprintf”函数时,需要不同数量的实际参数。预期:4。出席:3。第54页 V541将“arr”字符串打印到自身中是危险的。第54页 第一个意味着传递给函数的实际参数数量不足。实际上,格式字符串表示字符串和整数应作为参数。但只传递了一个字符串。没有数值参数,导致使用随机值的内存量,从而导致未定义的行为

第二个警告告诉我们,如果将一个缓冲区用作输入和输出缓冲区,则不能保证sprintf函数正常工作。这样的代码可能正常工作,也可能无法正常工作。这完全取决于sprintf函数的实现。无论如何,没有理由以这种方式编写代码

因此,Coverity在发出此代码警告时绝对正确。代码绝对不正确


另外,它让我想起了另一个与a:.用法有关的有趣案例。

此代码包含两个不相关的错误。对于PVS Studio analyzer,它会发出以下两个警告:

V576格式不正确。调用“sprintf”函数时,需要不同数量的实际参数。预期:4。出席:3。第54页 V541将“arr”字符串打印到自身中是危险的。第54页 第一个意味着传递给函数的实际参数数量不足。实际上,格式字符串表示字符串和整数应作为参数。但只传递了一个字符串。没有数值参数,导致使用随机值的内存量,从而导致未定义的行为

第二个警告告诉我们,如果将一个缓冲区用作输入和输出缓冲区,则不能保证sprintf函数正常工作。这样的代码可能正常工作,也可能无法正常工作。这完全取决于sprintf函数的实现。无论如何,没有理由以这种方式编写代码

因此,Coverity在发出此代码警告时绝对正确。代码绝对不正确


另外,它让我想起了另一个与a:.的用法有关的有趣案例。

你检查过了吗?是的,但不太清楚。我想这可能是未定义的行为。那么我该如何修复它呢?你想用这些代码实现什么?如果没有上下文,它看起来有问题:如果对sprintf或snprintf的调用导致在重叠的对象之间进行复制,则该行为是未定义的。你也错过了一个论点。你得到的警告是一个很好的提醒,可以删除Seavtf并使用C++ IoSokes或类似的库。你检查过是不是太清楚了。我想这可能是未定义的行为。那么我该如何修复它呢?你想用这些代码实现什么?如果没有上下文,它看起来有问题:如果对sprintf或snprintf的调用导致在重叠的对象之间进行复制,则该行为是未定义的。你也缺少一个论点。你得到的警告是一个很好的提醒,可以删除SpETTF并使用C++ IoSokes或类似的库。