On 09/17/18 19:33, Jeff Law wrote:
> On 9/16/18 1:58 PM, Bernd Edlinger wrote:
>> Hi,
>>
>> this is a cleanup of the recently added strlen/strcpy/stpcpy
>> no nul warning code.
>>
>> Most importantly it moves the SSA_NAME handling from
>> unterminated_array to string_constant, thereby fixing
>> another round of xfails in the strlen and stpcpy test cases.
>>
>> I need to say that the fix for bug 86622 is relying in
>> type info on the pointer which is probably not safe in
>> GIMPLE in the light of the recent discussion.
>>
>> I had to add two further exceptions, which should
>> be safe in general: that is a pointer arithmentic on a string
>> literal is okay, and arithmetic on a string constant
>> that is exactly the size of the whole DECL, cannot
>> access an adjacent member.
>>
>>
>> Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
>> Is it OK for trunk?
>>
>>
>> Thanks
>> Bernd.
>>
>>
>> patch-cleanup-no-nul.diff
>>
>> gcc:
>> 2018-09-16  Bernd Edlinger  <bernd.edlin...@hotmail.de>
>>
>>      * builtins.h (unterminated_array): Remove prototype.
>>          * builtins.c (unterminated_array): Simplify.  Make static.
>>          (expand_builtin_strcpy_args): Don't use TREE_NO_WARNING here.
>>      (expand_builtin_stpcpy_1): Remove warn_string_no_nul without effect.
>>      * expr.c (string_constant): Handle SSA_NAME.  Add more exceptions
>>      where pointer arithmetic is safe.
>>      * gimple-fold.c (get_range_strlen): Handle nonstr like in c_strlen.
>>      (get_max_strlen): Remove the unnecessary mynonstr handling.
>>      (gimple_fold_builtin_strcpy): Simplify.
>>      (gimple_fold_builtin_stpcpy): Simplify.
>>      (gimple_fold_builtin_sprintf): Remove NO_WARNING propagation
>>      without effect.
>>      (gimple_fold_builtin_strlen): Simplify.
>>
>> testsuite:
>> 2018-09-16  Bernd Edlinger  <bernd.edlin...@hotmail.de>
>>
>>      * gcc.dg/warn-stpcpy-no-nul.c: Remove xfails.
>>      * gcc.dg/warn-strlen-no-nul.c: Remove xfails.
>>
>> Index: gcc/builtins.c
>> ===================================================================
>> --- gcc/builtins.c   (revision 264342)
>> +++ gcc/builtins.c   (working copy)
>> @@ -567,31 +567,12 @@ warn_string_no_nul (location_t loc, const char *fn
>>      the declaration of the object of which the array is a member or
>>      element.  Otherwise return null.  */
>>   
>> -tree
>> +static tree
>>   unterminated_array (tree exp)
>>   {
>> -  if (TREE_CODE (exp) == SSA_NAME)
>> -    {
>> -      gimple *stmt = SSA_NAME_DEF_STMT (exp);
>> -      if (!is_gimple_assign (stmt))
>> -    return NULL_TREE;
>> -
>> -      tree rhs1 = gimple_assign_rhs1 (stmt);
>> -      tree_code code = gimple_assign_rhs_code (stmt);
>> -      if (code == ADDR_EXPR
>> -      && TREE_CODE (TREE_OPERAND (rhs1, 0)) == ARRAY_REF)
>> -    rhs1 = rhs1;
>> -      else if (code != POINTER_PLUS_EXPR)
>> -    return NULL_TREE;
>> -
>> -      exp = rhs1;
>> -    }
>> -
>>     tree nonstr = NULL;
>> -  if (c_strlen (exp, 1, &nonstr, 1) == NULL && nonstr)
>> -    return nonstr;
>> -
>> -  return NULL_TREE;
>> +  c_strlen (exp, 1, &nonstr);
>> +  return nonstr;
>>   }
> Sigh.  This is going to conflict with patch #6 from Martin's kit.
> 

Sorry, it just feels wrong to do this folding here instead of in
string_constant.

I think the handling of POINTER_PLUS_EXPR above, is faulty,
because it is ignoring the offset parameter, which typically
contains the offset part, may add an offset to a different
structure member or another array index.  That is what happened
in PR 86622.

So you are likely looking at the wrong index, or even the wrong
structure member.


> 
>>   
>>   /* Compute the length of a null-terminated character string or wide
>> @@ -3936,8 +3917,7 @@ expand_builtin_strcpy_args (tree exp, tree dest, t
>>     if (tree nonstr = unterminated_array (src))
>>       {
>>         /* NONSTR refers to the non-nul terminated constant array.  */
>> -      if (!TREE_NO_WARNING (exp))
>> -    warn_string_no_nul (EXPR_LOCATION (exp), "strcpy", src, nonstr);
>> +      warn_string_no_nul (EXPR_LOCATION (exp), "strcpy", src, nonstr);
>>         return NULL_RTX;
>>       }
> There's also some target dependencies to be concerned about.  I'll have
> to dig out the thread, but in general removing these TREE_NO_WARNING
> checks is probably a bad idea -- you're likely introducing redundant
> warnings on one or more targets (but not x86).
> 

I just wondered why use if (!TREE_NO_WARNING(exp)) when warn_string_no_nul
uses if (!TREE_NO_WARNING(src)), and sets TREE_NO_WARNING(src) on success.

> 
> There may be things in there we want to take.  But my focus is going to
> be on getting the #4 and #6 patches from Martin's kit resolved (while he
> works on the string length range stuff).
> 

Oh, you are aware that I have a proposed patch on the string length range
vs. gimple semantics here:

https://gcc.gnu.org/ml/gcc-patches/2018-09/msg00805.html


Bernd.

Reply via email to