作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
你好寻找一种方法来使用 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/
我正在为我的应用程序使用 Tank-Auth。我唯一的问题是激活和重置帐户密码。 用于登录、注册、注销;我对这些代码没有问题; $route['login'] = "/auth/login"; $ro
我是一名优秀的程序员,十分优秀!