【问题标题】:C# static array bound check [closed]C# 静态数组绑定检查 [关闭]
【发布时间】:2013-12-06 16:37:56
【问题描述】:

是否有 C# 工具可以静态(不执行代码)检测超出范围的数组访问,即会抛出 IndexOutOfRangeException 的数组访问。

谢谢。

编辑:是的,我知道在一般情况(即无法确定)中理论上是不可能做到的,但这并不意味着不可能做到在某些情况下(事实上,形式验证的整个领域都是为理论上不可能的事情生产实用工具)。 (我不认为这个表扬是特别需要的:))

【问题讨论】:

  • 请注意,这种分析只能是启发式的,因为检查所有个案例可能无法确定。
  • 听起来好像没有我的眼睛我怎么能看到一切?

标签: c# arrays static-analysis indexoutofboundsexception formal-verification


【解决方案1】:

不,理论上是不可能的。这就是单元测试的用途;-)。

【讨论】:

  • 只是理论上?这是不可能的,期间。
  • 如果理论已经说“这是不可能的”,那么实际上它在实践中是不可能的两倍。期间;-)。
  • 理论不是说:“这是不可能的”,而是说:“没有一种方法可以在每个程序中找到所有这些错误”。在实践中,许多模型检查器(主要针对 C)可以做到这一点。
【解决方案2】:

正如 Thomas 和 Heinzi 所说,这是无法确定的。您的问题的一个子集是可以解决的 - 您可以 NGen(或 JIT)您的 .NET 应用程序,并查找对 IndexOutOfRangeException throw 子例程的引用;如果 MSIL -> 本机编译器绝对确定它根本不会发生,则它会消除边界检查(以及因此 IndexOutOfRangeExceptions)。

实际上,这通常是像for (int i = 0; i < ar.Length; i++) { ar[i] ... } 这样的代码,但它应该在许多应用程序中大大减少未确定的情况。

【讨论】:

【解决方案3】:

【讨论】:

  • 谢谢。这似乎是我一直在寻找的答案:“静态检查。我们的静态检查器甚至可以在不运行程序的情况下确定是否存在任何违反合同的情况!它检查隐式合同,例如 null 取消引用和数组界限,以及明确的合同。”
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 2013-06-22
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多