使用Python查找C++文件中特定函数的调用

1 投票
1 回答
764 浏览
提问于 2025-04-11 09:32

我需要用Python在一个C++文件中找到所有函数调用的地方,并提取每个调用的参数。
我正在尝试使用pygccxml这个包,给定一个包含函数调用的字符串,提取参数非常简单:

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包找到某个函数的调用呢?
或者说这个包对我想做的事情来说太复杂了 :) 其实有更简单的方法吗?用正则表达式找到函数调用,我担心比看起来要复杂得多...

相关问题:

1 个回答

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的一个补丁,可以生成调用依赖信息,还有一些perl脚本用于生成graphviz的输入;后者你可以选择忽略。

还有一个不需要修改gcc的选择,你可以参考egypt(http://www.gson.org/egypt/)的方法;它解析GCC的RTL输出。这个方法应该适用于任何较新的GCC,不过可能无法获取到内联函数的调用。

无论如何,使用这些方法,你不会得到宏的“调用”信息,但这可能反而是更好的选择。

撰写回答