读书人

vs2010/ gcc 针对 return 话语的编译优

发布时间: 2013-07-04 11:45:33 作者: rapoo

vs2010/ gcc 针对 return 语句的编译优化、警告方式
如有一函数 :
int GetThreeSeven()
{
return 333 ; + 444;
}

能够编译通过, 不报错不警告, 估计是被编译优化了 return 语句 后面的 + 444 ; 部分;
但从函数名 知道我需要的 预期结果是 返回 777; 虽然这是 我作为程序员自己的问题, 但vs2010 编译器会 gcc 有没有什么编译选项 可以“禁止return 完整语句后面多余操作”的 设置 ,
例如 #pragram (error : xxx)

我手头资料上 找不到相关解决方案。
[解决办法]
这类问题应该是属于lint检测的范畴,而不是编译器。

引用:
我也明白这是 合法的语句;但就是我的这种“错误的编码方式”使代码出bug了; 我主要是想让编译器能否再“智能”些, 例如 有warning 可以提示 “并不是所有分支都有 返回值”等。 以下两方面是我想提出这个问题的 考虑出发点:

1.编码规范; 想ThreeSeven() 函数就这么间断的语句,但 return 内包含有操作, 而非仅仅是返回所要值; 或许effective c++ 上有什么“箴言”可以指导指导, 能够在“心法”上尽量杜绝这种问题。

2.编译器级别防止 低级错误, 好像 return 语句完毕后, 还有其他操作 例如 +444; 虽然这语句合法, 但编译器并没有能够 “防止”我继续编写 “合法的”没有代码吧假如,
return 333 ; + 444
+ 555
+ iOthers
+ ...

很明显, 我的意图并不是仅仅 是一个 333 作为结果。

[解决办法]
跟优化没有关系。
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 语句 后面有其他语句的情况是完全正常的逻辑
编译器怎么可以随便给警告

读书人网 >C++

热点推荐