为什么 JIT 编译器需要做 IL 验证,而 csc 编译器实际上可以完成这项工作?

问题描述

我们知道 .net 有两种编译器。一个是 csc.exe,它将 C# 代码编译成 IL。另一个是 JIT 编译器,将 IL 编译为原生 cpu 指令。

我正在阅读一本关于 IL 如何提供应用程序健壮性和安全性的 .net 书籍:

在将 IL 编译为原生 cpu 指令时,CLR 会执行一个称为验证的过程。验证检查高级 IL 代码并确保代码所做的一切都是安全的。例如,验证检查是否使用正确数量的参数调用每个方法,传递给每个方法的每个参数的类型是否正确,每个方法的返回值是否正确使用,每个方法都有一个 return 语句,等等.托管模块的元数据包括验证过程使用的所有方法和类型信息。

我对验证有点困惑。例如,对于“验证检查每个方法是否使用正确数量的参数调用”部分,这不是csc.exe的责任吗?如果你写了一个接受两个参数的方法,并且你的调用方法传递了三个参数给这个方法,显然代码不会编译,也不会生成IL。

但如果作者的意思是你可以在文本编辑器中编写不安全的 IL 代码并让 JIT 编译器执行它,那么 JIT 编译器可以按照 IL 所说的去做,如果 IL 不正确,程序将以某种方式终止并显示异常,为什么JIT编译器需要先做额外的工作,比如提前做一个预验证来检查一切正常?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)