关于 strncpy 警告的另一个问题。
代码如下:
#include <cstring>
extern char g_dest[16];
extern char g_src[16];
char* mycopy()
{
char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
return x;
}
使用 g++
版本 8.3 编译它:
$ g++ --version
g++ (GCC) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
strncpy-warning2.cxx: In function ‘char* mycopy()’:
strncpy-warning2.cxx:8:24: error: ‘char* strncpy(char*, const char*, size_t)’ output may be truncated copying 15 bytes from a string of length 15 [-Werror=stringop-truncation]
char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
可以通过以下任一方法解决该警告:
- 使 g_src 比 g_dest 短:
$ cat strncpy-warning2.cxx
#include <cstring>
extern char g_dest[16];
extern char g_src[15];
char* mycopy()
{
char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
return x;
}
$ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
$
- 或者在
g_dest
末尾显式添加 NUL 终止符:
$ cat strncpy-warning2.cxx
#include <cstring>
extern char g_dest[16];
extern char g_src[16];
char* mycopy()
{
char * x = strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 );
g_dest[ sizeof( g_dest ) - 1 ] = '\0';
return x;
}
$ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
$
- 或者如果我将 g_src 设置为指针而不是数组:
$ cat strncpy-warning2.cxx
#include <cstring>
extern char g_dest[16];
extern char* g_src2;
char* mycopy()
{
char * x = strncpy ( g_dest, g_src2, sizeof ( g_dest ) - 1 );
return x;
}
$ g++ -Wall -Wextra -Werror -O3 -c strncpy-warning2.cxx
$
我知道 GCC 正在尝试警告 strncpy 使用中的潜在错误,但是,我不明白为什么我们不能对 2 个相同大小的数组执行 strncpy
?为什么警告消息显示输出可能被截断
? (即,我找不到输出
可能被截断
的示例,除非GCC假设g_src
可能不一定是有效的以NUL结尾的c字符串.)
通过谷歌搜索,我在 GCC bugzilla 中看到了类似的案例:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87028但是,我不确定这是否是相同的情况,因为最后被标记为“已修复”,但显然我的问题在 GCC 10.2 中仍然存在。
谢谢!
最佳答案
当源和目标大小相同且相当小时,最好的(最有效、最简单、最容易理解成功和错误情况)是使用 memcpy。 GCC 不会就此警告您。
如果您只是希望 GCC 不提示您的 strncpy() 调用,即使它不安全,您也可以将其括在括号中,如下所示:
char * x = (strncpy ( g_dest, g_src, sizeof ( g_dest ) - 1 ));
GCC 将其理解为“我知道自己在做什么,不要试图将我从自己手中拯救出来。”
关于c++ - GCC 关于 strncpy 使用的误报警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66930308/