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

时间:2012-04-13 17:33:59

标签: c# static-analysis pex c#-5.0 roslyn

在类似于以下每个示例的代码中,我希望能够静态分析代码,以确定传递给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问题。我想知道尝试它的策略,以及识别何时无法完成的方法。如果我们需要包含类级别字段和多线程,该怎么办?闭包?如果我们知道Xx的所有可能值的|X| < 50集合会有用吗?

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

2 个答案:

答案 0 :(得分:4)

有一个项目可以做你想要的(至少非常接近)。它是Pex。 尝试查看他们的文档,也可以反编译源代码,看看他们做了什么。

答案 1 :(得分:4)

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

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

范围分析要求您首先定义如何编码可能值的集合;允许哪种规格系统?最简单的,只是一组价值观,往往会爆炸。中间规范方案将类似于OP的单关系到常数,例如“x <50”。任何这样有限的方案的问题在于,这组值的丰富性可能会导致你得到无用的答案,特别是如果有其他感兴趣的谓词(如果x总是奇数,单关系到常数只能模拟这个因为“x&lt; infinity”显然没有用。所以,你想选择一个足够复杂的规范方案来模拟那些你感兴趣的值。然而,随着你的规范方案变得越来越复杂,推断它们的机制事实正确变得更加复杂,所以你不能太复杂。

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

我们的DMS Software Reengineering Toolkit具有通用解析,符号表构建,控制/数据流分析,甚至是范围分析机制(规格:x