首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖问题: sprintf语句上的重叠内存(OVERLAPPING_COPY)副本

覆盖问题: sprintf语句上的重叠内存(OVERLAPPING_COPY)副本
EN

Stack Overflow用户
提问于 2020-01-24 16:41:59
回答 2查看 788关注 0票数 1
代码语言:javascript
复制
char arr[512];
...
sprintf(arr, "%s %30s", arr, "Some Text");

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

有没有其他方法来实现这种格式化?

EN

回答 2

Stack Overflow用户

发布于 2020-01-24 17:00:58

重叠警告与这样一个事实有关,即您正在将arr复制到自身,从而覆盖其内容。

此外,在代码中:

代码语言:javascript
复制
sprintf(arr, "%s %0x", arr);
                  ^^^

%s接受arr字符串,但%0x没有像它应该接受的那样接受无符号十六进制整数变量,因此您可能缺少一个参数。

大致是这样的:

代码语言:javascript
复制
char arr[512];
char arr2[1024];
unsigned int x = 15;
sprintf(arr2, "%s %0x", arr, x);
票数 2
EN

Stack Overflow用户

发布于 2020-01-29 16:04:46

这段代码包含两个不相关的错误。对于PVS-Studio分析器,它会发出以下两个警告:

  • V576的格式不正确。调用'sprintf‘函数时需要不同数量的实际参数。预期: 4.当前: 3. test.cpp 54
  • V541将'arr‘字符串打印到自身中是很危险的。test.cpp 54

第一个意味着传递给函数的实际参数数量不足。实际上,格式字符串表明字符串和整数应作为参数。但是只传递了一个字符串。没有数字参数,导致使用具有随机值的内存量,从而导致未定义的行为。

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

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

附注:这让我想起了另一个关于"fake sprintf“用法的有趣案例:)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59892939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档