计算C程序中的函数调用数

时间:2013-04-04 22:24:17

标签: bash sed awk grep

给出了C源程序。为每个定义的函数确定 来源,呼叫数量以及呼叫发生的行。

我能想到的最好的事情是grep -c 'function (' code.c 但是这只有在我知道函数名称时才有效,并且它只提供调用次数(考虑到该文件中没有原型)。不知道还有什么可以开始,所以任何建议都会得到很好的满足。

3 个答案:

答案 0 :(得分:6)

ctags可以可靠地为您提供功能名称列表,例如

$ cat test.c
#include <stdio.h>

void foo(void)
{
    printf ("Hello World!\n");
}

int main(int argc, char *argv[])
{
    foo();
    return 0;
}

$ ctags -x --c-types=f test.c
foo              function      3 test.c           void foo(void)
main             function      8 test.c           int main(int argc, char *argv[])

这有助于您入门吗?

答案 1 :(得分:2)

http://en.wikipedia.org/wiki/Cscope下载cscope(http://cscope.sourceforge.net/),然后执行以下操作(检查选项/语法):

1)从源文件构建数据库(我将其命名为db.csc):

cscope -b -u -f db.csc *.c *.h ....

2)在数据库中搜索所有函数调用:

cscope -d -f db.csc -L -3 '.*'

它将为您提供每个函数的列表+它调用的函数+发生调用的行号。您可能需要阅读手册页并稍微玩一下这些选项,因为我上次这样做了几年。

答案 2 :(得分:-2)

你最好只需几步即可。

首先,使用grep和awk从文件中获取所有函数名称并将其保存在临时文件中。类似的东西:

$ grep ^function code.c | awk '{print $2 }' > /tmp/toto

接下来,对于临时文件中的每个条目,搜索code.c文件中函数名称的所有出现,并获取每个调用的行号。类似的东西:

cat /tmp/toto | while read line; do
grep -n $line code.c
echo total: `grep $line code.c | wc -l` times
done

希望它有所帮助。