【问题标题】:Can I force gcc/clang to emit a function call, even when optimising?即使在优化时,我可以强制 gcc/clang 发出函数调用吗?
【发布时间】: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


【解决方案1】:

使用属性optnoneoptimizefunc 的优化级别设置为-O0

我的机器上只定义了optnone。所以我的代码如下,但你的可能使用标题__attribute__ ((optimize("0")))

#include <stdlib.h>

uint32_t __attribute__ ((optnone)) func(void) {
    return 0xCCCCCCCC;
}

int main()
{
    return func();
}

In clang, how do you use per-function optimization attributes?

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多