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

--- Comment #1 from Alexander Cherepanov <ch3root at openwall dot com> ---
Example with a past-the-end pointer (vrp1, similar to but 93051, comment 0 but
this time with PHI):

----------------------------------------------------------------------
#include <stdio.h>

__attribute__((noipa,optnone)) // imagine it in a separate TU
static void *opaque(void *p) { return p; }

static int been_there = 0;

static int *f(int *p, int *q)
{
    if (p == q) {
        been_there = 1;
        return p;
    } else {
        been_there = 0;
        return q;
    }
}

int main()
{
    int x[5];
    int y[1];

    int *p = x;
    int *q = y + 1;
    opaque(q);

    int *p1 = opaque(p); // prevents early optimization of x==y+1
    int *r = f(p1, q);

    if (been_there) {
        *p = 1;
        *r = 2;
        printf("result: %d\n", *p);
    }
}
----------------------------------------------------------------------
$ gcc -std=c11 -pedantic -Wall -Wextra -Wno-attributes test.c && ./a.out
result: 2
$ gcc -std=c11 -pedantic -Wall -Wextra -Wno-attributes -O3 test.c && ./a.out
test.c: In function ‘main’:
test.c:33:9: warning: array subscript 1 is outside array bounds of ‘int[1]’
[-Warray-bounds]
   33 |         *r = 2;
      |         ^~
test.c:22:9: note: while referencing ‘y’
   22 |     int y[1];
      |         ^
result: 1
----------------------------------------------------------------------
gcc x86-64 version: gcc (GCC) 10.0.0 20191223 (experimental)
----------------------------------------------------------------------

Reply via email to