[cfe-commits] [PATCH 11/15] Fix Casting

Dmitri Gribenko gribozavr at gmail.com
Fri Jan 11 11:39:14 PST 2013


On Fri, Jan 11, 2013 at 9:34 PM,  <dag at cray.com> wrote:
> Dmitri Gribenko <gribozavr at gmail.com> writes:
>
>>> Hmm...I think const_cast is useful because it's a red flag.  I don't
>>> think we should be hiding that as it can indicate a design issue.
>>
>> That's right, const_cast is a red flag, but in these places the cast
>> is always safe, since we are storing pointers to AST nodes (which are
>> always allocated non-const) into a C struct with void* pointer just to
>> pass the struct to C-land.
>
> Here's the kind of thing I'm worrying about:
>
> CXCursor cxcursor::MakeCXCursor(const Attr *A, Decl *Parent,
>                                 CXTranslationUnit TU) {
>   assert(A && Parent && TU && "Invalid arguments!");
>   CXCursor C = { GetCursorKind(A), 0, { Parent, const_cast<Attr *>(A), TU } };
>   return C;
> }
>
> In this case we're const_cast'ing a pointer to a const Attr.  The caller
> has no idea that the data it sent as an argument can be changed under
> it.  IMHO that is quite unsafe and should be corrected properly.

It is intrinsic in the AST design that all nodes are semantically
immutable, but some methods are not marked const for some reason.  But
even if you have a pointer to a const node somewhere, and need to call
a non-const method, it is OK cast const away (though ugly).

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/



More information about the cfe-commits mailing list