cppcheck - terminateStrncpy

cppcheck - terminateStrncpy

本文关键字:terminateStrncpy cppcheck      更新时间:2023-10-16

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) - 缓冲区 'id2' 在调用 strncpy() 后可能不会以零终止。

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

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

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

相关文章:
  • 没有找到相关文章