Skip site navigation (1)Skip section navigation (2)
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>