cppcheck - 终止Strncpy

Posted

技术标签:

【中文标题】cppcheck - 终止Strncpy【英文标题】:cppcheck - terminateStrncpy 【发布时间】:2015-04-22 07:30:23 【问题描述】:

cppcheck 的新手。无法弄清楚如何解决此问题(cppcheck 警告)。任何帮助将不胜感激。

 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;
   

error(warning) - 在调用 strncpy() 之后,缓冲区 'id2' 可能不会以零结尾。

【问题讨论】:

见***.com/questions/1453876/… the-flat-trantor-society.blogspot.com/2012/03/… 【参考方案1】:

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

strncpy(dst, src, n) 总是准确写入 n 字节。如果src 在其第一个n 字节中没有NUL 字节,则不会将NUL 字节写入dst,因此您可以将有效的以NUL 终止的字符串转换为未终止的字符串(即为什么你会收到警告)。如果srcn 字节短,strncpy 将在末尾添加NUL 字节,这通常是不必要的。

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

【讨论】:

以上是关于cppcheck - 终止Strncpy的主要内容,如果未能解决你的问题,请参考以下文章

Cppcheck : mismatchAllocDealloc 错误

CMake 中的 Cppcheck 支持

CMAKE 有条件地运行 cppcheck

自定义 cppcheck 规则集

如何使用 cppcheck 忽略某些文件类型?

cppcheck 中的 SLOC