2010-11-29 3 views
2

나는 clang을 사용하여 원본 소스 변환을 수행합니다. 다음과 같이하고 싶습니다.Clang을 사용한 함수 호출 분석

저는 C에서 va_arg 함수의 일부 클래스를 가지고 있습니다 (예 : printf()). 소스 파일에 printf()을 여러 번 호출 할 수 있습니다. 소스 코드를 파싱하고이 모든 호출을 printf()으로 찾으려합니다. 또한, 나는 printf()에 전달되는 인수 유형을 찾고 싶습니다. 그래서, 만약 내가 printf에 특정 호출 유형 printf(char*, int, int, int)의 것을 알아낼 수 있기를 원하는

int a, b, c; 
printf("%d%d%d", a, b, c); 

같은 것을 가지고있다. 특히 한정어는 신경 쓰지 않습니다.

누군가가 clang에서이 작업을 어떻게 수행해야하는지 알려 줄 수 있습니까? 이와 비슷한 일을하는 모든 예가 환영받을 것입니다. 당신이보고해야하는 모든 수업이 무엇을 따라야 하는지를 말해 줄 수 있다면, 따라야 할 흐름을 간단히 말해 주면, 나는 매우 감사 할 것입니다.

답변

0

ASTConsumer를 작성해야합니다. 가장 먼저 살펴볼 것은 examples/PrintFunctionNames의 코드이며 매우 간단한 ASTConsumer입니다.

printf에 대한 모든 호출을 찾는 한 가지 방법은 RecursiveASTVisitor을 통해 CallExpr 노드를 찾는 것입니다. 이러한 노드에는 인수를 검사 할 수있는 getNumArgs() 및 getArg (n)이 있습니다. 표현식에 대해 expr-> getType()을 호출하여 유형을 가져올 수 있습니다.