【发布时间】:2015-12-21 00:40:32
【问题描述】:
我有一些代码在 ptrace 下运行 x64 程序并操纵它们的代码。为了测试这类事情,我在我的一个测试程序中有一个占位符函数:
uint32_t __attribute__((noinline)) func(void) {
return 0xCCCCCCCC;
}
然后在运行时将0xCCCCCCCC 替换为其他常量。
但是,当我使用 clang 和优化进行编译时,clang 会用常量 0xCCCCCCCC 替换对函数的调用(因为函数非常简单)。例如,下面是为调用生成的部分代码,用于检查对修改后的TestFunc() 的调用是否返回0xCDCDCDCD,它应该在修改后返回:
movl $3435973836, %edi ## imm = 0xCCCCCCCC
movl $3435973836, %eax ## imm = 0xCCCCCCCC
leaq 16843009(%rax), %rdx ## [16843009 = 0x01010101]
正如您可能想象的那样,此测试随后失败,因为这两个不匹配的常量值将不匹配!
我可以强制 clang(希望以同样的方式,gcc...)生成函数调用吗?
(我不想全局禁用优化 - 我已经有一个可以做到这一点的构建(并且通过该构建,所有测试都通过了)。如果可能的话,我只想做一个现场修复。)
【问题讨论】:
-
也许你可以把函数体放在代码不可见的地方,这可能会优化它
-
这确实有效,但我有点怀疑整个程序优化会看穿它!使用更类似于
volatile的函数调用类似物的东西,我会感觉更安全。 -
你能通过
volatile函数指针调用它吗? -
请将此作为 bug 报告给 clang,他们确实在 clang.llvm.org/docs/AttributeReference.html 中提到了 noinline 属性。如果他们不支持它,他们应该打印一个警告。
标签: c gcc optimization clang self-modifying