使用clang转储内存布局

时间:2014-06-30 06:50:45

标签: c++ memory clang++ static-code-analysis

您正在寻找一种使用clang转储类/结构/数据类型的内存布局的方法。 我有一个基于this教程的简单应用程序。

我还添加了这个功能

 bool VisitFieldDecl(FieldDecl *F)
{
  F->dump();
  std::cerr << F->getQualifiedNameAsString()  << " " << F->getBitWidthValue(*Context) << " " << std::endl;
  F->dump() ;
  std::cerr << "-----------------------------------------" << std::endl;
  return true;
}

不幸的是,getBitWidthValue也为我的类型返回零。

我需要递归地为每个类和所有嵌套类型提供完整的内存布局。包括尺寸/偏移量。

也许AST是错误的地方,我需要另一个钩子才能开始?

1 个答案:

答案 0 :(得分:0)

一种方法是在llvm / clang-3.4中使用给定const clang::CXXRecordDecl* decl的“AST记录布局”:

const clang::ASTRecordLayout &typeLayout(decl->getASTContext().getASTRecordLayout(decl));
std::cout << "record '" << decl->getQualifiedNameAsString() << "' with " <<  typeLayout.getSize().getQuantity() << "bytes\n";

for(clang::RecordDecl::field_iterator fit = decl->field_begin(); fit != decl->field_end(); fit++) {
    const clang::QualType qualType = fit->getType().getLocalUnqualifiedType().getCanonicalType();
    size_t fieldOffset = typeLayout.getFieldOffset(fit->getFieldIndex());
    std::cout << "member '" << qualType.getAsString() << "' with " << fieldOffset << "bytes offset\n";
}

无保证:代码一起复制,未在此处键入测试 - 但应该有效...(tm)