On Sun, 30 Jan 2022, 10:42 Jakub Jelinek via Gcc, <gcc@gcc.gnu.org> wrote:
> On Sun, Jan 30, 2022 at 10:47:41AM +0100, Theodore Papadopoulo wrote: > > Before creating a bug report, I want to check with the GCC community (all > > the more that checking that the problem has not yet been reported is > > complicated at leat for me). > > > > The following (admitedly buggy) program generates a segmentation > violation > > on fedora 35 (this is with g++ 11.2.1 20211203 (Red Hat 11.2.1-7) (GCC)) > > when compiled with -O3 (other versions replacing unisgned by std::string > may > > trigger the exception instead of the segv) > > > > bool assert_sthg(const unsigned s) { > > if (s==123) > > throw 1; > > } > > > > int main() { > > assert_sthg(0); > > return 0; > > } > > > > When compiling, we indeed get a warning: > > > > test.C:4:1: warning: control reaches end of non-void function > > [-Wreturn-type] > > > > I can well understand that the program being buggy that the optimizer is > > allowed to do anything including the observed segmentation violation. > > Yet the result is quite surprising.... > > Undefined behavior can have any kind of surprising behavior. > > > The question is, in that case, wouldn't it be better to turn the warning > > into an error at -O3 ? > > No, it can't be an error by default, it is undefined behavior only at > runtime, if you never call the function or always call it with > assert_sthg(123), then the program can be valid. > We could put a trap instruction at the end of the function though, which would make the result a bit less arbitrary. I've come around to thinking that's preferable for cases like this.