vs2010/ gcc 针对 return 语句的编译优化、警告方式
如有一函数 :
int GetThreeSeven()
{
return 333 ; + 444;
}
能够编译通过, 不报错不警告, 估计是被编译优化了 return 语句 后面的 + 444 ; 部分;
但从函数名 知道我需要的 预期结果是 返回 777; 虽然这是 我作为程序员自己的问题, 但vs2010 编译器会 gcc 有没有什么编译选项 可以“禁止return 完整语句后面多余操作”的 设置 ,
例如 #pragram (error : xxx)
我手头资料上 找不到相关解决方案。
[解决办法]
这类问题应该是属于lint检测的范畴,而不是编译器。
[解决办法]
跟优化没有关系。
1: #include <stdio.h>
2: int GetThreeSeven()
3: {
00401000 55 push ebp
00401001 8B EC mov ebp,esp
00401003 83 EC 40 sub esp,40h
00401006 53 push ebx
00401007 56 push esi
00401008 57 push edi
4: return 333 ; + 444;
00401009 B8 4D 01 00 00 mov eax,14Dh
5: }
0040100E 5F pop edi
0040100F 5E pop esi
00401010 5B pop ebx
00401011 8B E5 mov esp,ebp
00401013 5D pop ebp
00401014 C3 ret
6: int main() {
00401020 55 push ebp
00401021 8B EC mov ebp,esp
00401023 83 EC 40 sub esp,40h
00401026 53 push ebx
00401027 56 push esi
00401028 57 push edi
7: printf("%d\n",GetThreeSeven());
00401029 E8 D2 FF FF FF call GetThreeSeven (00401000)
0040102E 50 push eax
0040102F 68 A4 20 40 00 push offset string "%d\n" (004020a4)
00401034 FF 15 00 20 40 00 call dword ptr [__imp__printf (00402000)]
0040103A 83 C4 08 add esp,8
8: return 0;
0040103D 33 C0 xor eax,eax
9: }
0040103F 5F pop edi
00401040 5E pop esi
00401041 5B pop ebx
00401042 8B E5 mov esp,ebp
00401044 5D pop ebp
00401045 C3 ret
1: #include <stdio.h>
2: int GetThreeSeven()
3: {
00401000 55 push ebp
00401001 8B EC mov ebp,esp
00401003 83 EC 40 sub esp,40h
00401006 53 push ebx
00401007 56 push esi
00401008 57 push edi
4: return 333 ; + 444;
00401009 B8 4D 01 00 00 mov eax,14Dh
5: }
0040100E 5F pop edi
0040100F 5E pop esi
00401010 5B pop ebx
00401011 8B E5 mov esp,ebp
00401013 5D pop ebp
00401014 C3 ret
6: int main() {
00401020 55 push ebp
00401021 8B EC mov ebp,esp
00401023 83 EC 40 sub esp,40h
00401026 53 push ebx
00401027 56 push esi
00401028 57 push edi
7: printf("%d\n",GetThreeSeven());
00401029 E8 D2 FF FF FF call GetThreeSeven (00401000)
0040102E 50 push eax
0040102F 68 A4 20 40 00 push offset string "%d\n" (004020a4)
00401034 FF 15 00 20 40 00 call dword ptr [__imp__printf (00402000)]
0040103A 83 C4 08 add esp,8
8: return 0;
0040103D 33 C0 xor eax,eax
9: }
0040103F 5F pop edi
00401040 5E pop esi
00401041 5B pop ebx
00401042 8B E5 mov esp,ebp
00401044 5D pop ebp
00401045 C3 ret
[解决办法]
c/c++里可以嵌汇编,还有goto。谁能保证不会有人故意跳到return后面
[解决办法]
做不到的
因为 有时候 你会写这样的代码
if(GetError())
return Error;
//TODO:
/*
各种其他代码
*/
就是说 你的return 语句 后面有其他语句的情况是完全正常的逻辑
编译器怎么可以随便给警告