This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
RE: A question about detecting array bounds for case Warray-bounds-3.c
- From: "Jiangning Liu" <jiangning dot liu at arm dot com>
- To: "Jiangning Liu" <Jiangning dot Liu at arm dot com>, <gcc at gcc dot gnu dot org>
- Cc: <jakub at gcc dot gnu dot org>, <mueller at gcc dot gnu dot org>, <rguenth at gcc dot gnu dot org>, "Matthew Gretton-Dann" <Matthew dot Gretton-Dann at arm dot com>
- Date: Mon, 26 Sep 2011 15:13:42 +0800
- Subject: RE: A question about detecting array bounds for case Warray-bounds-3.c
- References:
PING...
> -----Original Message-----
> From: Jiangning Liu [mailto:jiangning.liu@arm.com]
> Sent: Thursday, September 22, 2011 10:19 AM
> To: gcc@gcc.gnu.org
> Cc: 'jakub@gcc.gnu.org'; 'mueller@gcc.gnu.org'; 'rguenth@gcc.gnu.org';
> Matthew Gretton-Dann
> Subject: A question about detecting array bounds for case Warray-
> bounds-3.c
>
> Hi,
>
> For case gcc/testsuite/gcc.dg/Warray-bounds-3.c, obviously it is an
> invalid C program, because the last iterations of all the loops cause
> the access of arrays is beyond the max size of corresponding array
> declarations. The condition of checking upper bound should be "<"
> rather than "<=".
>
> Right now, GCC compiler doesn't report any warning messages for this
> case, should it be a bug in both test case and compiler?
>
> But looking at http://gcc.gnu.org/PR31227 , it seems this test case is
> designed to be like this on purpose. Anybody can explain about this?
>
> The case is like below,
>
> /* { dg-do compile } */
> /* { dg-options "-O2 -Warray-bounds" } */
> /* based on PR 31227 */
>
> struct S
> {
> const char *abday[7];
> const char *day[7];
> const char *abmon[12];
> const char *mon[12];
> const char *am_pm[2];
> };
>
> ...
>
> for (cnt = 0; cnt <= 7; ++cnt)
> {
> iov[2 + cnt].iov_base = (void *) (time->abday[cnt] ?: "");
> iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
> }
>
> for (; cnt <= 14; ++cnt)
> {
> iov[2 + cnt].iov_base = (void *) (time->day[cnt - 7] ?: "");
> iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
> }
>
> for (; cnt <= 26; ++cnt)
> {
> iov[2 + cnt].iov_base = (void *) (time->abmon[cnt - 14] ?: "");
> iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
> }
>
> for (; cnt <= 38; ++cnt)
> {
> iov[2 + cnt].iov_base = (void *) (time->mon[cnt - 26] ?: "");
> iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
> }
>
> for (; cnt <= 40; ++cnt)
> {
> iov[2 + cnt].iov_base = (void *) (time->am_pm[cnt - 38] ?: "");
> iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
> }
>
> Thanks,
> -Jiangning