1

它是由某种算法或数学程序生成的,用于测试代码是否产生所需的结果并且没有运行时/堆栈错误?或者是否有其他类型的启发式过程来决定要进行哪些更改。

4

1 回答 1

1

准确地说 - 任何类型的可执行代码写入基本上都是自修改代码,即使它不会产生任何有用的东西:)

但我假设您指的是有用的用例,例如 JIT 或二进制翻译器(我们将保留手动的用例,因为它们几乎只用作考试题)。考虑编译器的工作 - 在某些时候它处理代码流(通常以中间表示形式,一种带有附加信息的伪汇编)。然后它分析它并构建数据流和控制流图,并运行各种算法来优化它们。现在考虑一下,不是在编译时静态执行此操作,而是有一些驱动程序或运行时内核可以动态执行此操作(受益于额外的运行时数据,例如分支历史的采样)。然后这个代理可以修改代码(或者通常只是产生一个新的和改进的代码),并切换程序来运行它。它可以进一步回到那里并在未来的通行证上进行改进。代码正确性得到保证,就像普通编译器会保证一样。存在混淆新旧代码的额外风险(如果第三方在您运行优化版本时更改旧代码怎么办?如果 TLB 页面被清除怎么办?等等)。还有一些优化不能完全保证,可以通过在生成的代码中添加断言(和中止+展开流程)来保护。

于 2013-06-23T20:38:48.483 回答