On 11/29/18 4:43 PM, Martin Sebor wrote:
> On 11/29/18 4:07 PM, Jeff Law wrote:
>> On 11/29/18 1:34 PM, Martin Sebor wrote:
>>> On 11/16/2018 02:07 AM, Richard Biener wrote:
>>>> On Fri, Nov 16, 2018 at 4:12 AM Martin Sebor <mse...@gmail.com> wrote:
>>>>>
>>>>> Ping: https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01818.html
>>>>>
>>>>> Please let me know if there is something I need to change here
>>>>> to make the fix acceptable or if I should stop trying.
>>>>
>>>> I have one more comment about
>>>>
>>>> +  /* Defer warning (and folding) until the next statement in the basic
>>>> +     block is reachable.  */
>>>> +  if (!gimple_bb (stmt))
>>>> +    return false;
>>>> +
>>>>
>>>> it's not about the next statement in the basic-block being "reachable"
>>>> (even w/o a CFG you can use gsi_next()) but rather that the next
>>>> stmt isn't yet gimplified and thus not inserted into the gimple sequence,
>>>>
>>>> right?
>>>
>>> No, it's about the current statement not being associated with
>>> a basic block yet when the warning code runs for the first time
>>> (during gimplify_expr), and so gsi_next() returning null.
>>>
>>>> You apply this to gimple_fold_builtin_strncpy but I'd rather
>>>> see us not sprinkling this over gimple-fold.c but instead do this
>>>> in gimplify.c:maybe_fold_stmt, delaying folding until say lowering.
>>>>
>>>> See the attached (untested).
>>>
>>> I would also prefer this solution.  I had tested it (in response
>>> to you first mentioning it back in September) and it causes quite
>>> a bit of fallout in tests that look for the folding to take place
>>> very early.  See the end of my reply here:
>>>
>>>    https://gcc.gnu.org/ml/gcc-patches/2018-09/msg01248.html
>>>
>>> But I'm willing to do the test suite cleanup if you think it's
>>> suitable for GCC 9.  (If you're thinking GCC 10 please let me
>>> know now.)
>> The fallout on existing tests is minimal.  What's more concerning is
>> that it doesn't actually pass the new test from Martin's original
>> submission.  We get bogus warnings.
>>
>> At least part of the problem is weakness in maybe_diag_stxncpy_trunc.
>> It can't handle something like this:
>>
>> test_literal (char * d, struct S * s)
>> {
>>    strncpy (d, "1234567890", 3);
>>    _1 = d + 3;
>>    *_1 = 0;
>> }
>>
>>
>> Note the pointer arithmetic between the strncpy and storing the NUL
>> terminator.
> 
> Right.  I'm less concerned about this case because it involves
> a literal that's obviously longer than the destination but it
> would be nice if the suppression worked here as well in case
> the literal comes from macro expansion.  It will require
> another tweak.
> 
> But the test from my patch passes with the changes to calls.c
> from my patch, so that's an improvement.
> 
> I have done the test suite cleanup in the attached patch.  It
> was indeed minimal -- not sure why I saw so many failures with
> my initial approach.
> 
> I can submit a patch to handle the literal case above as
> a followup unless you would prefer it done at the same time.
> 
> Martin
> 
> gcc-87028.diff
> 
> PR tree-optimization/87028 - false positive -Wstringop-truncation strncpy 
> with global variable source string
> 
> gcc/ChangeLog:
> 
>       PR tree-optimization/87028
>       * calls.c (get_attr_nonstring_decl): Avoid setting *REF to
>       SSA_NAME_VAR.
>       * gcc/gimple-low.c (lower_stmt): Delay foldin built-ins.
>       * gimplify (maybe_fold_stmt): Avoid folding statements that
>       don't belong to a basic block.
>       * tree.h (SSA_NAME_VAR): Update comment.
>       * tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Simplify.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR tree-optimization/87028
>       * c-c++-common/Wstringop-truncation.c: Remove xfails.
>       * gcc.dg/Wstringop-truncation-5.c: New test.
>       * gcc.dg/strcmpopt_1.c: Adjust.
>       * gcc.dg/tree-ssa/pr79697.c: Same.
I fixed up the ChangeLog a little and installed the patch.

Thanks,
jeff

Reply via email to