[PATCH] fix powerpc64le bootstrap failure caused by r243661 (PR 78817)

Martin Sebor msebor@gmail.com
Mon Dec 19 18:05:00 GMT 2016


On 12/19/2016 10:31 AM, Jeff Law wrote:
> On 12/17/2016 02:55 PM, Martin Sebor wrote:
>> On 12/17/2016 01:01 PM, Markus Trippelsdorf wrote:
>>
>> I agree that these warnings should probably not be issued, though
>> it's interesting to see where they come from.  The calls are in
>> the code emitted by GCC, are reachable, and end up taking place
>> with the right Ubsan runtime recovery options.  It turns out that
>> Ubsan transforms calls to nonnull functions into conditional
>> branches testing the argument for null, like so:
>>
>>     if (s == 0)
>>       __builtin___ubsan_handle_nonnull_arg();
>>     n = strlen (s);
>>
>> and GCC then transforms those into
>>
>>     if (s == 0)
>>       {
>>         __builtin___ubsan_handle_nonnull_arg();
>>         n = strlen (NULL);
>>       }
>>
>> When the ubsan_handle_nonnull_arg function returns to the caller
>> the call to strlen(NULL) is made.
> So I'd like to see more complete dumps here.

The -Wnonnull warning can be reproduced with this C test case and
-fsantize=undefined:

   char* f (const char *s)
   {
     unsigned n = __builtin_strlen (s) + 1;
     char *d = __builtin_malloc (n);

     if (!d)
       return 0;

     __builtin_memcpy (d, s, n);
     return d;
   }

The sanitizer emits the following code (I snipped the rest after
the call to malloc):

   <bb 2> [0.00%]:
   if (s_8(D) == 0B)
     goto <bb 7>; [0.04%]
   else
     goto <bb 6>; [99.96%]

   <bb 7> [0.00%]:
   __builtin___ubsan_handle_nonnull_arg (&*.Lubsan_data0);

   <bb 6> [0.00%]:
   _1 = __builtin_strlen (s_8(D));
   _2 = (unsigned int) _1;
   n_9 = _2 + 1;
   _3 = (long unsigned int) n_9;
   d_11 = __builtin_malloc (_3);
   ...

This is then transformed by the third thread jumping pass into:

   <bb 2> [100.00%]:
   if (s_7(D) == 0B)
     goto <bb 3>; [0.04%]
   else
     goto <bb 8>; [99.96%]

   <bb 3> [0.04%]:
   __builtin___ubsan_handle_nonnull_arg (&*.Lubsan_data0);
   _24 = __builtin_strlen (0B);
   _25 = (unsigned int) _24;
   n_26 = _25 + 1;
   _27 = (long unsigned int) n_26;
   d_29 = __builtin_malloc (_27);
   if (d_29 == 0B)
     goto <bb 4>; [4.07%]
   else
     goto <bb 5>; [95.93%]

   <bb 4> [4.07%]:
   goto <bb 7>; [100.00%]

   <bb 5> [0.04%]:
   __builtin___ubsan_handle_nonnull_arg (&*.Lubsan_data2);

   <bb 6> [95.93%]:
   # _30 = PHI <_19(8), _27(5)>
   # d_31 = PHI <d_22(8), d_29(5)>
   __builtin_memcpy (d_31, s_7(D), _30);

   <bb 7> [100.00%]:
   # _4 = PHI <0B(4), d_31(6)>
   return _4;

   <bb 8> [99.96%]:
   _16 = __builtin_strlen (s_7(D));
   _21 = (unsigned int) _16;
   n_20 = _21 + 1;
   _19 = (long unsigned int) n_20;
   d_22 = __builtin_malloc (_19);
   if (d_22 == 0B)
     goto <bb 4>; [4.07%]
   else
     goto <bb 6>; [95.93%]

(If you'd like to see more context please let me know.)

Martin



More information about the Gcc-patches mailing list