在部分代码中关闭优化

turning optimisation off in part of code

本文关键字:优化 代码      更新时间:2023-10-16

我开始使用 vmprotect sdk 来保护我的应用程序,但我遇到了一些问题,最大的问题是编译器优化 - 它优化了我的标记,看看一个例子:

void *CaptureInterface( char *pszInterfaceName )
{
    VMProtectBeginMutation( "capture_interface" );
    void* ptr = 12345;
    ...
    ...
    ...
    VMProtectEnd( );
    return ptr;
}

我尝试了各种组合,VMProtectEnd 在返回之前,之后,但编译器不断优化 VMProtectEnd 函数,因此调用在反汇编中不可见,因此标记开始不配对,我无法保护我的应用程序。有没有办法将优化相关的东西变成 1 或 2 个功能?或者有没有其他方法可以告诉编译器不要碰那个标记,而是继续优化其他标记?

您正在寻找#pragma optimize预处理器指令。

例如,请参阅 https://msdn.microsoft.com/en-us/library/chh3fb0k.aspx

无论如何,

这些东西都没有多大帮助,我个人担心,如果他们不能正确处理这样一个基本的事情,他们还会对你的代码做什么,调试起来真的很有趣。

但无论如何,如果你想避免他们优化代码,我可能会做一些内联汇编来调用:

static void foo() {
}
void test() {
    std::cout << "Hello Worldn";
    foo();
    std::cout << "Goodbye worldn";
}
void test2() {
    std::cout << "Hello Worldn";
    __asm {
        call foo;
    }
    std::cout << "Goodbye worldn";
}

test2 中对 foo 的调用在 VS2015 中未使用/O2 进行优化。不过,这仅限于 x86 代码,因为据我所知,Microsoft不再支持 x64 的内联汇编。

如果对函数

的调用不仅仅是对运行时的提示,而是调用本身很重要,则可以使用函数指针以可移植的方式实现此目的。我对使用过的图书馆的内部了解不够,不知道是否是这种情况。