我通过两种方式编译C代码片段VS2010:
int g_arra[3];
int main() {
int idx = 2;
g_arra[0] = 10;
g_arra[1] = 20;
g_arra[2] = 30;
g_arra[idx] = 40;
return 0;
}
- 有
/O2优化 - 没有
/O2优化
关于/O2优化:
此选项可优化速度。这是通常推荐的优化级别。在 O2 和更高级别启用编译器矢量化。使用此选项,编译器执行一些基本循环优化、内联内联、文件内过程间优化和最常见的编译器优化技术。
当试图扭转它时:
有
/O2优化:; int __cdecl main(int argc, const char **argv, const char **envp) .text:00401000 _main proc near ; CODE XREF: ___tmainCRTStartup+11Dp .text:00401000 mov dword_403390, 10 .text:0040100A mov dword_403394, 20 .text:00401014 mov dword_403398, 40 .text:0040101E xor eax, eax .text:00401020 retn .text:00401020 _main endp没有
/O2:; int __cdecl main(int argc, const char **argv, const char **envp) .text:00401000 _main proc near ; CODE XREF: ___tmainCRTStartup+11Dp .text:00401000 var_4 = dword ptr -4 .text:00401000 argc = dword ptr 8 .text:00401000 argv = dword ptr 0Ch .text:00401000 envp = dword ptr 10h .text:00401000 push ebp .text:00401001 mov ebp, esp .text:00401003 push ecx .text:00401004 mov [ebp+var_4], 2 .text:0040100B mov dword_403390, 0Ah .text:00401015 mov dword_403394, 14h .text:0040101F mov dword_403398, 1Eh .text:00401029 mov eax, [ebp+var_4] .text:0040102C mov dword_403390[eax*4], 28h .text:00401037 xor eax, eax .text:00401039 mov esp, ebp .text:0040103B pop ebp .text:0040103C retn .text:0040103C _main endp
编译的代码没有/O2给我关于全局数组的明确解释,我可以计算它的大小(每个 4 字节[eax*4])以及它有多少个元素。
我的问题是,如何处理第一种情况?编译器隐藏其他指令在哪里?如何检测,函数具有全局分配数组或堆栈分配数组?