gpt4 book ai didi

methods - 不需要 ret 的 MSIL 方法

转载 作者:行者123 更新时间:2023-12-04 15:12:18 25 4
gpt4 key购买 nike

我最近一直在尝试编写 MSIL 并使用 ilasm 编译它,当我注意到方法确实需要 ret 指令从方法末尾返回时;
例如,我应该写这样的代码:

.method static void Main()
{
.entrypoint
ldstr "Hello World!"
call void [mscorlib]System.Console::WriteLine(string)
ret //I am returning properly
}

但是,如果我省略 ret,代码仍会运行并输出“Hello World!”完美。起初我认为这可能特定于入口点方法,但 ilasm 愉快地编译了这段代码,既没有警告也没有错误:
.assembly Program{}
.assembly extern mscorlib{}
.method static void Main()
{
.entrypoint
ldstr "Hello World!"
call void [mscorlib]System.Console::WriteLine(string)
ldstr "Foo returned: {0}!"
call int32 Foo()
box int32
call void [mscorlib]System.Console::WriteLine(string, object)
}
.method static int32 Foo()
{
ldstr "Hello from Foo!"
call void [mscorlib]System.Console::WriteLine(string)
ldstr "GoodBye!"
call void [mscorlib]System.Console::WriteLine(string)
ldc.i4 42
}

注意 Main() 和 Foo() 都没有 return 语句。 Foo() 甚至有返回值!
编译并运行此代码后,我得到以下输出:

你好,世界!
来自 Foo 的你好!
再见!
Foo 返回:42!

程序也正常终止。然后我想也许 ilasm 是自动插入 ret 语句,但是在使用 ildasm 查看程序之后,这些方法与上面的代码相同,即没有返回。

奇怪的是,当我尝试用 DotPeek 反编译该方法时,它完全拒绝用 // ISSUE: unable to decompile the method. 替换两个方法体。

如果我添加 ret 语句并重新编译 DotPeek 可以毫无问题地反编译这两种方法。

有人可以解释一下这里发生了什么吗?

最佳答案

我认为这是因为 CLR 有时会接受无效的 IL,只有当它遇到它实际上无法执行的 IL 时,它才会抛出 InvalidProgramException .我的猜测是这样做是出于性能原因:验证 IL 遵循所有规则会太慢。

如果您想验证您的 IL 是否有效,您应该对其使用 PEVerify。

而当你有无效代码时,DotPeek 之类的一些工具无法处理它也就不足为奇了。

关于methods - 不需要 ret 的 MSIL 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294852/

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