[PATCH] D134461: [Clang] Warn when trying to deferencing void pointers in C

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Sep 24 06:24:09 PDT 2022


aaron.ballman accepted this revision.
aaron.ballman added a comment.
This revision is now accepted and ready to land.

LGTM aside from a minor nit in the tests. Thank you for this!



================
Comment at: clang/test/C/drs/dr1xx.c:191-194
+  return *vvp; /* expected-warning {{void function 'dr113_v' should not return void expression}} expected-warning{{ISO C does not allow indirection on operand of type 'volatile void *'}} */
 }
 const void dr113_c(const void *cvp) { /* expected-warning {{function cannot return qualified void type 'const void'}} */
+  return *cvp; /* expected-warning {{void function 'dr113_c' should not return void expression}} expected-warning{{ISO C does not allow indirection on operand of type 'const void *'}} */
----------------
Can you separate these diagnostics onto their own lines as well?


================
Comment at: clang/test/C/drs/dr1xx.c:140
   /* The behavior changed between C89 and C99. */
-  (void)&*p; /* c89only-warning {{ISO C forbids taking the address of an expression of type 'void'}} */
+  (void)&*p; /* c89only-warning {{ISO C forbids taking the address of an expression of type 'void'}} c89only-warning {{ISO C does not allow indirection on operand of type 'void *'}} */
   /* The behavior of all three of these is undefined. */
----------------
junaire wrote:
> aaron.ballman wrote:
> > Can you switch all of the warning changes in this file to use this style where each expected diagnostic is on its own line? That makes it easier to notice which diagnostics happen on the line (it's easy to lose sight of the trailing expected diagnostics otherwise).
> > Yes, basically, the language rule is that &*void_ptr is well defined in C99 and later
> 
> IIUC, you mean this should be warned in C89 mode, right?
>> Yes, basically, the language rule is that &*void_ptr is well defined in C99 and later
>IIUC, you mean this should be warned in C89 mode, right?

Correct; I think there's two warnings that would fire there in C89: dereferencing a void pointer is one, and taking the address of void is the other.


================
Comment at: clang/test/C/drs/dr1xx.c:143
+  (void)*p; /* expected-warning {{ISO C does not allow indirection on operand of type 'void *'}}*/
+  (void)&(*p); /* c89only-warning {{ISO C forbids taking the address of an expression of type 'void'}} expected-warning {{ISO C does not allow indirection on operand of type 'void *'}}*/
+  (void)(i ? *p : *p); /* expected-warning {{ISO C does not allow indirection on operand of type 'void *'}} expected-warning {{ISO C does not allow indirection on operand of type 'void *'}}*/
----------------
junaire wrote:
> aaron.ballman wrote:
> > This looks wrong to me -- this should be an `expected-warning` instead of a `c89only-warning`, same as two lines above, right?
> I'm a bit confused. Maybe I made the trailing comments too hard to read. This is an `expected-warning`, `c89only-warning` is for `ISO C forbids taking the address of an expression of type 'void'`, which is not part of this patch.
You're right, I think I just confused myself. Sorry for the noise! Though it is a bit strange that `ISO C does not allow indirection on operand of type 'void *'` is a c89 only warning on line 140 while it's an expected warning on line 146. Something odd is happening there, but I don't think it's the fault of this patch.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D134461/new/

https://reviews.llvm.org/D134461



More information about the cfe-commits mailing list