On 11/4/19 3:05 PM, Martin Sebor wrote:
> While testing some other changes I noticed that -Warray-bounds
> fails to detect out-of-bounds indices to compound literals such
> as in:
> 
>   int *p = (int[]){ 1, 2, 3 };
>   // ...
>   p[3] = 7;
> 
> This is because SRA transforms such references into accesses to
> uninitialized scalar variables and also sets the TREE_NO_WARNING
> bit for the replacement variables.  This prevents -Wuninitialized
> from detecting such bugs, although that wouldn't be the right
> warning to issue in these cases).
> 
> The attached patch tweaks SRA to avoid this transformation when
> the access is out of the bounds of the referenced variable.  That
> in turn lets -Warray-bounds diagnose these invalid accesses.
> 
> The patch also adjusts -Warray-bounds to reference to correct
> index and message and issue the warning even for zero-length
> compound literal arrays.  This was exposed and the fix is relied
> on by the test I wrote for the compound literals.
> 
> Finally, the change also corrects an oversight of mine from some
> time ago in failing to handle out-of-bounds indices relative to
> addresses of function parameters.  This is a trivial one-line
> tweak that could be submitted separately but it doesn't seem
> worth the overhead.
> 
> Tested on x86_64-linux.
> 
> Martin
> 
> gcc-92341.diff
> 
> PR middle-end/92341 - missing -Warray-bounds indexing past the end of a 
> compound literal
> PR middle-end/82612 - missing -Warray-bounds on a non-zero offset from the 
> address of a non-array object
> 
> gcc/testsuite/ChangeLog:
> 
>       PR middle-end/92341
>       PR middle-end/82612
>       * gcc.dg/Warray-bounds-50.c: New test.
>       * gcc.dg/Warray-bounds-51.c: New test.
> 
> gcc/ChangeLog:
> 
>       PR middle-end/92341
>       PR middle-end/82612
>       * tree-sra.c (get_access_for_expr): Fail for out-of-bounds offsets.
>       * tree-vrp.c (vrp_prop::check_array_ref): Correct index and text
>       of message printed in a warning for empty arrays.
>       (vrp_prop::check_mem_ref): Also handle function parameters and
>       empty arrays.
OK
jeff

Reply via email to