- 主题:一个函数没有返回值,会发生什么?标准有什么规定吗?
生亦有涯而知亦无涯
所以,得过且过吧,呵呵。
【 在 z16166 的大作中提到: 】
: 不求甚解,哈哈
: 优化也不会改变语义
:
--
FROM 58.33.198.*
你不能期望对未定义行为进行优化有你预想的结果。
【 在 Madlee (无竹居士) 的大作中提到: 】
: 嗯,估计是优化的问题,不优化就没问题。
--
FROM 103.90.178.*
C++17加入了
[[nodiscard]] attribute
【 在 Madlee 的大作中提到: 】
: 我的一个一个函数,忘了return,但这个返回值没用。gcc O3优化直接挂了
: 有时候 segment fault. 有时候就直接进入一个无限循环。
: 后来加上一个return就一切正常了。
: ...................
--
FROM 98.228.215.*
这已经不是我所认识的C++了。 -_-b
【 在 mvtec 的大作中提到: 】
: C++17加入了
: [[nodiscard]] attribute
:
--
FROM 58.33.198.*
所以就想问问标准里这是不是未定义行为。我觉得不是。
返回一个乱七八糟值我是可以理解的,但是直接segment
fault有些太自由主义了。
【 在 ArchLinux 的大作中提到: 】
: 你不能期望对未定义行为进行优化有你预想的结果。
:
--
FROM 58.33.198.*
楼上这么多回复竟然没人答上来
函数都有调用规则的,这个规则定义了参数如何传递,返回值如何获取
有c,c++和pascal这些区分吧
我印象中(好多年不搞这些了),大部分情况下,返回值是将值放到寄存器eax中的。调用的地方再将eax转成对应的类型
如果你没用写return,那eax就是随机数吧
所以结果也是随机的
--
FROM 106.120.112.*
我琢磨是不是可能O3的策略有一条是caller不压栈只弹栈,callee return时自己压栈。然后你没return,栈没动,但是caller弹栈把栈弹崩了
【 在 Madlee 的大作中提到: 】
: 所以就想问问标准里这是不是未定义行为。我觉得不是。
: 返回一个乱七八糟值我是可以理解的,但是直接segment
: fault有些太自由主义了。
: ...................
--
FROM 213.95.148.*
标准对这种的定义就是UB。
有些情况下需要写这种不返回东西的函数,比如下面这个有人举了个需要直接abort而不返回任何东西的例子,来说明规范中为啥要定义成UB而不是强制为error。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43943
如果确定自己的工程中绝对不应该出现这种写法的函数,就打开-Werror=return-type开关。
ISO_IEC_14882__2020-12.pdf 第160页:
8.7.4 The return statement
Flowing off the end of a constructor, a destructor, or a non-coroutine function with a cv void return type is equivalent to a return with no operand. Otherwise, flowing off the end of a function other than main (6.9.3.1) or a coroutine (9.5.4) results in undefined behavior.
翻译一下,就是:
ctor、dtor、void这三种函数中如果某个分支直到函数尾部都没有return语句的话,等价于这个函数分支是不带参数return了,不是UB。
上述三种函数之外的任何非main函数、非协程函数的函数中某个分支直到函数尾部都没有return语句的话,就是UB。
main函数、协程函数中的这种情况是单独有章节规定是否为UB的。
--
修改:z16166 FROM 61.48.129.*
FROM 61.48.129.*
无法复现你说的这个问题。。。
能贴一个可以复现这个问题的最小代码吗?
【 在 Madlee 的大作中提到: 】
: 我的一个一个函数,忘了return,但这个返回值没用。gcc O3优化直接挂了
: 有时候 segment fault. 有时候就直接进入一个无限循环。
: 后来加上一个return就一切正常了。
: ...................
--
FROM 115.171.61.*