how to cast away 'volatile'?

Ian Lance Taylor iant@google.com
Tue Mar 13 15:27:00 GMT 2007


Andrew Haley <aph@redhat.com> writes:

> Matthew Woehlke writes:
>  > I have a code snippet that looks roughly like this:
>  > 
>  > extern void my_free(void* ptr);
>  > 
>  > int foo()
>  > {
>  >      volatile long * bar;
>  >      ...
>  >      my_free(bar);
>  > }
>  > 
>  > This generates the warning 'cast discards qualifiers from pointer target 
>  > type' at my_free() (gcc 3.4.3). Other than disabling the flag that 
>  > generates the warning (in general I want these warnings!), how do I 
>  > suppress this? my_free is of course a free() wrapper, i.e. I don't see 
>  > any problems discarding the qualifier at this point. I already tried 
>  > this, which seems like it used to work (I am moving the code from one 
>  > project to another):
>  > 
>  >      my_free(void*)bar);
>  > 
>  > ...and it doesn't help.
> 
> I think this is bad practice.  You'd be far better advised to malloc()
> the memory, keep a void* pointer to it, but cast to volatile long *
> when volatile is actually required.

Note that this is also somewhat dubious on a strict reading of the C
standard.  The standard discusss access to volatile qualified objects,
and it says that casting away volatile is undefined.  The standard
says absolutely nothing about volatile qualified pointers to
non-volatile objects.  So you should not expect any particular
semantics from a volatile-qualified pointer which points to a
non-volatile-qualified object.

Ian



More information about the Gcc-help mailing list