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

标签 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,但这没关系。我想知道尝试它的策略,以及识别何时无法完成的方法。如果我们需要包含类级字段和多线程怎么办?关闭?如果我们知道集合 X 会有帮助吗? x 的所有可能值, |X| < 50

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

最佳答案

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

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

范围分析要求您首先定义您打算如何对一组可能值进行编码;允许什么样的规范系统?最简单的,只是一组值,往往会爆炸。中间规范方案类似于 OP 的单关系到常量,例如 "x < 50"。任何此类有限方案的问题在于,值集的丰富性可能会导致您得到无用的答案,特别是如果还有其他感兴趣的谓词(如果 x 始终为奇数,则单关系到常量只能对此建模作为“x < infinity”,这显然没有帮助。因此,您想选择一个足够复杂的规范方案来模拟您感兴趣的那种值。但是,随着您的规范方案变得更加复杂,推断这些事实的机制正确地变得更复杂,所以你不能让它太复杂。

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

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

关于C# 静态分析,变量/参数的可能值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10145554/

相关文章:

c# - 如何在 WPF 中使用窗口作为初始屏幕?

c# - 如何保护网页

c# - 如何修复excel文件?

java - 可能会抛出 "NullPointerException"; "context"在这里可以为空

apache-spark - 从TF-YARN库创建pex进行分布式培训时出错

c# - 在 MVC 4 中操作模型绑定(bind)

jenkins - 如何在jenkins中使用静态分析收集器插件?

ios - 奇怪的 Xcode 分析结果

c++ - 什么是最接近 Pex for Visual C++ 的东西?

testing - Pex——测试输入生成器