C# IL的应用健壮性和安全性优势

C# IL的应用健壮性和安全性优势,c#,clr,C#,Clr,我正在通过C#书阅读CLR,书中说: IL(中间语言)的最大好处不是它抽象了底层CPU。IL提供的最大好处是应用程序健壮性和安全性。在将IL编译为本机CPU指令时,CLR执行一个称为验证的过程。验证检查高级IL代码并确保代码所做的一切都是安全的。例如,验证检查是否使用正确数量的参数调用每个方法,传递给每个方法的每个参数的类型是否正确,每个方法的返回值是否正确使用,每个方法是否有返回语句,等等 我有点困惑,对于C或C++,它不使用IL,如果我们定义了一个方法,它只需要一个参数,但不调用参数,GCC

我正在通过C#书阅读CLR,书中说:

IL(中间语言)的最大好处不是它抽象了底层CPU。IL提供的最大好处是应用程序健壮性和安全性。在将IL编译为本机CPU指令时,CLR执行一个称为验证的过程。验证检查高级IL代码并确保代码所做的一切都是安全的。例如,验证检查是否使用正确数量的参数调用每个方法,传递给每个方法的每个参数的类型是否正确,每个方法的返回值是否正确使用,每个方法是否有返回语句,等等


<>我有点困惑,对于C或C++,它不使用IL,如果我们定义了一个方法,它只需要一个参数,但不调用参数,GCC会抛出一个异常,指出参数太少,所以C或C++也可以提供健壮性和安全性,而不需要中间语言的概念,那么使用IL的真正好处是什么呢?

在C/C++中,您可以,例如,获取一个函数指针并将其强制转换为您喜欢的任何对象,这样您就可以将其强制转换为一个不符合原始函数规范的函数指针,然后这样调用它,从而导致访问冲突,堆栈损坏或任何其他未定义的行为

通过提供内存安全和类型安全,可以看出已验证IL的好处

  • 内存安全规定只能在代码被授予访问权限的情况下访问内存位置。
    例如,您不能读取任意位置、执行指针算术、溢出缓冲区或读取未初始化的内存
  • 类型安全规定只能按照定义的方式读取和写入内存位置。
    因此,例如,您不能将错误的类型放入其中:integer到struct location,或对象引用到string location,强制转换到错误的类型,或调用具有错误类型作为参数的函数。这还可以保护堆栈,该堆栈具有定义的行为

IL的好处可以被看作是在编译时提供所有定义的行为并防止所有类的错误,而C/C++中很容易出现未定义的行为。

例如,在C/C++中,您可以获取一个函数指针并将其强制转换为您喜欢的任何对象,因此,您可以将其强制转换为不符合原始函数规范的函数指针,然后像这样调用它,从而导致访问冲突、堆栈损坏或任何其他未定义的行为

通过提供内存安全和类型安全,可以看出已验证IL的好处

  • 内存安全规定只能在代码被授予访问权限的情况下访问内存位置。
    例如,您不能读取任意位置、执行指针算术、溢出缓冲区或读取未初始化的内存
  • 类型安全规定只能按照定义的方式读取和写入内存位置。
    因此,例如,您不能将错误的类型放入其中:integer到struct location,或对象引用到string location,强制转换到错误的类型,或调用具有错误类型作为参数的函数。这还可以保护堆栈,该堆栈具有定义的行为

IL的好处可以被看作是在编译时提供所有定义的行为并防止所有类的错误,而C/C++很容易发生未定义的行为。

例如,如果您编写DLL A调用DLL B,然后更改DLL B,可能会有所帮助吗,您编写DLL A来调用DLL B,然后更改DLL B?