【发布时间】:2021-06-29 02:42:29
【问题描述】:
我了解较新的 GCC 版本针对可能错误的字符串操作“stringop-truncation”引入了警告
这是我可以轻松触发此警告的示例代码:
$ cat strncpy-warning.cxx
#include <cstring>
extern char g_buf[16];
void mycopy ( const char* src_c_str )
{
strncpy ( g_buf, src_c_str, sizeof ( g_buf ) );
}
使用以下标志编译它会触发此警告:
$ 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 -std=c++14 -Wextra -Werror -O3 -c strncpy-warning.cxx
strncpy-warning.cxx: In function ‘void mycopy(const char*)’:
strncpy-warning.cxx:7:13: error: ‘char* strncpy(char*, const char*, size_t)’ specified bound 16 equals destination size [-Werror=stringop-truncation]
strncpy ( g_buf, src_c_str, sizeof ( g_buf ) );
~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
这是意料之中的,但是,如果我在标志中添加了 -flto,则此警告消失并生成目标文件:
$ g++ -Wall -std=c++14 -Wextra -Werror -O3 -c strncpy-warning.cxx -flto
$ ls strncpy-warning.o
strncpy-warning.o
显然,-flto 会捕捉到一些编译时警告,所以不确定为什么没有捕捉到 stringop-truncation,例如:
$ cat strncpy-warning.cxx
#include <cstring>
extern char g_buf[16];
void mycopy ( const char* src_c_str, const char* unused )
{
strncpy ( g_buf, src_c_str, sizeof ( g_buf ) );
}
$ g++ -Wall -std=c++14 -Wextra -Werror -O3 -c strncpy-warning.cxx -flto
strncpy-warning.cxx: In function ‘void mycopy(const char*, const char*)’:
strncpy-warning.cxx:5:50: error: unused parameter ‘unused’ [-Werror=unused-parameter]
void mycopy ( const char* src_c_str, const char* unused )
~~~~~~~~~~~~^~~~~~
cc1plus: all warnings being treated as errors
所以问题是:
- 这是预期行为吗?
- 我知道在为源文件指定
-flto后,GCC 会将特殊内容写入生成的目标文件(*.o),但问题是为什么 GCC 会跳过警告?这是故意的吗? - 即使给出
-flto,是否有办法启用此警告? - 或者上面的第 3 点有意义吗?
非常感谢!
【问题讨论】:
-
使用-flto,生成目标文件并不会真正编译,这会延迟到“链接”时间。并在编译期间发出警告。
-
谢谢马克。我编辑了另一个带有“flto”的警告的问题,并且该警告按预期报告。
-
我会用 gcc 提交一个错误。在 LTO 模式下没有理由不会出现警告。
-
谢谢 rustyx,会的。 (将首先在 GCC bugzilla 中创建一个帐户 :))
标签: c++ c gcc g++ gcc-warning