https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94195

Dmitry G. Dyachenko <dimhen at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dimhen at gmail dot com

--- Comment #3 from Dmitry G. Dyachenko <dimhen at gmail dot com> ---
(In reply to CVS Commits from comment #2)
> The master branch has been updated by Martin Sebor <mse...@gcc.gnu.org>:
> 
> https://gcc.gnu.org/g:3f9a497d1b0dd9da87908a11b59bf364ad40ddca
> 
> commit r11-3306-g3f9a497d1b0dd9da87908a11b59bf364ad40ddca
> Author: Martin Sebor <mse...@redhat.com>
> Date:   Sat Sep 19 17:47:29 2020 -0600
> 
>     Extend -Warray-bounds to detect out-of-bounds accesses to array
> parameters.
>     
>     gcc/ChangeLog:
>     
>             PR middle-end/82608
>             PR middle-end/94195
>             PR c/50584
>             PR middle-end/84051
>             * gimple-array-bounds.cc (get_base_decl): New function.
>             (get_ref_size): New function.
>             (trailing_array): New function.
>             (array_bounds_checker::check_array_ref): Call them.  Handle
> arrays
>             declared in function parameters.
>             (array_bounds_checker::check_mem_ref):  Same.  Handle references
> to
>             dynamically allocated arrays.
>     
>     gcc/testsuite/ChangeLog:
>     
>             PR middle-end/82608
>             PR middle-end/94195
>             PR c/50584
>             PR middle-end/84051
>             * c-c++-common/Warray-bounds.c: Adjust.
>             * gcc.dg/Wbuiltin-declaration-mismatch-9.c: Adjust.
>             * gcc.dg/Warray-bounds-63.c: New test.
>             * gcc.dg/Warray-bounds-64.c: New test.
>             * gcc.dg/Warray-bounds-65.c: New test.
>             * gcc.dg/Warray-bounds-66.c: New test.
>             * gcc.dg/Warray-bounds-67.c: New test.

I am a bit confused -- now gcc produces warning.
But access is not out of allocated memory.
Is it expected?


$ cat x.c
#include <stdlib.h>

struct S1 {
  unsigned x;
};
struct S {
  struct S1 s1;
  int z;
};

void f1()
{
  struct S *pS = (struct S*) calloc(sizeof(struct S1),1);
  if(pS->s1.x == 0)
    return;
  free(pS);
}

$ gcc -O2 -Wall -c x.i
x.c: In function 'f1':
x.c:18:8: warning: array subscript 'struct S[0]' is partly outside array bounds
of 'unsigned char[4]' [-Warray-bounds]
   18 |   if(pS->s1.x == 0)
      |        ^~
x.c:17:30: note: referencing an object of size 4 allocated by 'calloc'
   17 |   struct S *pS = (struct S*) calloc(sizeof(struct S1),1);
      |                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to