首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cppcheck - terminateStrncpy

cppcheck - terminateStrncpy
EN

Stack Overflow用户
提问于 2015-04-22 07:30:23
回答 1查看 276关注 0票数 3

新来的。无法解决此问题(cppcheck警告)。任何帮助都将不胜感激。

代码语言:javascript
复制
 if (!call_initialized)
 { char id1[16];
   char id1[16];
   char* dummy_char_ptr = inet_ntoa(*((in_addr*)&source_ip));
   std::strncpy(id1, dummy_char_ptr, 16);
   dummy_char_ptr=inet_ntoa(*((in_addr*)&destination_ip));
   std::strncpy(id2, dummy_char_ptr, 16);
   dummy_char_ptr=NULL;
   std::cerr << id1 << " -----> " << id2 << std::endl;
   return 0;
   }

错误(警告)-在调用strncpy()之后,缓冲区'id2‘可能不会以零结尾。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 07:40:40

不要使用strncpy (除非你真的知道自己在做什么)。

strncpy(dst, src, n)总是精确地写入n字节。如果src的第一个n字节中没有NUL字节,则不会向dst写入NUL字节,因此您可以将一个有效的以NUL结尾的字符串转换为一个未终止的字符串(这就是您得到警告的原因)。如果srcn字节短,strncpy将向末尾添加NUL字节,这通常是不必要的。

就我个人而言,我会使用strdup (并且记住,当我完成它时,要对结果副本进行free ),因为它更容易。strdup是标准C库的Posix扩展,但是如果您需要它,它很容易编写,并且它存在于大多数平台上(如_strdup在Windows上,iirc)。或者,您可以将strncpy比缓冲区的大小少一个字节,然后在末尾添加一个NUL,或者只需使用strlen检查源字符串的长度,如果它太长就会失败。

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

https://stackoverflow.com/questions/29790669

复制
相关文章

相似问题

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