This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: -Wcast-qual and casting away


Richard Guenther <richard.guenther@gmail.com> writes:

> On Thu, May 21, 2009 at 1:50 PM, Andreas Schwab <schwab@linux-m68k.org> wrote:
>> Ian Lance Taylor <iant@google.com> writes:
>>
>>> Consider this C/C++ program:
>>>
>>> extern void **f1();
>>> void f2(const char *p) { *(const void **)f1() = p; }
>>>
>>> If I compile this program with g++ -Wcast-qual, I get this:
>>>
>>> foo2.cc:2: warning: cast from type âvoid**â to type âconst void**â casts away qualifiers
>>
>> In a sense this warning is actually correct: this is storing a const
>> char * into a void * object, which is where the qualifier is lost. ÂIMHO
>> having a warning for this questionable operation is a good thing.
>
> I don't think so.
>
> extern char **f1();
> void f(char *p)
> {
>   *(const char **)f1() = p;
> }
>
> warns the same. typeof(*(const char **)) should still be const char *.
>
> For
>
> extern const char **f1();
> void f(char *p)
> {
>   *(char **)f1() = p;
> }
>
> it warns with
>
> t.C: In function âvoid f(char*)â:
> t.C:4: warning: cast from type âconst char**â to type âchar**â casts
> away constness
>
> which makes sense.

Let's not focus too much on the operation (the indirection and the
assignment).  The warning is about the cast itself.  Should we issue
that warning or not?  Others have explained the cases where the cast can
lead to unsafe code.

The indirection + assignment operation is easy to do in all cases by
moving the cast to the other side.

Ian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]