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 终止的字符串转换为未终止的字符串(即为什么你会收到警告)。如果src
比n
字节短,strncpy
将在末尾添加NUL
字节,这通常是不必要的。
就我个人而言,我会使用strdup
(并记住在我完成后将生成的副本发送给free
),因为它更容易。 strdup
是标准 C 库的 Posix 扩展,但如果需要,它很容易编写,并且它存在于大多数平台上(如 Windows 上的 _strdup
,iirc)。或者,您可以 strncpy 比缓冲区大小少一个字节,然后在末尾添加 NUL,或者您可以使用 strlen
检查源字符串的长度,如果太长则失败。
【讨论】:
以上是关于cppcheck - 终止Strncpy的主要内容,如果未能解决你的问题,请参考以下文章