https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111729

            Bug ID: 111729
           Summary: Design considerations for operator<<(basic_ostream&,
                    const charT*)
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: llvm at rifkin dot dev
  Target Milestone: ---

The following program violates a precondition specified in the standard and is
UB however it leads to some surprising behavior

#include <iostream>
int main() {
    std::cout<<(const char*)nullptr;
    std::cout<<"test";
}

There is no segfault, no abort, no non-zero exit status, and no exception.
Instead the program silently continues with the output stream's badbit set.
This can silently ruin the behavior of the rest of the program leaving the
programmer to pull their hair out over what on earth is happening.

Yes, it's UB and the programmer can't expect anything, however it's a very easy
mistake to make and the current behavior makes tracking down that mistake
exceedingly difficult.

I would like to humbly suggest that any of the following behaviors would be
better: Segfaulting, throwing an exception, aborting, an assertion failure in
debug, or printing "(null)" (which is the %s behavior). Libc++ and msvc's stl
both segfault here.

Reply via email to