CLion教程-数据流分析
数据流分析(DFA)跟踪代码中数据的流动并基于此分析检测潜在问题。例如,DFA检查可以识别始终为假或始终为真的条件、无限循环、缺失的返回语句、无限递归以及其他潜在的漏洞。
在CLion中的数据流分析具有调用上下文敏感性:
- 每个函数都会分别针对每个调用站点进行分析。
- 不同调用站点的参数和返回值也会分别进行分析。
DFA可以全局工作(将程序的整个翻译单元作为分析的单个单元)或局部工作(在单个函数内部进行分析)。
全局DFA在翻译单元内的所有函数或字段的所有用法上进行工作,这些函数或字段被保证在其中是本地的。这有助于检测局部DFA无法捕获的潜在问题。
例如,使用全局DFA进行悬挂指针分析可以捕获在另一个函数中删除内存的情况:
CLion的静态分析器根据Herb Sutter的生命周期安全提案检查对象的生命周期。然而,目前并未涵盖提案中提到的所有情况。
在CLion中,默认情况下启用了全局DFA,但在以下情况下会回退到局部模式:
- 翻译单元中的任何函数中存在错误,由Clangd报告。
- 文件包含在另一个翻译单元中。
- 通过注册表键
clion.dfa.global
手动禁用全局DFA(除非面临严重的退行问题,否则不建议这样做)。
一些DFA检查可以在全局和局部两种情况下工作,而以下三种仅在全局DFA中可用:Constant function result(常量函数结果)、Constant parameter(常量参数)和Unreachable calls of function(无法访问的函数调用)。