- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个与this fascinating question about detecting divide by zero exceptions at compile time相关的问题.
从 Eric Lippert 的回答来看,正确实现这一点并非易事(我想这就是为什么还没有提供的原因)。
我的问题是:
无论语言的“级别”如何,进行这些类型的检查的难度是否相同,例如高水平 vs 低水平?
具体来说,C# 编译器将 C# 转换为 MSIL。作为某种二次通过检查的一部分,这些类型的检查在 MSIL 级别会更容易还是更难?
或者,语言本身根本没有什么区别?
阅读 Eric 的回答中列出的问题,我认为检查必须在任何语言中都相同?例如,您可以使用多种语言进行跳转,因此需要实现 Eric 描述的流程检查......?
只是为了保持这个问题的具体性,这种检查在 MSIL 中是否比在 C# 中更容易或更难?
最佳答案
这是一个非常有趣和深刻的问题——尽管这个问题可能不太适合这个网站。
如果我理解的话,问题是在进行静态分析以追求缺陷时对分析语言的选择有何影响;分析器应该查看 IL,还是应该查看源代码?请注意,我已经从最初对被零除缺陷的狭隘关注扩展了这个问题。
答案当然是:视情况而定。这两种技术在静态分析行业中都很常用,而且各有优缺点。这取决于您正在寻找什么缺陷、您使用什么技术来修剪错误路径、抑制误报和推断缺陷,以及您打算如何向开发人员展示发现的缺陷。
分析字节码比源代码有一些明显的好处。主要的一点是:如果你有一个用于 Java 字节码的字节码分析器,你可以通过它运行 Scala,而无需编写 Scala 分析器。如果您有 MSIL 分析器,则可以通过它运行 C# 或 VB 或 F#,而无需为每种语言编写分析器。
在字节码级别分析代码也有好处。当您拥有字节码时,分析控制流非常容易,因为您可以非常快速地将字节码块组织成“基本块”;基本块是一个代码区域,其中没有指令分支到其中间,并且块的每个正常退出都在其底部。 (异常当然可以发生在任何地方。)通过将字节码分解为基本块,我们可以计算出相互分支的块图,然后根据每个块对局部和全局状态的 Action 来总结每个块。字节码很有用,因为它是对代码的抽象,可以在较低级别显示真正发生的事情。
这当然也是它的主要缺点; 字节码丢失有关开发人员意图的信息 .任何需要从源代码获取信息以检测缺陷或防止误报的缺陷检查器在字节码上运行时都会产生不良结果。例如考虑一个 C 程序:
#define DOBAR if(foo)bar();
...
if (blah)
DOBAR
else
baz();
else
绑定(bind)到
if(foo)
而不是
if(blah)
如开发商所愿。
async Task Foo(Something x)
{
if (x == null) return;
await x.Bar();
await x.Blah();
}
x
不能在此处取消引用为 null。但是 C# 会将其降低为一些绝对疯狂的代码;该代码的一部分将如下所示:
int state = 0;
Action doit = () => {
switch(state) {
case 0:
if (x == null) {
state = -1;
return;
};
state = 1;
goto case 1:
case 1:
Task bar = x.Bar();
state = 2;
if (<bar is a completed task>) {
goto case 2;
} else {
<assign doit as the completion of bar>
return;
}
case 2:
关于c# - DivideByZeroException 编译器检查复杂度 : easier or harder in MSIL vs C# or no difference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48171995/
最近,我在 CodeChef 上看到了这个题为“翻转硬币”的问题(链接:FLIPCOINS)。 综上所述,有N个硬币,我们必须编写一个支持两种操作的程序。 在 [A,B] 范围内掷硬币 分别找出[A,
如果是这样,你(如果你们在附近的话)如何处理这个问题?我今天刚听到一个故事,关于日本的聋人烟雾警报器使用芥末的气味来唤醒他们,所以我很好奇。 最佳答案 如果你真的很好奇,看看 http://www.w
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我主要在 GoogleMock 中使用有序期望,因此所有 EXPECT_CALL 都写在 testing::InSequence 对象的范围内。 现在我想放宽顺序,所以我将期望分为 2 个序列。你会说
这是一个与this fascinating question about detecting divide by zero exceptions at compile time相关的问题. 从 Eri
在执行捆绑安装时出现此错误: An error occurred while installing nokogiri-xmlsec-me-harder (0.9.3pre), and Bundler
我正在尝试将 Bluemix MQA 与我的移动应用程序集成。我在我的项目中使用 MQA-Android-2.7.4.arr 文件。我有一个与电话摇动相关的查询如下。 我如何在 Android 中让手
我是一名优秀的程序员,十分优秀!