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

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

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

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

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

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

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

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

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