[llvm-dev] [llvm-de] How to get during compile time the base class of casted C++ objects inside static_cast<> and dynamic_cast<>

Paul Muntean via llvm-dev llvm-dev at lists.llvm.org
Fri Dec 9 05:16:12 PST 2016


I want to detect bad casts in C++ code by using the Clang
compiler. The approach is similar to what Caver and TypeSan do but
without using the compiler-rt.

Caver and TypeSan:
https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lee.pdf
https://nebelwelt.net/publications/files/16CCS2.pdf

For example if I have the following C++ code snippet where I want to
cast object b into
object D.

D* obj = static_cast<D*>(b);

from where (inside Clang, LTO, thinLTO, etc.) can I get the base class
of D and the base class ob b. Is this
available in the Clang compiler or LTO?

Also, if b is an object of a virtual Class (class with inherited or its
own virtual functions) can I get its virtual pointer at compile time
by using the LTO?

I found out that in CodeGen/CGExpr.cpp the explicit case "BaseToDerived" is
handled and you can retrieve TypeSourceInfo using the function
getTypeInfoAsWritten(). It seems that this information is enough to get
the exact type of this cast at compile-time and should also work for
Template programming, as my, understanding is that Clang should have
abstracted the code into, specific types at this point.

Am I wrong here?

Is there any case where the type of the objects used inside the cast
not known at compile time? Can the,
'real' type be hidden behind a pointer?


More information about the llvm-dev mailing list