clang-tidy为何无法检测lambda函数内的死代码?如何开启对应检测?
clang-tidy lambda内部死代码检测配置方案
问题现象
使用clang-tidy开展静态代码检测时,lambda函数内部的死代码无法被识别;将lambda替换为普通函数后,clang-tidy可精准定位问题,输出如下警告:
warning GC1A2668F: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
以下为场景测试代码(无实际业务含义,仅用于死代码检测验证),可通过定义USE_LAMBDA宏切换lambda与普通函数的实现版本:
#include <iostream> #include <algorithm> using namespace std; int GetRet() { return 5; } #define USE_LAMBDA 1 #if USE_LAMBDA int main() { int ary[10]{}; for_each(begin(ary), end(ary), [](int a) { int ret = GetRet(); if (a > 5 && ret < 1) { ret = 6; } }); return 0; } #else void Check(int a) { int ret = GetRet(); if (a > 5 && ret < 1) { ret = 6; } } int main() { int ary[10]{}; for_each(begin(ary), end(ary), Check); return 0; } #endif
解决方案
该漏报问题源于clang静态分析器(即clang-tidy中clang-analyzer-*系列检查的核心引擎)的默认分析策略,可通过调整检查选项强制开启lambda内部的路径敏感检测:
- 若使用
.clang-tidy文件做持久化配置,在CheckOptions节点下添加如下配置:
CheckOptions: - key: clang-analyzer-cplusplus.InlineFunctionCallInLambda value: true - key: clang-analyzer-ipa.ipa value: dynamic-bifurcate
- 若通过命令行直接调用clang-tidy,追加如下启动参数即可:
--config="{CheckOptions: [{key: clang-analyzer-cplusplus.InlineFunctionCallInLambda, value: true}, {key: clang-analyzer-ipa.ipa, value: dynamic-bifurcate}]}"
补充说明
clang-analyzer-ipa.ipa用于控制分析器的函数内联策略,默认值为dynamic,对作为STL算法参数传入的lambda默认跳过内联分析;设置为dynamic-bifurcate会提升内联覆盖率,若需要最高检测精度可设置为always,对应分析耗时会上涨20%~40%,可根据代码库规模选择basic档位平衡速度与准确率。clang-analyzer-cplusplus.InlineFunctionCallInLambda配置项在clang 14及以上版本才提供,低于14的版本无法通过配置开启lambda内部的死代码检测,需升级工具版本。- 跨编译单元传递、仅通过
std::function做类型擦除后调用的lambda,即使开启上述配置仍可能存在漏报,可搭配bugprone-unused-return-value、misc-unused-parameters等非路径敏感检查补充覆盖。
内容的提问来源于stack exchange,提问作者Gary Kim
相关产品推荐
相关产品推荐

