C#静态数组绑定检查

C#静态数组绑定检查,c#,arrays,static-analysis,indexoutofboundsexception,formal-verification,C#,Arrays,Static Analysis,Indexoutofboundsexception,Formal Verification,是否有一个C#工具可以静态(不执行代码)检测出绑定外的数组访问,即抛出的数组访问 多谢各位 编辑:是的,我知道在一般情况下,理论上不可能做到这一点(即,它是不可判定的),但这并不意味着在某些情况下不可能做到这一点(事实上,整个形式验证领域是为理论上不可能的事情生产实用工具)。(我认为这不是特别需要的:)不,理论上是不可能的。这就是单元测试的目的;-) 不,理论上这是不可能的。这就是单元测试的目的;-) 正如托马斯和海因茨所说,这是无法确定的。您的问题有一个子集是可以解决的-您可以对.NET应用程

是否有一个C#工具可以静态(不执行代码)检测出绑定外的数组访问,即抛出的数组访问

多谢各位


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

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

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

正如托马斯和海因茨所说,这是无法确定的。您的问题有一个子集是可以解决的-您可以对.NET应用程序进行加密(或JIT),并查找对IndexOutOfRangeException抛出子例程的引用;如果绝对确定边界检查不会发生,MSIL->native编译器将消除边界检查(从而消除IndexOutofrangeException)


在实践中,这通常类似于(inti=0;i,但在许多应用程序中,它应该大大减少未确定的情况。

正如Thomas和Heinzi所说,这是不可确定的。您的问题有一个子集是可以解决的-您可以对.NET应用程序进行加密(或JIT),并查找对IndexOutOfRangeException抛出子例程的引用;如果绝对确定边界检查不会发生,MSIL->native编译器将消除边界检查(从而消除IndexOutofrangeException)


在实践中,这通常类似于(inti=0;i,但在许多应用程序中,它应该大大减少未确定的情况。请参阅。

是。请参见。

注意,这样的分析只能是一种启发性的分析,因为对所有情况的检查可能都是不可判定的。听起来好像我没有眼睛怎么能看到一切?请注意,这样的分析只能是一种启发性的分析,因为对所有病例的检查可能都是无法确定的。听起来好像我没有眼睛怎么能看到一切?只是理论上的?这是不可能的,如果理论已经说“这是不可能的”,那么事实上,在实践中这是不可能的两倍。句号;-)。该理论并没有说:“这是不可能的”,而是说:“没有任何方法可以在每个程序中发现所有这样的错误”。在实践中,许多模型检查器(主要用于C)可以做到这一点。只是理论上?这是不可能的,如果理论已经说“这是不可能的”,那么事实上,在实践中这是不可能的两倍。句号;-)。该理论并没有说:“这是不可能的”,而是说:“没有任何方法可以在每个程序中发现所有这样的错误”。实际上,许多模型检查器(主要用于C)都可以做到这一点。如果有人好奇,这里有一些关于CLR中边界检查消除的信息(非技术):如果有人好奇,这里有一些关于CLR中边界检查消除的信息(非技术):谢谢。这似乎是我一直在寻找的答案:“静态检查。我们的静态检查程序甚至不运行程序就可以确定是否存在任何违反约定的情况!它检查隐式约定,例如空解引用和数组边界,以及显式约定。”谢谢。这似乎是我一直在寻找的答案:“静态检查。我们的静态检查程序可以在不运行程序的情况下确定是否存在任何违反约定的情况!它检查隐式约定,例如空解引用和数组边界,以及显式约定。”