vs2010/ gcc 针对 return 语句的编译优化、警告方式

Lakesy 2013-06-07 02:24:19
如有一函数 :
int GetThreeSeven()
{
return 333 ; + 444;
}

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

我手头资料上 找不到相关解决方案。
...全文
161 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
always_learn 2013-06-07
  • 打赏
  • 举报
回复
gcc --help=warnings打印看看有没有 -Wunreachable-code 听说较老版本的gcc有这个东西,由于不稳定在后来的版本就取消了
Lakesy 2013-06-07
  • 打赏
  • 举报
回复
引用 9 楼 lin5161678 的回复:
做不到的 因为 有时候 你会写这样的代码
if(GetError())
        return Error;
//TODO:
        /*
                各种其他代码
        */
就是说 你的return 语句 后面有其他语句的情况是完全正常的逻辑 编译器怎么可以随便给警告
确实如此呀。
lin5161678 2013-06-07
  • 打赏
  • 举报
回复
做不到的 因为 有时候 你会写这样的代码
if(GetError())
        return Error;
//TODO:
        /*
                各种其他代码
        */
就是说 你的return 语句 后面有其他语句的情况是完全正常的逻辑 编译器怎么可以随便给警告
luciferisnotsatan 2013-06-07
  • 打赏
  • 举报
回复
c/c++里可以嵌汇编,还有goto。谁能保证不会有人故意跳到return后面
Lakesy 2013-06-07
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
提醒:运行结果 333
我和一位同事也 汇编 看过, 确实没有 去掉 + 444 部分; 那难道只能在 编码的时候极度小心才能避免这种错误码 ?
赵4老师 2013-06-07
  • 打赏
  • 举报
回复
提醒:运行结果 333
赵4老师 2013-06-07
  • 打赏
  • 举报
回复
跟优化没有关系。
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
图灵狗 2013-06-07
  • 打赏
  • 举报
回复
这类问题应该是属于lint检测的范畴,而不是编译器。
引用 2 楼 Lakesy 的回复:
我也明白这是 合法的语句;但就是我的这种“错误的编码方式”使代码出bug了; 我主要是想让编译器能否再“智能”些, 例如 有warning 可以提示 “并不是所有分支都有 返回值”等。 以下两方面是我想提出这个问题的 考虑出发点: 1.编码规范; 想ThreeSeven() 函数就这么间断的语句,但 return 内包含有操作, 而非仅仅是返回所要值; 或许effective c++ 上有什么“箴言”可以指导指导, 能够在“心法”上尽量杜绝这种问题。 2.编译器级别防止 低级错误, 好像 return 语句完毕后, 还有其他操作 例如 +444; 虽然这语句合法, 但编译器并没有能够 “防止”我继续编写 “合法的”没有代码吧假如, return 333 ; + 444 + 555 + iOthers + ... 很明显, 我的意图并不是仅仅 是一个 333 作为结果。
疯狂的红豆 2013-06-07
  • 打赏
  • 举报
回复
你这算是为难编译器呢吧,,,
Lakesy 2013-06-07
  • 打赏
  • 举报
回复
我也明白这是 合法的语句;但就是我的这种“错误的编码方式”使代码出bug了; 我主要是想让编译器能否再“智能”些, 例如 有warning 可以提示 “并不是所有分支都有 返回值”等。 以下两方面是我想提出这个问题的 考虑出发点: 1.编码规范; 想ThreeSeven() 函数就这么间断的语句,但 return 内包含有操作, 而非仅仅是返回所要值; 或许effective c++ 上有什么“箴言”可以指导指导, 能够在“心法”上尽量杜绝这种问题。 2.编译器级别防止 低级错误, 好像 return 语句完毕后, 还有其他操作 例如 +444; 虽然这语句合法, 但编译器并没有能够 “防止”我继续编写 “合法的”没有代码吧假如, return 333 ; + 444 + 555 + iOthers + ... 很明显, 我的意图并不是仅仅 是一个 333 作为结果。
图灵狗 2013-06-07
  • 打赏
  • 举报
回复
这应该算是符合语法的,分号是语句的分隔符 return 333 ; + 444; 都算是合法的语句。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧