[cfe-dev] About void* arithmetic and dereferencing.

Christopher Jefferson chris at bubblescope.net
Sun Aug 22 06:52:18 PDT 2010


On 22 Aug 2010, at 14:06, Enea Zaffanella wrote:

> Hello.
> 
> I am a bit confused regarding clang behavior wrt the support of void* 
> arithmetic and dereferencing extensions.
> It looks as if clang is treating differently syntactic constructs that 
> (afaict) should be regarded as semantically equivalent.

Any arithmetic on void* pointers is (as the clang warning points out) a gcc extension, which should probably be discouraged.

Implementing '&p[8]' or 'p[0]' requires you to de-reference a void* pointer, which is a further extension over just allowing arithmetic on void* pointers. 

Chris

> 
> Consider the following program fragment:
> 
> ===========================
> void* bar(void);
> 
> unsigned foo(void) {
>   unsigned u = 0;
>   void* p;
>   p = bar();
>   p += 8;
>   p = &p[8]; /* Equivalent to previous line (?) */
> 
>   u += sizeof(*p);
>   u += sizeof(p[0]); /* Equivalent to previous line (?) */
>   return u;
> }
> ===========================
> 
> When compiled using gcc and -Wpointer-arith, we get:
> ===========================
> gcc -Wpointer-arith -c bug.c -o /dev/null
> bug.c: In function ‘foo’:
> bug.c:7: warning: pointer of type ‘void *’ used in arithmetic
> bug.c:8: warning: pointer of type ‘void *’ used in arithmetic
> bug.c:8: warning: dereferencing ‘void *’ pointer
> bug.c:10: warning: invalid application of ‘sizeof’ to a void type
> bug.c:11: warning: pointer of type ‘void *’ used in arithmetic
> bug.c:11: warning: invalid application of ‘sizeof’ to a void type
> ===========================
> 
> If instead we use clang (r111514), some of these warnings (i.e., the 
> ones on the lines ending in a comment) are mapped to errors:
> ===========================
> $ clang -Wpointer-arith -fsyntax-only bug.c
> bug.c:7:5: warning: use of GNU void* extension [-Wpointer-arith]
>   p += 8;
>   ~ ^  ~
> bug.c:8:9: error: subscript of pointer to incomplete type 'void'
>   p = &p[8]; /* Equivalent to previous line (?) */
>        ~^
> bug.c:10:8: warning: invalid application of 'sizeof' to a void type
>       [-Wpointer-arith]
>   u += sizeof(*p);
>        ^     ~~~~
> bug.c:11:16: error: subscript of pointer to incomplete type 'void'
>   u += sizeof(p[0]); /* Equivalent to previous line (?) */
>               ~^
> 2 warnings and 2 errors generated.
> ===========================
> 
> This behavior seems to be inconsistent wrt C99 6.5.2.1p2,
> where it is said that E1[E2] is identical to (*((E1)+(E2))).
> 
> Is this just something that has to be fixed, or are there other reason 
> explaining the currently observed behavior?
> 
> Regards,
> Enea.
> 
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev





More information about the cfe-dev mailing list