2013-02-15 1 views
8

clang을 사용하여 절차 간 데이터 흐름을 분석하고 있습니다. 현재 libtooling을 사용하여 소스 파일을 구문 분석하고 AST 방문자를 호출합니다. 질문은 여러 .c 파일에 대해 단일 AST를 작성하는 방법입니다.clang이있는 여러 소스 파일에 대한 AST

ASTImport 클래스를 사용하려고했지만 일부 AST 노드 가져 오기를 지원하지 않습니다. 게다가, 나는 컴파일러를 생성하고 조작 할 때 뭔가 잘못된 일을하고 있으며 소멸자에서 충돌을 일으킨다.

매우 비슷한 옵션은 ASTImportAction이지만이 경우 ClangTool에 전달해야하는 명령 줄 매개 변수는 무엇인지 분명하지 않습니다.

세 번째 옵션은 모든 .c 파일에 대해 ASTUnits를 만들고 각 파일에서 정의를 찾는 것이 었습니다. 사용자 정의 유형 간의 일치를 찾는 방법이 명확하지 않습니다. 기록. ASTImport에서는 IsStructurallyEquivalent() 함수를 사용하지만 익명 네임 스페이스에서 선언되므로이 코드를 모두 내 프로그램에만 복사 할 수 있습니다. 그리고 다시 모든 AST 노드를 지원하지 않습니다.

인터넷에서이 링크 http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html이 가장 적절하지만 솔루션의 기술적 세부 사항이 분명하지 않습니다.

모든 의견을 환영합니다. 많은 감사.

+1

왜 여러 파일에 대해 "하나의"AST를 생성하려고합니까? 왜 각 파일에 대해 하나의 AST 만 처리 할 수 ​​있습니까? –

+1

나는 누군가가 이것에 대한 답을 얻길 바란다. \ 나는 지금 똑같은 일을하려하고있다. –

답변

0

나는 비슷한 것을 시도하고있었습니다. 그래도 하나의 AST를 만들려고하지는 않았습니다. 여러 개의 AST를 구문 분석하고 함수를 내 자신으로 맵핑하려고했습니다. AST matchers를 사용하여 함수 호출을 얻은 다음 다른 AST에서 확인합니다.

나는 compile_commands.json 파일을 사용하여 소스 파일 목록을 제공하고 있습니다. OptionsParser.getCompilations(). getAllFiles()는 compile_commands.json에 지정된 모든 소스 파일을 가져올 수 있습니다.

우리가 clangTool을 만들고 matcher로 도구를 통해 frontendAction을 실행하면 모든 소스 파일에서 일치 항목을 검색합니다.

이렇게하는 것이 더 좋은 방법 일 수 있습니다. 어떤 사람들은 그것을 지적 해주십시오.