我有完整的C项目,可以用GCC或Visual Studio构建。没有调用外部库。我想知道这个项目有多少功能。在源代码中没有未使用的函数,并且项目附带了使用不同参数运行它的测试,因此对于动态方法(例如运行时调用树),我需要在每次测试后积累结果。有没有什么工具可以进行静态或动态分析?
xqkwcwgp1#
关于gcc:
gcc
$ nm elf_file | grep "T " | grep -v " _" | wc -l
字符串请注意,即使禁用了优化,gcc也可以内联某些函数,因此您应该使用以下命令编译:-O0 -fno-builtin -fno-inline-functions-called-once个(即使在-O0中,-finline-functions-called-once也默认启用)
-O0 -fno-builtin -fno-inline-functions-called-once
-O0
-finline-functions-called-once
pes8fvy92#
函数的定义可能并不像你想象的那么简单。特别是,C源代码中的函数与生成的汇编代码中的函数不匹配,特别是因为内联函数。函数的数量和大小取决于优化级别和编译器。许多头文件(例如<stdio.h>)可能包含内联函数。如果不调用它们,编译器可能会通过不发出它们的代码来优化(对于某些静态函数也是如此)。通常,声明为static inline的函数不会出现在优化的代码中。同样,一些宏可能会扩展到一些函数定义中。如果使用足够新的GCC版本(例如4.7或更新版本)进行编译,您可以为此目的制作一个简单的MELT扩展。最大的优点是它在GCC内部工作,因此可以真正计算GCC正在做的事情.(例如,经过一些优化)。注意,GCC可能会在优化过程中生成或删除某些函数(function cloning,function inlining ...)。GCC MELT自2017年以来已过时
<stdio.h>
static inline
jm2pwxwz3#
Frama-C有一个metrics插件,它可以计算程序中函数的数量。
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
型
qmb5sa224#
你也可以使用ctags并解析标签文件。一个快速的方法是这样做:
ctags -R -f - . | grep -w f | wc -l
字符串在你的项目的根目录下,但这可能并不总是正确的,例如,如果你在你的树中的某个地方有一个像这样的全局变量:
int f;
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,我得到了一些样式错误,因为我没有遵循这里的最佳实践,在错误消息的末尾,你会看到每个函数的列表如下:
betty file.c
的数据你可以看到我在第3、8、11和18行各有4个函数,它们的名字在最后。
sczxawaw6#
Edison Design Group是一个静态分析C源代码的工具,它是编译器的前端,你可以利用它来计算你代码的所有指标。
6条答案
按热度按时间xqkwcwgp1#
关于
gcc
:字符串
请注意,即使禁用了优化,
gcc
也可以内联某些函数,因此您应该使用以下命令编译:-O0 -fno-builtin -fno-inline-functions-called-once
个(即使在
-O0
中,-finline-functions-called-once
也默认启用)pes8fvy92#
函数的定义可能并不像你想象的那么简单。特别是,C源代码中的函数与生成的汇编代码中的函数不匹配,特别是因为内联函数。
函数的数量和大小取决于优化级别和编译器。
许多头文件(例如
<stdio.h>
)可能包含内联函数。如果不调用它们,编译器可能会通过不发出它们的代码来优化(对于某些静态函数也是如此)。通常,声明为static inline
的函数不会出现在优化的代码中。同样,一些宏可能会扩展到一些函数定义中。
如果使用足够新的GCC版本(例如4.7或更新版本)进行编译,您可以为此目的制作一个简单的MELT扩展。最大的优点是它在GCC内部工作,因此可以真正计算GCC正在做的事情.(例如,经过一些优化)。
注意,GCC可能会在优化过程中生成或删除某些函数(function cloning,function inlining ...)。
GCC MELT自2017年以来已过时
jm2pwxwz3#
Frama-C有一个
metrics
插件,它可以计算程序中函数的数量。字符串
输出结果如下:
型
qmb5sa224#
你也可以使用ctags并解析标签文件。一个快速的方法是这样做:
字符串
在你的项目的根目录下,但这可能并不总是正确的,例如,如果你在你的树中的某个地方有一个像这样的全局变量:
型
4si2a6ki5#
这可能有点晚,但我希望它能帮助其他人。如果你想在C中跟踪你的函数计数,并保持最佳的编码风格实践。使用betty。下面是如何做到这一点:
假设我有一个名为file.c的文件,其中包含以下函数:
字符串
因此,当我在我的文件上运行Betty时,即
betty file.c
,我得到了一些样式错误,因为我没有遵循这里的最佳实践,在错误消息的末尾,你会看到每个函数的列表如下:的数据
你可以看到我在第3、8、11和18行各有4个函数,它们的名字在最后。
sczxawaw6#
Edison Design Group是一个静态分析C源代码的工具,它是编译器的前端,你可以利用它来计算你代码的所有指标。