gpt4 book ai didi

c++ - 使用 clang 转储内存布局

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:11 25 4
gpt4 key购买 nike

你好寻找一种方法来使用 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 是错误的地方,我需要另一个钩子(Hook)来启动?

最佳答案

一种方法是在 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/8 << " bytes offset\n";
}

无保证:代码一起复制,未按此处输入的方式进行测试——但应该可以工作...(tm)

例子:

struct EXAMPLE
{
char a;
int b;
long c;
long long d;
float e;
double f;
};

输出:

record 'EXAMPLE' with 40 bytes
member 'char' with 0 bytes offset
member 'int' with 4 bytes offset
member 'long' with 8 bytes offset
member 'long long' with 16 bytes offset
member 'float' with 24 bytes offset
member 'double' with 32 bytes offset

更多内容见:
https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html
https://clang.llvm.org/doxygen/classclang_1_1ASTRecordLayout.html

关于c++ - 使用 clang 转储内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com