8

在类似于以下每个示例的代码中,我希望能够静态分析代码以确定传递给 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 似乎所做的是发现导致未检查(?)异常情况的代码路径和值)?

4

1 回答 1

4

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

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

范围分析要求您首先定义您打算如何编码一组可能的值;允许什么样的规范体系?最简单的,只是一组值,往往会爆炸。中间规范方案类似于 OP 的单一关系到常量,例如 "x < 50" 。任何这种有限方案的问题在于,值集的丰富性可能会导致您得到无用的答案,特别是如果有其他感兴趣的谓词(如果 x 总是奇数,则单关系到常数只能对此建模作为 "x < infinity" 这显然没有帮助。因此,您希望选择一个足够复杂的规格方案来模拟您感兴趣的那种值。但是,随着您的规格方案变得更加复杂,

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

我们的DMS 软件再造工具包具有通用解析、符号表构建、控制/数据流分析甚至范围分析机制(规范:x < k1*a+k2*b 其中 k1 和 k2 是常量,a 和 b 是其他程序变量可见,其中 x 被消耗)。DMS 有 C#、Java、GNU C 和 COBOL 前端,我们实际上已经为 GNU C 和 IBM Enterprise COBOL(部分用于 Java 7)实例化了这种机器,方法是收集(静态分析!)特定于这些语言的事实并提供这些通用机器的事实。我们还没有为 C# 实例化这个机制。但是,如果您无法从其他来源获得好的答案,这可能非常接近。

于 2012-04-13T23:13:35.617 回答