![]() |
1
10
当然,假设这是疯狂的。 |
![]() |
2
16
我用过它们,尽管我从未听说过这个词
代码洞穴
最终,我认为 |
![]() |
3
13
代码洞穴通常由编译器创建 alignment 并且经常大量地位于功能之间。结构和跳转之间也应该存在代码空洞(在某些架构中),但通常不会有任何显著的数量。 你也可以搜索一块清零的内存,但不能保证程序不会使用它们。
编辑 对于那些建议代码洞穴仅用于运行时生成的代码的人来说:这是一个不完整的定义。很多时候,我在“代码洞穴”中编写了一个数据结构,并更新了指向那里的指针,我怀疑我不是唯一这样做的人。 |
![]() |
4
8
一些合法用途 :在不重新启动的情况下修补实时操作系统二进制文件(MS会这样做),将低级操作系统功能(文件系统、网络)与防火墙和防病毒软件挂钩,在没有源代码的情况下扩展应用程序(比如抓取低级操作系统对DrawText的调用,这样你就可以为盲人大声朗读) |
![]() |
5
6
here 让我想起 patchpoints --合法使用。 |
![]() |
6
4
不熟悉术语但热补丁机制可以使用保留空间来存储代码补丁。您挂接到有缺陷的函数,并将其重定向到新的改进函数。它可以在不关闭关键设备(大型电信交换机)的情况下即时完成。 |
![]() |
7
3
|
![]() |
8
3
曾经 进入生产代码: |
![]() |
9
2
自我修改代码不应被轻视,但有时可以带来巨大的性能提升。如果你已经编程很长时间了,你可能会在不知不觉中使用它。 在486及更高版本广泛使用之前,许多PC不包括硬件浮动支持。这使得编写涉及浮点运算的程序的人陷入两难境地。如果他们将程序编译为使用内联浮点指令,它将在配备浮点处理器的机器上快速运行,而在没有浮点处理器的计算机上则完全无法运行。如果他们用软件浮点模拟编译程序,它将在所有机器上运行,但即使在有硬件浮点的机器上也会运行缓慢。 许多编译器库对自修改代码使用了一种有趣的技巧。默认行为是在需要浮点运算的地方放置陷阱指令。陷阱处理程序将在软件中模拟指令,或者如果它检测到它正在具有浮点硬件的机器上运行,它将通过用适当的硬件浮点指令替换陷阱指令来修改代码并执行它。结果是软件在所有机器上运行并且在具有浮点硬件机器上运行的速度几乎和代码被编译为直接使用浮点硬件一样快(因为大多数浮点密集型操作都发生在多次执行的循环中)。 |