.NET静态分析 - 保证调用程序中的函数

hal*_*ton 7 c# static-analysis

有没有办法找出将在C#世界中作为程序的一部分执行的所有函数调用?

例如,鉴于此:

static void Main(string[] args)
{
     if (true)
     {
         CallTrueFunction();
     }
     else
     {
         CallFalseFunction();
     }
 }
Run Code Online (Sandbox Code Playgroud)

我可以通过FxCop或其他系统来了解CallTrueFunction吗?

rus*_*hop 10

简短的回答是否定的.

稍微长一点的答案是否定的,不是任何编程语言中的任何非平凡程序.

更长的答案是你或多或少地描述了暂停问题.没有通用的方法来确定哪些方法可以访问,哪些不是因为这样做你需要解决暂停问题.

想象一个while循环,循环之后是唯一的调用myfunc().被myfunc()称为?你无法知道,因为循环可能会或可能不会终止.也许循环依赖于传递给函数的变量.也许它依赖于用户的输入.无论如何,如果循环终止则myfunc()调用.如果循环没有终止,那么myfunc()就是永远不会被调用的死代码.我们只是说你这样做while(Console.ReadLine() != "G") { }.你的程序打电话了myfunc()吗?取决于输入!

就像暂停问题一样,你可以构建一些简单的小程序,它们总能产生正确的答案,或者创建极其微小的有限状态机,它们总能产生正确的答案.但是,如果你接下来的静态分析程序并在一个中等规模的app上运行它,那么潜在状态组合的数量会迅速超过宇宙中可用原子的数量.

了解程序是否会调用此函数或该函数的唯一方法是运行它并查看是否存在.然后,您可以说"对于输入X,在环境Y中,在CPU Z上,在日期时间D,给定这些系统库的这些版本,同时系统处于此CPU负载量以及此I/O负载量,如果地面振动没有中断硬盘,并且宇宙射线没有翻转内存中的任何位,我的程序称为所有可用函数F"的子集G.

如果这些变量中的任何一个发生变化(输入是主要变量),那么之前的分析就不完整了.

注意:甚至无法对可能调用哪些函数做出强有力的保证,因为反射可以通过构造字符串来调用任何函数(因此您甚至无法扫描函数名称),甚至生成并注入全新的函数你的计划.