Go 的数据流分析 | The GoLand 博客

  • GoLand 2023.3 与数据流转分析(DFA):GoLand 2023.3 支持数据流转分析(DFA),此功能由 Clion 团队帮助移植其强大的 DFA 引擎而来,目前 GoLand 引擎仅实现了有限的 DFA 功能,后续版本会添加更多。

    • 数据流转分析(DFA)简介:DFA 是一种静态代码分析,用于分析数据在程序中的流动,计算程序执行中不同点的变量可能值,可发现诸如nil引用、无限循环、常量条件及其他错误或异常行为等潜在 bug。
    • 以简单函数为例展示 DFA 作用:通过构建控制流图(CFG),对变量在不同语句后的可能值进行计算,如变量r在语句 9 后的可能值为{nil, new(Resource)},据此可发现潜在 bug,如语句 10 可能出现nil引用。
  • 数据流转分析的挑战:DFA 像其他静态分析工具一样会过度近似程序行为,会计算可能变量值的上限。如在修改后的示例函数中,DFA 推断变量init在语句 10 的可能值为{false, true},导致可能出现nil引用的误报。使用上下文可改善分析质量,排除误报,如在不同的initializeResource上下文下分析语句 9、10 和 11,可确定nil引用是否可能。
  • GoLand 中数据流转分析的功能

    • 常量条件检测:利用 DFA 执行数据确定某些条件是否为常量,如在示例中 DFA 推断出条件err!= nil总是false,或条件r0k!= nil总是true,可帮助识别程序代码中的特殊点或奇怪行为。
    • 潜在nil引用检测:能检测到看似正常代码中的nil引用,如在示例中推断出变量conf在语句 273 可能出现nil引用,原因是存在两个conf变量,后声明的变量会遮蔽前一个,可能导致运行时出现问题,要注意嵌套短变量声明。
    • 错误可能不为nil检测:报告变量可能为nil或有意外值的情况,由于分析是过程内的且不考虑用户强加的函数契约,可能存在误报,可使用快速修复让 DFA 不分析或报告这些错误。
  • 尝试 DFA:可在 GoLand 2024.1 发布候选版本或等待2024.1 版本中尝试这些改进,2023.3 用户可提前访问但默认禁用,需到Settings | Editor | Inspections | Go | Data Flow Analysis (experimental)处启用。
阅读 28
0 条评论