【问题标题】:no warning on unused lambda with -Wall and -Wextra使用 -Wall 和 -Wextra 对未使用的 lambda 没有警告
【发布时间】:2020-11-08 18:17:48
【问题描述】:

通常,如果您有一个 lambda 并忘记使用它,您会像任何其他未使用的变量一样收到警告(如果启用)。

auto foo = [](){};

会生成 warning: unused variable 'foo' 或类似的。

但是,如果 lambda 捕获有副作用(例如增加 shared_ptr 的引用计数),您将不会收到警告。

auto x = std::make_shared<int>(23);
auto foo = [x](){ bar(*x); };

那么,除了为函数对象创建我自己的 [[nodiscard]] 包装器之外,是否还有我遗漏的任何额外警告标志或可以发现此错误的静态分析工具?

主要是 gcc 用户,虽然也会使用 clang 构建相同的代码库。

【问题讨论】:

  • 必须说服自己。这是演示:godbolt.org/z/d7sMbv
  • 据我所知,像这样声明foo 会产生改变x 的use_count 的副作用。所以我不确定未使用的警告是否正确。
  • @cigien 我想我同意,但我认为结果仍然令人惊讶,因为未使用 lambda。我的问题是真的有没有任何方法可以检测到这个错误
  • 这是一个可能有帮助的示例:假设 lambda 仅在未评估的上下文中使用,或者您可能想做一些仅使用 lambda 类型的元编程。您是否希望编译器仅仅因为它们从未被调用而对所有这些 lambdas 发出警告?
  • 我的猜测是静态分析器会遇到与警告情况类似的问题,即很难知道您的意思是什么。但肯定有可能一些静态分析器有一些细粒度的设置可以捕捉到这种事情(虽然可能有很高的误报率)。

标签: c++ lambda g++ clang++ static-code-analysis


【解决方案1】:

在您的程序中实际上没有什么需要警告的。至少,任何可能产生的警告都不属于-Wunused 的范畴。这组警告是针对程序中的声明,这些声明对程序的行为没有影响,表明程序员的错误。这通常是未使用的声明的情况,因为声明本身通常不会有任何可观察到的副作用。

然而,在您的代码中,foo 的声明 确实 具有可观察到的副作用:

auto x = std::make_shared<int>(23);
std::cout << x.use_count();         // prints 1
auto foo = [x](){ bar(*x); };
std::cout << x.use_count()          // prints 2

这是demo

所以我认为任何-Wunused 警告都不适合这个程序。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2014-09-14
    • 2021-12-31
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多