请教C语言函数中有多个return的安全隐患?

shiwo45 2013-06-26 03:12:47
在著名的Misra C编码标准里,有这么一条规则:
A function shall have a single point of exit at the end of the function.
也就是说,一个函数只能在函数的末尾出现一个出口,如果在一个函数中使用多个return是不允许的。如下面的例子是不允许的:
int function(parameter list)
{
If(expression1)
{
Statement sequence;
return code_1;
}

If(expression2)
{
Statement sequence;
return code_2;
}

If(expression3)
{
Statement sequence;
return code_3;
}
return code_4;
}

需要改成:
int function(parameter list)
{
If(expression1)
{
Statement sequence;
Return_val= code_1;
}

If(expression2)
{
Statement sequence;
Return_val=code_2;
}

If(expression3)
{
Statement sequence;
Return_val=code_3;
}
return Return_val;
}

请教各位大虾,C语言函数中有多个return有什么安全隐患?我觉得没什么啊。。。
...全文
1077 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
引用 6 楼 shiwo45 的回复:
引用 5 楼 worldy 的回复:
中途return有点违反结构化原则而已,编译器知道自己要怎么return,单步调试代码你肯定发现,不管在哪return,下一句肯定是停留函数体结束的那个大括号 }上面
是的,我之前有过调试发现出口是固定在函数末尾,正因为如此,我才觉得它没有什么安全隐患。不过看了大家的回复,我觉得可能就是大家说的,不是因为安全问题,是因为结构化原则或是程序设计准则。谢谢回答。
如果我在最后一个return之前写一段代码,期望它在函数退出前执行,一定办不到。我无法给那个大括号增加代码……
csdcr 2013-06-26
  • 打赏
  • 举报
回复
问题不大,方便以后修改而已,譬如你的返回值类型变了,你可以试试一个一个修改过去嘿…… 另外,可能还有后续的一些操作,以及代码的执行顺序冲突,必须到最后才return 至于小的子程序,怎么写都无所谓了
nice_cxf 2013-06-26
  • 打赏
  • 举报
回复
似乎以前某些台湾的企业有这个要求,现在这个早就没人用了,看linux的源代码,根本没人用这个
mujiok2003 2013-06-26
  • 打赏
  • 举报
回复
c语言中,遵循这样的原则可以统一处理资源回收以减少冗余代码,减少出错的可能性。 在C++中,常用RAII(Resource Acquisition Is Initialization, 资源获取就是初始化)的手法。
shiwo45 2013-06-26
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
中途return有点违反结构化原则而已,编译器知道自己要怎么return,单步调试代码你肯定发现,不管在哪return,下一句肯定是停留函数体结束的那个大括号 }上面
是的,我之前有过调试发现出口是固定在函数末尾,正因为如此,我才觉得它没有什么安全隐患。不过看了大家的回复,我觉得可能就是大家说的,不是因为安全问题,是因为结构化原则或是程序设计准则。谢谢回答。
worldy 2013-06-26
  • 打赏
  • 举报
回复
中途return有点违反结构化原则而已,编译器知道自己要怎么return,单步调试代码你肯定发现,不管在哪return,下一句肯定是停留函数体结束的那个大括号 }上面
lwhlx 2013-06-26
  • 打赏
  • 举报
回复
我原来也是n个return的,但觉得1楼说得有理,中间return的话就执行不了清理了
hugett 2013-06-26
  • 打赏
  • 举报
回复
我觉得主要是方便维护吧。。
www_adintr_com 2013-06-26
  • 打赏
  • 举报
回复
编码规范不涉及到安全隐患吧... 只是人家觉得这样的函数看起舒服, 好理解呢.
橡木疙瘩 2013-06-26
  • 打赏
  • 举报
回复
某一天另一个人要修改你的函数,在函数开头加了一些准备工作,然后在函数结束时加了一些清理工作……

65,182

社区成员

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

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