https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90516
Bug ID: 90516
Summary: Strange behaviour of code if function no return value
and code embraced by try..catch with opt flags
Product: gcc
Version: 8.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: matszpk at interia dot pl
Target Milestone: ---
Created attachment 46371
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46371&action=edit
sample program preprocessed file
OS: Arch Linux 2019 (updated in 2019-05-12).
gcc -v output:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared
--enable-threads=posix --enable-libmpx --with-system-zlib --with-isl
--enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu
--disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object
--enable-linker-build-id --enable-lto --enable-plugin
--enable-install-libiberty --with-linker-hash-style=gnu
--enable-gnu-indirect-function --enable-multilib --disable-werror
--enable-checking=release --enable-default-pie --enable-default-ssp
--enable-cet=auto
Thread model: posix
gcc version 8.3.0 (GCC)
I encountered that bug when I trying to test some program that have bug: a
missing return in loading file function that code was embraced by try...catch.
Due to this bug and enabled optimization's flags program aborts due to double
free of the memory and it was strange behaviour of this function.
Later, I wrote sample program that load some string from file and doing nothing
this same bug (missing return) with code embraced by try..catch. If program was
compiled with optimizations flags (-O3) then and if file was exist and then
program print out exception in by statement in catch clause (just run clause)
with like: 'Exception at loading: basic_ios::clear: iostream error'.
In attachment are sample program code the preprocessed file of this sample
program.
program has been compiled following gcc command:
g++ -Wall -std=c++11 -O3 -o fstream-inc-beh fstream-inc-beh.cpp
Sample program:
-------------------------------
#include <iostream>
#include <fstream>
#include <exception>
bool loadFile(const char* fileName)
{
try
{
std::ifstream ifs(fileName);
std::string s;
ifs >> s;
}
catch(const std::exception& ex)
{
std::cout << "Exception at loading: " << ex.what() << std::endl;
return false;
}
}
int main(int argc, const char** argv)
{
if (argc < 2)
{
std::cout << "PROGRAM file" << std::endl;
return 0;
}
if (loadFile(argv[1]))
std::cout << "OK. Loaded" << std::endl;
else
std::cout << "ERROR: Not loaded!" << std::endl;
return 0;
}
--------------
end of program.
warnings while compiling this program:
---------
fstream-inc-beh.cpp: In function ‘bool loadFile(const char*)’:
fstream-inc-beh.cpp:18:1: warning: control reaches end of non-void function
[-Wreturn-type]
}
^
-----------