C++のソースコードでは、すべての関数が書き込みおよび読み取りを行うクラスフィールドを探したいと思います。 Clangフロントエンドを使ってこれを行う最善の方法は何ですか?これまでのところ、私はRecursiveASTVisitorを使用して文を解析しようとしたClangを使用して、すべてのメンバーフィールドの読み取り/書き込みを検索するにはどうすればよいですか?
を、しかしを追跡する。
(ただし、効率的なソリューションのための出発点は素晴らしいことだ。私はすべてのステップの詳細な説明を求めていませんよ)ノード接続は困難です。また、私は以下のようなものを追跡する方法を見つけ出すことはできません。int& x = m_int_field;
x++;
これは明らかにm_int_field
を修正します。ただ一つのStmt
があればそれは分かりません。 ASTのトラバーサル自体が不十分と思われます。
私のボーナスは、フィールドとサブフィールドを別々に数えることができます(たとえば、メンバー構造の3つのフィールドにアクセスするなど)。
例:
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)
を返す必要があります。