【问题标题】:C# Static Analysis, possible values for a variable/parameterC# 静态分析,变量/参数的可能值
【发布时间】:2012-04-26 02:18:53
【问题描述】:

在类似于以下每个示例的代码中,我希望能够静态分析代码以确定传递给 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| < 50 的所有可能值的集合X 会有帮助吗?

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

【问题讨论】:

  • +1。不要认为猜测指定参数取值范围可能的失败/成功是静态分析的“职责”,很可能是dynamic analysis的“职责”。但即使是这样,在 this 的情况下,你只处理 几个 参数,如果你处理一个函数,比如 IEnumerable<int>GetValuesForx(...) 呢?
  • @Tigran - 运行或模拟程序(或片段)不是一种选择。此外,显然在某些情况下静态分析可以提供答案 - 显然在某些情况下无法提供答案。我正在尝试识别并实现可能的情况。

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


【解决方案1】:

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

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

范围分析需要您首先定义您打算如何编码一组可能的值;允许什么样的规范体系?最简单的,只是一组值,往往会爆炸。中间规范方案类似于 OP 的单一关系到常量,例如 "x

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

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

【讨论】:

  • 我在 MSR Roslyn 上取得了相当大的进展。我用它来解析 AST 并毫不费力地做了我自己的(有缺陷的)推理。我认为 Roslyn 可以为我做更多的事情,但没有很好的记录。这足以证明概念。如果这个项目继续进行,我可能会与贵公司核实。
  • 我猜 Roslyn 很少做全局流量分析。据我了解,C# 主要是 JIT 编译器。
  • JITed-ness 与全局流可分析性有什么关系?
  • @Jason: 1) 如果您正在 JITing,将源代码转换为 pCode (CIL) 的工具(“C# 编译器”,我认为是 Roslyn)不需要编译高度优化的pCode,2) 通常你会得到非常好的单独编译,这不利于全局优化。人们期望运行时 JIT'er 能够基于动态测量进行更复杂的分析;它可能有也可能没有全局优化,但它至少可以访问“整个”程序(模动态加载的东西)。
猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2012-05-04
  • 2010-10-07
  • 1970-01-01
  • 2016-08-30
  • 2011-09-07
相关资源
最近更新 更多