C 源代码中的计数函数

问题描述 投票:0回答:6

我有完整的 C 语言项目,可以使用 gcc 或 Visual Studio 构建。没有对外部库的调用。

我想知道该项目有多少个功能。

源代码中没有未使用的函数,并且该项目附带了使用不同参数运行它的测试,因此对于动态方法(例如运行时调用树),我需要在每次测试后累积结果。

有没有可以进行静态动态分析的工具?

c instrumentation
6个回答
5
投票

gcc

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

请注意,即使禁用优化,

gcc
也可以内联某些函数,因此您应该使用以下命令进行编译:

-O0 -fno-builtin -fno-inline-functions-called-once

(即使在

-finline-functions-called-once
中也默认启用
-O0


4
投票

函数的定义可能并不像你想象的那么简单。特别是,C 源代码中的函数与生成的汇编代码中的函数不匹配,特别是因为内联函数。

函数的数量和大小取决于优化级别和编译器。

许多标头(例如

<stdio.h>
)可以包含内联函数。如果不调用它们,编译器可能会通过不发出它们的代码来进行优化(对于某些静态函数也可能如此)。通常,声明为
static inline
的函数不会出现在优化后的代码中。

同样,某些宏可能会扩展为某些函数定义......

如果使用足够新的 GCC 版本(例如 4.7 或更高版本)进行编译,您可以为此目的制作一个简单的 MELT 扩展。最大的优点是它在 GCC 内部工作,所以会真正计算 GCC 正在做什么......(例如,经过一些优化后)。

请注意,GCC 在优化期间可能会生成或删除一些函数(函数克隆函数内联....)

GCC MELT 自 2017 年起已过时


3
投票

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

1
投票

您还可以使用ctags并解析标签文件。一种快速的方法是做类似的事情:

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

在项目的根目录中,但这可能并不总是正确的,例如,如果您的树中某处有这样的全局变量:

int f;   

0
投票

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


0
投票

这可能有点晚了,但我希望它能帮助其他人。 如果您想跟踪 C 中的函数计数并保持最佳编码风格实践。使用贝蒂。以下是具体操作方法:

假设我有一个名为 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 会给出一些样式错误,因为我在这里没有遵循最佳实践,但是在错误消息的末尾,您将看到每个函数的列表,如下所示:

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

© www.soinside.com 2019 - 2024. All rights reserved.