cppcheck - 终止Strncpy
cppcheck - terminateStrncpy
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' 可能未以零终止。
不要使用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 的新手。无法弄清楚如何解决此问题(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' 可能未以零终止。
不要使用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
检查源字符串的长度,如果太长则失败。