給定一個C++源代碼,我想找到每個函數寫入和讀取的類字段。使用Clang前端進行此操作的最佳方式是什麼?如何查找使用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)
我們可以假設爲簡單起見,沒有繼承。