On 10/14/19 6:23 PM, Martin Sebor wrote:
> When a subsequent element or member of a local aggregate containing
> a prior character array is initialized the strlen pass discards
> the length it computed for the prior element/member.  E.g., here:
> 
>   struct { char a[4], b[4]; } s = { "1", "12" };
> 
> even though strlen (s.b) is folded to 2, strlen (s.a) is not.  (Ditto
> for other stores even to members of other types.)  This causes hundreds
> (over 700 in GCC) to thousands (nearly 3,000 in Binutils/GDB and some
> 36,000 in the kernel) of instances of previously computed string lengths
> to end up discarded and so besides emitting less than optimal code also
> defeats buffer overflow detection in such cases.
> 
> Attached is a resubmission of a previously approved patch that I never
> committed (the original had a bug that was noted during review that
> I subsequently fixed but I didn't remember to post the corrected patch).
> Tested on x86_64-linux.
> 
> Martin
> 
> gcc-83821.diff
> 
> PR tree-optimization/83821 - local aggregate initialization defeats strlen 
> optimization
> 
> gcc/ChangeLog:
> 
>       PR tree-optimization/83821
>       * tree-ssa-strlen.c (maybe_invalidate): Add argument.  Consider
>       the length of a string when available.
>       (handle_builtin_memset) Add argument.
>       (handle_store, strlen_check_and_optimize_call): Same.
>       (check_and_optimize_stmt): Same.  Pass it to callees.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR tree-optimization/83821
>       * c-c++-common/Warray-bounds-4.c: Remove XFAIL.
>       * gcc.dg/strlenopt-80.c: New test.
>       * gcc.dg/strlenopt-81.c: Same.
>       * gcc.dg/strlenopt-82.c: Same.
>       * gcc.dg/strlenopt-83.c: Same.
>       * gcc.dg/strlenopt-84.c: Same.
>       * gcc.dg/tree-ssa/calloc-4.c: Same.
>       * gcc.dg/tree-ssa/calloc-5.c: Same.
OK.

Jeff

Reply via email to