C++ 소스 코드가 주어지면 모든 함수가 쓰고 읽는 클래스 필드를 찾고 싶습니다. Clang 프론트 엔드를 사용하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 지금까지 내가 RecursiveASTVisitor를 사용하여 문을 구문 분석을 시도Clang을 사용하여 모든 회원 필드의 읽기/쓰기를 어떻게 찾을 수 있습니까?
, 그러나 추적하는,
(그러나 효율적인 솔루션을위한 출발점이 좋은 것입니다. 나는 모든 단계에 대한 자세한 설명을 요구하고 있지 않다) 노드 연결은 어렵습니다. 또한, 나는 다음과 같은 것을 추적하는 방법을 알아낼 수 없습니다 :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)
우리는 상속 재산이 없다는 것을 단순화를 위해 가정 할 수있다 반환해야합니다.