Вы можете написать посетителя, который найдет узлы FuncDef
и запустить на них другого посетителя, который найдет все узлы FuncCall
. Например:
class FuncDefVisitor(c_ast.NodeVisitor):
def visit_FuncDef(self, node):
# Here node is a FuncDef node for the function definition.
v = FuncCallVisitor()
v.visit(node)
class FuncCallVisitor(c_ast.NodeVisitor):
def visit_FuncCall(self, node):
# do something
В visit_FuncDef
мы создаем нового посетителя вызова и запускаем его на node
, что означает, что он запускается только в узле AST для определения функции. Он найдет Func_2
и Func_3
в вашем коде, но не вызовы func в других функциях.
При этом обратите внимание, что из этого вы получите только статический график вызовов *1013*. В Си функции могут вызывать других через указатели на функции, и это не то, что вы можете знать статически в общем случае.