C# 静态分析,变量/参数的可能值

本文关键字:参数 静态分析 变量 | 更新日期: 2023-09-27 18:31:07

在类似于以下每个示例的代码中,我希望能够静态分析代码以确定传递给 SpecialFunction() 的可能值列表。

SpecialFunction(5); // A
int x = 5;
SpecialFunction(x); // B
int x = 5;
x = condition ? 3 : 19;
SpecialFunction(x); // C

我已经可以将 C# 解析为抽象语法树,并且我已经可以处理像 A 这样的情况,我想我可以跟踪值的初始赋值以猜测情况 B,但像 C 这样简单的情况似乎很快就会变得复杂。

我几乎可以肯定,我们无法在所有情况下都静态地解决 x,这没关系。 我想知道尝试它的策略,识别何时无法完成的方法。 如果我们需要包含类级字段和多线程怎么办? 闭 包? 如果我们知道对于x的所有可能值的集合X|X| < 50会有帮助吗?

根据@Vladimir Perevalov的建议,如何将Pex中的概念应用于查找目标代码点的可能值(而不是Pex似乎所做的是发现导致未检查(?)异常情况的代码路径和值)?

C# 静态分析,变量/参数的可能值

你想要的是全局数据流分析("什么值分配/副作用达到什么使用点")[这需要控制流分析作为前兆]和某种范围分析("总结可以达到一个点的值集")。

计算数据流需要具有完整的 C# 前端、本地控制和数据流分析,然后将这些答案拼接到全局数据流分析中。

范围分析要求您首先定义如何对可能的值集进行编码;允许哪种规范系统? 最简单的,只是一组价值观,往往会爆炸。 中间规范方案类似于OP的单关系到常量,例如"x <50"。 任何此类有限方案的问题在于,值集的丰富性可能会导致你得到无用的答案,特别是如果还有其他感兴趣的谓词(如果x总是奇数,则单关系到常量只能将其建模为"x

大多数可用的分析工具都没有这样的分析,更不用说为您公开了。 PEX可能确实有这样的机器;如果你幸运的话,它也会暴露出来。

我们的DMS软件再造工具包具有通用解析,符号表构建,控制/数据流分析,甚至范围分析机制(规格:x