https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101850
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Prasanta Behera from comment #0) > Version info: > ============= > ~$ g++ --version > g++ (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0 > Copyright (C) 2018 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > ~$ gcc --version > gcc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0 > Copyright (C) 2018 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > > Sample Program: > =============== > ~$ cat t.cpp > #include <string> > > int main() { > std::string s = s; > return 0; > } > > Problem Description: > ==================== > The above program tries to initialise a string with itself which is wrong! Yes, it's undefined behaviour. > However g++ does not show any compile time error, but the resulting binary > fails at run time throwing std::bad_alloc as shown below. That's one way that undefined behaviour can manifest itself. You cannot expect to get a compile time error for all cases of undefined behaviour, that's why it's undefined. > ~$ g++ t.cpp > ~$ ./a.out > terminate called after throwing an instance of 'std::bad_alloc' > what(): std::bad_alloc > Aborted (core dumped) > > gcc however shows a link time error which is slightly better. > > ~$ gcc t.cpp > /tmp/cc30YkgH.o: In function `main': > t.cpp:(.text+0x27): undefined reference to `std::__cxx11::basic_string<char, > std::char_traits<char>, std::allocator<char> > >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, > std::allocator<char> > const&)' > t.cpp:(.text+0x38): undefined reference to `std::__cxx11::basic_string<char, > std::char_traits<char>, std::allocator<char> >::~basic_string()' > collect2: error: ld returned 1 exit status No, this is just because gcc doesn't link to the C++ runtime which is needed to use std::string. You will get the same link error for a correct program, it has absolutely nothing to do with the bug in your code. > I think the coding error should be caught at the compile time by g++. It is caught, by a warning. In the general case, turning all such mistakes into errors is impossible: const std::string& func(const std::string&); std::string s = func(s); The compiler cannot know whether func has undefined behaviour or not. It could be defined like this, which would be OK: const std::string& func(const std::string& /*unused*/) { static std::string str = "a string with static storage duration"; } Or it could be defined like this, which would be equivalent to your example: const std::string& func(const std::string& s) { return s; } tl;dr it is not reasonable to expect to always get a compile time error for undefined behaviour, it's the programmer's responsibility to avoid undefined behaviour. COmpiler warnings can help, if you enable them and pay attention to them.