Date: Tue, 4 Dec 2007 21:54:34 +0300 From: Eygene Ryabinkin <rea-fbsd@codelabs.ru> To: Alexey Dokuchaev <danfe@FreeBSD.org> Cc: src-committers@freebsd.org, John Baldwin <jhb@freebsd.org>, cvs-src@freebsd.org, cvs-all@freebsd.org, John Birrell <jb@freebsd.org>, Dag-Erling Sm??rgrav <des@des.no> Subject: Re: cvs commit: src/sys/netinet/libalias alias_util.c Message-ID: <Y2RuALI%2BwP%2Bb4%2Bv9be3nJw@Z/x71B28YuuIfDtRv0W9eg> In-Reply-To: <20071204172535.GB82261@FreeBSD.org> References: <200711232356.lANNu3mp040885@repoman.freebsd.org> <864pezer7f.fsf@ds4.des.no> <200712031657.34074.jhb@freebsd.org> <20071204172535.GB82261@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Tue, Dec 04, 2007 at 05:25:35PM +0000, Alexey Dokuchaev wrote: > > *ptr++ would choke since pointer arith on (void *) is undefined AFAIK. > > I've been under impression that ++ on void * whould simply increase it > by one. This behaviour is documented for GCC: http://www.mcs.vuw.ac.nz/cgi-bin/info2www?(gcc)Pointer+Arith Just for the record (gcc 4.2.1): ----- $ gcc -o test -Wall -ansi -pedantic test.c test.c: In function 'main': test.c:9: warning: wrong type argument to increment $ ./test '2' $ g++ -o test -Wall -ansi test.c test.c: In function 'int main()': test.c:9: error: ISO C++ forbids incrementing a pointer of type 'void*' $ cat test.c #include <stdio.h> int main(void) { char c[] = "123456789abcdef"; void *p = c; p++; printf("'%c'\n", *((char *)p)); return 0; } ----- It seems to me that ++ adds one to the void pointer because it is demanded by C99 (ISO/IEC 9899:TC2, 6.2.5, requirement 26, page 36) that 'char *' and 'void *' have the same representation and alignment requirements. So, it seems to me that (p++) has implicit conversion from 'void *' to 'char *' for 'void *p', at least it can be interpreted in this way. But some people say that void* arithmetics is GCC'ism. It worth to note that the warning about void* arithmetics lived in GCC at least since 1992: see http://gcc.gnu.org/viewcvs/trunk/gcc/c-typeck.c?revision=364&view=markup function 'pointer_int_sum'. And the problem of 'void *' arithmetics had been touched in the -current a while ago: http://lists.freebsd.org/pipermail/freebsd-current/2003-July/006439.html I am failing to find a place in the C standard where void arithmetics is prohibited, but I can be blind. Anyone? -- Eygene
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Y2RuALI%2BwP%2Bb4%2Bv9be3nJw>