Not a GCC bug (was Re: Big GCC bug!!! [Was: Re: Do not misuse Coverity please])

From: Jakub Jelinek
Date: Wed Mar 30 2005 - 18:44:05 EST


On Wed, Mar 30, 2005 at 06:11:43PM -0500, Kyle Moffett wrote:
> On Mar 30, 2005, at 14:14, Paulo Marques wrote:
> >Just a minor nitpick, though: wouldn't it be possible for an
> >application to catch the SIGSEGV and let the code proceed,
> >making invalid the assumption made by gcc?
>
> Uhh, it's even worse than that. Have a look at the following code:
> >#include <stdio.h>
> >#include <stdlib.h>
> >#include <string.h>
> >#include <errno.h>
> >#include <sys/types.h>
> >#include <sys/mman.h>
> >
> >struct test {
> > int code;
> >};
> >int test_check_first(struct test *a) {
> > int ret;
> > if (!a) return -1;
> > ret = a->code;
> > return ret;
> >}
> >int test_check_last(struct test *a) {
> > int ret;
> > ret = a->code;
> > if (!a) return -1;
> > return ret;
> >}
> >
> >int main() {
> > int i;
> > struct test *nullmem = mmap(NULL, 4096, PROT_READ|PROT_WRITE,
> > MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
> > if (nullmem == MAP_FAILED) {
> > fprintf(stderr,"mmap: %s\n",strerror(errno));
> > exit(1);
> > }
> > for (i = 0; i < 2; i++) {
> > nullmem[i].code = i;
> > printf("nullmem[%d].code = %d\n",i,i);
> > printf("test_check_first(&nullmem[%d]) = %d\n",i,
> > test_check_first(&nullmem[i]));
> > printf("test_check_last(&nullmem[%d]) = %d\n",i,
> > test_check_last(&nullmem[i]));
> > }
> > munmap(nullmem,4096);
> > exit(0);
> >}

This testcase violates ISO C99 6.3.2.3:
If a null pointer constant is converted to a pointer type, the resulting
pointer, called a null pointer, is guaranteed to compare unequal to a
pointer to any object or function.

But in the testcase above, there is an object whose pointer compares equal
to the null pointer. So there is nothing wrong with what GCC does.

Jakub
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/