2008-10-31 2 views
1

파이썬을 사용하여 C++ 파일에서 함수 호출의 모든 발생을 찾아 각 호출에 대한 인수를 추출해야합니다.
나는 pygccxml 패키지와 함께 연주하고, 함수 호출의 문자열 주어진 인수를 추출하고있어 매우 간단합니다 :파이썬을 사용하여 C++ 파일에서 특정 함수의 호출 찾기

from pygccxml.declarations import call_invocation 

def test_is_call_invocation(call): 
    if call_invocation.is_call_invocation(call): 
     print call_invocation.name(call) 
     for arg in call_invocation.args(call): 
      print " ",arg 
    else: 
     print "not a function invocation" 

은 내가 찾을 수 없습니다 것은 파일을 구문 분석 호출을 받고하는 방법입니다 :

from pygccxml import parser 
from pygccxml import declarations 

decls = parser.parse(['main.cpp']) 
# ... 

pygccxml 패키지를 사용하여 특정 기능에 대한 호출을 찾는 방법이 있습니까?
어쩌면 저 패키지가 내가하려고하는 것에 대한 과잉 공격 일 수 있습니다. 그리고 훨씬 간단한 방법이 있습니까? 정규 표현식으로 함수 호출을 찾는 것은 첫눈을 보는 것보다 훨씬 까다 롭습니다 ...

답변

2

XML-GCC는 데이터 유형 (및 기능 서명). 함수 본문을 무시합니다. 이를 확인하려면 a.cc :

void foo() 
{} 

void bar() 
{ 
     foo(); 
} 

을 작성한 다음 gccxml a.cc -fxml=a.xml을 실행하십시오. 생성 된 a.xml을보고 foo (또는 id)의 유일한 언급이 foo 선언에 있음을 확인하십시오.

다른 대안이 codeviz (http://www.csn.ul.ie/~mel/projects/codeviz/)에서 사용 가능할 수 있습니다. 호출 종속성 정보를 생성하는 gcc 3.4.6 패치와 graphviz 입력을 생성하는 일부 펄 스크립트로 구성됩니다. 후자는 무시할 수 있습니다.

또 다른 대안 (gcc 수정이 필요 없음)으로 접근 방법을 복사 할 수 있습니다 (http://www.gson.org/egypt/); 이것은 GCC RTL 덤프를 파싱합니다. 그것은 최근 GCC에서 작동해야하지만 인라인 함수를 호출하지 않을 수도 있습니다.

어쨌든 이러한 접근 방식을 사용하면 매크로에 대한 "호출"이 발생하지 않지만 실제로는 더 나은 선택 일 수 있습니다.

관련 문제