CFGElement CFGBlock的最基本元素
enum Kind {
// main kind
Statement,
Initializer,
NewAllocator,
// dtor kind
AutomaticObjectDtor,
DeleteDtor,
BaseDtor,
MemberDtor,
TemporaryDtor,
DTOR_BEGIN = AutomaticObjectDtor,
DTOR_END = TemporaryDtor
};
代表具体每一条语句,Terminator除外
CFGElement每种kind都有一个相应的子类,如
class CFGStmt : public CFGElement {
public:
CFGStmt(Stmt *S) : CFGElement(Statement, S) {}
const Stmt *getStmt() const {
return static_cast<const Stmt *>(Data1.getPointer());
}
private:
friend class CFGElement;
CFGStmt() {}
static bool isKind(const CFGElement &E) {
return E.getKind() == Statement;
}
};
CFGStmt代表普通的语句
/// CFGInitializer - Represents C++ base or member initializer from
/// constructor's initialization list.
class CFGInitializer : public CFGElement {
public:
CFGInitializer(CXXCtorInitializer *initializer)
: CFGElement(Initializer, initializer) {}
CXXCtorInitializer* getInitializer() const {
return static_cast<CXXCtorInitializer*>(Data1.getPointer());
}
private:
friend class CFGElement;
CFGInitializer() {}
static bool isKind(const CFGElement &E) {
return E.getKind() == Initializer;
}
};
CFGInitializer表示构造函数的初始化列表
/// CFGNewAllocator - Represents C++ allocator call.
class CFGNewAllocator : public CFGElement {
public:
explicit CFGNewAllocator(const CXXNewExpr *S)
: CFGElement(NewAllocator, S) {}
// Get the new expression.
const CXXNewExpr *getAllocatorExpr() const {
return static_cast<CXXNewExpr *>(Data1.getPointer());
}
private:
friend class CFGElement;
CFGNewAllocator() {}
static b

本文介绍了Clang中的CFG(Control Flow Graph)元素,包括CFGBlock的基础元素CFGElement,如CFGStmt和CFGInitializer。CFGElement的种类涵盖各种语句和表达式,特别是对隐式析构函数的表示。CFGBlock由声明/表达式集合、CFGTerminator和前驱/后继列表构成,而CFG对象则包含了整个CFGBlock的集合,包括Entry和Exit Block。重点讨论了如何使用placement new生成新的CFGBlock。
最低0.47元/天 解锁文章
258





