gpt4 book ai didi

c++ - 为什么 "-flto"静默 GCC 的警告 "stringop-truncation"

转载 作者:行者123 更新时间:2023-12-04 13:28:03 28 4
gpt4 key购买 nike

我知道较新的 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点有意义吗?

  • 非常感谢!

    最佳答案

    粗略地说,GCC 有两种警告:

  • 简单分析源码产生的警告
  • 数据流复杂分析产生的警告

  • 未使用的参数是第一种:很容易看到一个参数根本没有在函数中使用。 strncpy 的错误用法是,除了微不足道的情况,第二种:编译器需要理解 strncpy的第一个和第三个参数之间的关系。 ,它需要知道在第三个参数中传递的实际(或至少是符号)值,并且它需要知道第一个参数中可用的实际(或至少是符号)大小。
    第一种警告由前端解析器生成。因此,它总是着火。
    第二种是由优化代码的同一个组件生成的,因为只有这个组件有必要的信息。在 -flto模式,此组件不会为单个源文件运行。
    第二种有时也取决于正在执行的特定优化:如果您将第一个命令行中的优化级别更改为 -O1 ,也不会发出警告。

    关于c++ - 为什么 "-flto"静默 GCC 的警告 "stringop-truncation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66915714/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com