what is the suggested way to do void * arithmetic ?

Terry Lambert tlambert2 at mindspring.com
Thu Jul 10 03:43:08 PDT 2003


Luigi Rizzo wrote:
> in several places in ipfw2.c i have to move pointers across
> structures of variable length (lists of ipfw2 instructions
> returned by the getsockopt()), and i use the following type of code:
> 
>         void *next;
>         foo *p;
>         next = (void *)p + len;
>         foo = (foo *)p + len;
> 
> When using WARNS=5, the compiler in -current flags them with 'Warning
> void * arithmetic'.
> 
> What is the best way to do the above given that i do need to use
> these variable-size structures ?

I don't understand the second one.  The first one blows up because
you aren't parenthesizing, e.g.:

	next = (void *)(p + len);

The compiler is complaining because it doesn't know sizeof(*((void *)0))
(pointer arithmatic is coerced to the type of the lvalue, in most
cases of casts).

Unless you are referencing them as array elements (in which case,
packing becomes a problem for you, when referencing them as arrays
of foo's, since you don't know how foo's are packed in an array),
you should probably cast them to char for the arithmatic, and add
them with byte counts.

-- Terry


More information about the freebsd-current mailing list