cppcheck - 终止Strncpy

3

我刚接触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;
   }

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


1
请参见以下链接:https://dev59.com/eXM_5IYBdhLWcg3wQQzw - m.s.
http://the-flat-trantor-society.blogspot.com/2012/03/no-strncpy-is-not-safer-strcpy.html - Keith Thompson
1个回答

5

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

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

个人建议使用strdup(并记得在用完后释放),因为它更简单。 strdup是标准C库的Posix扩展,但如果需要,可以很容易地编写它,并且它可以在大多数平台上找到(在Windows上作为_strdup存在)。或者,您可以将strncpy的目标缓冲区大小减少一个字节,并在最后添加一个NUL,或者您可以使用strlen检查源字符串的长度,并在长度过长时失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接