【发布时间】:2017-09-09 07:17:08
【问题描述】:
给定一个 C++ 源代码,我想找到每个函数写入和读取的类字段。使用 Clang 前端执行此操作的最佳方法是什么?
(我并不是要求对所有步骤进行详细解释;但是,如果有一个有效解决方案的起点会很好。)
到目前为止,我尝试使用 RecursiveASTVisitor 解析语句,但很难跟踪节点连接。此外,我无法弄清楚如何跟踪以下内容:
int& x = m_int_field;
x++;
这明显修改了m_int_field;但是给定一个Stmt 是不可能知道的;所以 AST 遍历本身似乎是不够的。
对我来说,一个好处是能够分别计算字段和子字段(例如访问成员结构的三个字段)。
示例:
typedef struct Y {
int m_structfield1;
float m_structfield2;
Y () {
m_structfield1 = 0;
m_structfield2 = 1.0f;
}
} Y;
class X {
int m_field1;
std::string m_field2;
Y m_field3;
public:
X () : m_field2("lel") {}
virtual ~X() {}
void func1 (std::string s) {
m_field1 += 2;
m_field2 = s;
}
int func2 () {
return m_field1 + 5;
}
void func3 (Y& y) {
int& i = m_field1;
y.m_structfield2 = 1.2f + i++;
}
int func4 () {
func3 (m_field3);
return m_field3.m_structfield1;
}
};
应该返回
X::X() -> m_field1 (w), m_field3.m_structfield1 (w), m_field3.m_structfield2 (w)
X::func1(std::string) -> m_field1 (r+w), m_field2 (w)
X::func2() -> m_field1 (r)
X::func3(Y&) -> m_field1 (r+w)
X::func4() -> m_field1 (r+w), m_field3.m_structfield2 (w), m_field3.m_structfield1 (r)
为了简单起见,我们可以假设没有继承。
【问题讨论】:
标签: c++ clang abstract-syntax-tree static-analysis llvm-clang