gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:04:41 26 4
gpt4 key购买 nike

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

例如,给定这个:

static void Main(string[] args)
{
if (true)
{
CallTrueFunction();
}
else
{
CallFalseFunction();
}
}

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

最佳答案

简短的回答是

稍微长一点的答案是否定的,不适用于任何编程语言的任何重要程序

较长的答案是您在描述 the halting problem 或多或少。没有通用的方法来确定哪些方法可访问,哪些方法不可访问,因为这样做需要解决暂停问题。

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

与停机问题非常相似,您可以构建始终产生正确答案的微不足道的小程序,或者创建始终产生正确答案的极其微小的有限状态机。但是,如果您随后采用静态分析程序并在即使是中等规模的应用程序上运行它,潜在状态组合的数量也会迅速超过宇宙中可用原子的数量。

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

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

注意:甚至不可能对可能调用哪些函数做出强有力的保证,因为反射可以通过构造字符串来调用任何函数(因此您甚至无法扫描函数名称),甚至无法生成并注入(inject)品牌将新功能添加到您的程序中。

关于c# - .NET 静态分析——保证对程序中函数的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22888600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com