On 2019-03-24 12:45 +0000, Jonny Grant wrote: > Hello! > > Is this an issue? G++ doesn't identify problem in this test case doesn't > when compiling or running. > > "hello" is not displayed, std::cout never works again after nullptr. > > > // g++-8 -Wall -Wextra -Wconversion-null -Wno-nonnull-compare > -Wzero-as-null-pointer-constant > -fsanitize=null,returns-nonnull-attribute,signed-integer- > overflow,leak,undefined,address > -o cout cout.cpp > #include <iostream> > int main() > { > const char * p = nullptr; > std::cout << p; > std::cout << "hello"; > } The standard *Requires* p is not a null pointer here (N4618 27.7.3.2.4 p3). So if p is a null pointer, the implementation (GCC and libstdc++) can do anything. Libstdc++ is friendly. It does not abort, raise exception, or run /usr/game/starwar, it just sets ios::badbit to cout (ostream:559) so actually you can detect this issue by checking the state of cout. But do NOT rely on this behavior. This is really undefined. Because libstdc++ is so friendly, the sanitizer don't even know this is an undefined behavior. And, it can not sanitize undefined behaviors in libstdc++.so because it was built w/o -fsanitize= option. Well, if you want this to be detected at compile time, maybe you can convince Jonathan to add an __attribute__((nonnull(2))) to operator<<(basic_ostream&, const char *). Then this case can be detected with "-O -Wnonnull". -- Xi Ruoyao <xry111@xxxxxxxxxxxxxxxx> School of Aerospace Science and Technology, Xidian University