cvs commit: src/sys/netinet/libalias alias_util.c

Christoph Mallon christoph.mallon at gmx.de
Tue Dec 4 12:52:45 PST 2007


Eygene Ryabinkin wrote:
> 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?

Arithmethic on void pointers is forbidden. The relevant parts of the 
(C99) standard are:

?6.2.5 clause 19: "The void type comprises an empty set of values; it is 
an incomplete type that cannot be completed."

?6.2.5 clause 1: "[...] Types are partitioned into object types [...], 
function types [...], and incomplete types [...].

?6.5.6 clause 2: "For addition [...] one operand shall be a pointer to 
an object type and the other shall have integer type. [...]"
(subtraction has an analogous statement, increment and decrement are 
just addition/substraction by one)

So the conclusion is:
- void* is a pointer to an incomplete type.
- Incomplete types are not object types.
- Addition is only allowed on pointers to an object type.
Therefore arithmetic on void pointers is not allowed. Arithmetic on void 
pointers is indeed a GCCism.

	Christoph


More information about the cvs-src mailing list