微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 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 举报,一经查实,本站将立刻删除。