char arr[512];
...
sprintf(arr, "%s %30s", arr, "Some Text");对于sprintf语句,我得到了以下消息:在对sprintf函数的调用中,参数arr和arr可能指向同一个对象。
有没有其他方法来实现这种格式化?
发布于 2020-01-24 17:00:58
重叠警告与这样一个事实有关,即您正在将arr复制到自身,从而覆盖其内容。
此外,在代码中:
sprintf(arr, "%s %0x", arr);
^^^%s接受arr字符串,但%0x没有像它应该接受的那样接受无符号十六进制整数变量,因此您可能缺少一个参数。
大致是这样的:
char arr[512];
char arr2[1024];
unsigned int x = 15;
sprintf(arr2, "%s %0x", arr, x);发布于 2020-01-29 16:04:46
这段代码包含两个不相关的错误。对于PVS-Studio分析器,它会发出以下两个警告:
第一个意味着传递给函数的实际参数数量不足。实际上,格式字符串表明字符串和整数应作为参数。但是只传递了一个字符串。没有数字参数,导致使用具有随机值的内存量,从而导致未定义的行为。
第二个警告告诉我们,如果将一个缓冲区用作输入和输出缓冲区,则不能保证sprintf函数正常工作。这样的代码可能会正常工作,也可能不会。这完全取决于sprintf函数的实现。在任何情况下,都没有理由以这种方式编写代码。
因此,Coverity在发出此代码的警告时是绝对正确的。代码肯定是不正确的。
附注:这让我想起了另一个关于"fake sprintf“用法的有趣案例:)。
https://stackoverflow.com/questions/59892939
复制相似问题