std::cout breaks after nullptr

Jonny Grant jg@jguk.org
Mon Mar 25 12:22:00 GMT 2019


Hello!

On 25/03/2019 11:36, Xi Ruoyao wrote:
> On 2019-03-25 12:11 +0100, Marc Glisse wrote:
>> On Mon, 25 Mar 2019, Jonathan Wakely wrote:
>>> On Sun, 24 Mar 2019, 13:53 Xi Ruoyao, <xry111@mengyan1223.wang> wrote:
>>>> Well, if you want this to be detected at compile time, maybe you can
>>>> convince
>>>> Jonathan to add an) to
>>>> operator<<(basic_ostream&,
>>>> const char *).  Then this case can be detected with "-O -Wnonnull".
>>>
>>> That seems like a good idea.
>>
>> Note that IIRC the attribute is also used for optimization purposes.
>> Adding it would remove the test "if (!__s)". One could try and add the
>> attribute only for user code and not while compiling the library itself,
>> but that's getting complicated (_GLIBCXX_EXTERN_TEMPLATE, specializations
>> for types other than char, etc).
> 
> Oh really.  I'd been misunderstanding "nonnull" as a pure diagnostic attribute
> for long time :(.

-Wnonnull causes warnings if the implementation checks for NULL. (Unless 
-Wno-nonnull-compare is set - which is probably a bad idea)

Although, g++-8 doesn't give any warning from this, it only seems to 
catch directly calling f(NULL);
That's a little limited?

Anyway - this is what the warning looks like in practice if the nonnull 
attribute is on the function declaration.

nonnull.cpp: In function ‘void f(int*)’:
nonnull.cpp:8:5: warning: nonnull argument ‘ptr’ compared to NULL 
[-Wnonnull-compare]
      if(NULL != ptr)
      ^~



// g++-8 -Wall -Wnonnull -O2 -o nonnull nonnull.cpp
#include <cstddef>

void f(int * ptr) __attribute__((nonnull));

void f(int * ptr)
{
     if(NULL != ptr)
     {
         *ptr = 1;
     }
}

int main()
{
     int * p = NULL;
     f(p);
}


I can easily get it past the g++-8 by coping the param locally - is this 
suitable though?


// g++-8 -Wall -Wnonnull -O2 -o nonnull nonnull.cpp
#include <cstddef>

void f(int * ptr) __attribute__((nonnull));

void f(int * ptr)
{
     const int * const p = ptr;
     if(NULL != p)
     {
         *ptr = 1;
     }
}

int main()
{
     int * p = NULL;
     f(p);
}



More information about the Gcc-help mailing list