[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