【发布时间】: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