C源代码中的计数函数

mwngjboj  于 12个月前  发布在  其他
关注(0)|答案(6)|浏览(141)

我有完整的C项目,可以用GCC或Visual Studio构建。没有调用外部库。
我想知道这个项目有多少功能。
在源代码中没有未使用的函数,并且项目附带了使用不同参数运行它的测试,因此对于动态方法(例如运行时调用树),我需要在每次测试后积累结果。
有没有什么工具可以进行静态动态分析?

xqkwcwgp

xqkwcwgp1#

关于gcc

$ nm elf_file | grep "T " | grep -v " _" | wc -l

字符串
请注意,即使禁用了优化,gcc也可以内联某些函数,因此您应该使用以下命令编译:
-O0 -fno-builtin -fno-inline-functions-called-once
(即使在-O0中,-finline-functions-called-once也默认启用)

pes8fvy9

pes8fvy92#

函数的定义可能并不像你想象的那么简单。特别是,C源代码中的函数与生成的汇编代码中的函数不匹配,特别是因为内联函数。
函数的数量和大小取决于优化级别和编译器。
许多头文件(例如<stdio.h>)可能包含内联函数。如果不调用它们,编译器可能会通过不发出它们的代码来优化(对于某些静态函数也是如此)。通常,声明为static inline的函数不会出现在优化的代码中。
同样,一些宏可能会扩展到一些函数定义中。
如果使用足够新的GCC版本(例如4.7或更新版本)进行编译,您可以为此目的制作一个简单的MELT扩展。最大的优点是它在GCC内部工作,因此可以真正计算GCC正在做的事情.(例如,经过一些优化)。
注意,GCC可能会在优化过程中生成或删除某些函数(function cloningfunction inlining ...)。
GCC MELT自2017年以来已过时

jm2pwxwz

jm2pwxwz3#

Frama-C有一个metrics插件,它可以计算程序中函数的数量。

frama-c -metrics file1.c file2.c ... filen.c

字符串
输出结果如下:

Global metrics
      ============== 
      Sloc = 2080
      Decision point = 117
      Global variables = 51
      If = 117
      Loop = 22
      Goto = 75
      Assignment = 613
      Exit point = 242
      Function = 841
      Function call = 871
      Pointer dereferencing = 447

qmb5sa22

qmb5sa224#

你也可以使用ctags并解析标签文件。一个快速的方法是这样做:

ctags -R -f - . | grep -w f | wc -l

字符串
在你的项目的根目录下,但这可能并不总是正确的,例如,如果你在你的树中的某个地方有一个像这样的全局变量:

int f;

4si2a6ki

4si2a6ki5#

这可能有点晚,但我希望它能帮助其他人。如果你想在C中跟踪你的函数计数,并保持最佳的编码风格实践。使用betty。下面是如何做到这一点:
假设我有一个名为file.c的文件,其中包含以下函数:

#include <stdio.h>

int func1()
{
    printf("This is funct1\n");
}

int func2()
{
    printf("This is funct2\n");
}

int func3()
{
    printf("This is funct3\n");
}

int main()
{
    return (0);
}

字符串
因此,当我在我的文件上运行Betty时,即betty file.c,我得到了一些样式错误,因为我没有遵循这里的最佳实践,在错误消息的末尾,你会看到每个函数的列表如下:


的数据
你可以看到我在第3、8、11和18行各有4个函数,它们的名字在最后。

sczxawaw

sczxawaw6#

Edison Design Group是一个静态分析C源代码的工具,它是编译器的前端,你可以利用它来计算你代码的所有指标。

相关问题