2017-03-25 3 views
0

malloc과 같은 특정 함수 이름을 검색하려면 다음 예제를 찾았지만 C 소스 파일의 함수 선언에서 모든 함수 이름을 찾고 싶습니다. 그래서 ReturnCode HashCreate(Hash** hash, unsigned int table_size)의 경우 HashCreate와 행 번호를 찾고 있습니다. 파이썬이 아니기 때문에 꽤 복잡한 것처럼 보입니다. 어떻게해야할까요?pycparser를 사용하여 함수 선언에서 함수 이름을 찾는 방법은 무엇입니까?

from __future__ import print_function 
import sys 

sys.path.extend(['.', '..']) 

from pycparser import c_parser, c_ast, parse_file 

class FuncCallVisitor(c_ast.NodeVisitor): 
    def __init__(self, funcname): 
     self.funcname = funcname 

    def visit_FuncCall(self, node): 
     if node.name.name == self.funcname: 
      print('%s called at %s' % (self.funcname, node.name.coord)) 


def show_func_calls(filename, funcname): 
    ast = parse_file(filename, use_cpp=True, 
        cpp_path='clang', 
        cpp_args=['-E']) 
    v = FuncCallVisitor(funcname) 
    v.visit(ast) 


if __name__ == "__main__": 
    if len(sys.argv) > 2: 
     filename = sys.argv[1] 
     func = sys.argv[2] 
    else: 
     filename = 'hash.c' 
     func = 'malloc' 

    show_func_calls(filename, func) 

답변

1

func_defs 예를 들어 당신이 찾고있는 정확하게 수행합니다

# Using pycparser for printing out all the functions defined in a 
# C file. 
+0

완벽한, 내가 필요 정확히. pycparser에게 헤더 파일을 무시하도록 지시 할 수 있습니까? [this] (https://raw.githubusercontent.com/torvalds/linux/master/kernel/sched/core.c)와 같은 파일에 모든 헤더 파일을 추가하는 것은 약간 불편합니다. – JohnnyFromBF

+0

@JohnnyFromBF : http://eli.thegreenplace.net/2015/on-parsing-c-type-declarations-and-fake-headers를 읽으십시오. –