如何强制gcc的优化器不对我的代码中的char数组的内容做出任何假设?据我所知,这应该可以使用volatile
关键字,但它似乎不起作用。
看看以下代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
volatile unsigned char magickey[] = "\xDE\xAD\xC0\xDE\xC0\xDE\xCA\xFE\xC0\xCA\xC0\x1A";
volatile unsigned int val;
// printf("TEST: %p\n", magickey);
val = (magickey[0] << 24) | (magickey[1] << 16) | (magickey[2] << 8) | magickey[3];
printf("TEST2: %x\n", val);
return 0;
}
我像这样编译可执行文件:
gcc -O3 test.c
我希望能够在十六进制编辑器中打开可执行文件并更改magickey
char数组的前4个字节,而val
应该包含我在字符中的十六进制字节数组通过修改可执行文件。
只有在第一次调用printf
时才会停用此功能(如上面显示的代码所示)。然而,只要我激活对printf
的第一次调用,无论使用十六进制编辑器将可执行文件写入可执行文件的哪个值,程序始终会打印TEST2: deadc0de
。
这令我感到困惑。对printf
的第一次调用似乎完全无害,因为它只打印了char数组的地址。我不明白为什么激活此行会以任何方式影响优化器。
所以我一定做错了。我该怎么做才能强制优化器不要对magickey
char数组的内容做任何假设,这样我就可以在编译后用任意字节填充它,方法是使用十六进制编辑器和我写入的字节来破解可执行文件它使用十六进制编辑器被正确复制到val
? volatile
似乎并没有真正完成这项工作。