计算C源代码中的函数

时间:2013-09-19 08:27:09

标签: c instrumentation

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

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

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

是否有任何工具可以执行静态动态分析?

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

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

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

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

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

如果使用最新版本的GCC(例如4.7或更新版本)进行编译,您可以为此目的制作一个简单的MELT扩展名。最大的优点是它可以在GCC中运行,因此将真正计算GCC正在做的事情......(例如经过一些优化后)。

请注意,GCC可能会在优化期间生成或删除某些函数(function cloningfunction inlining ....)

GCC MELT自2017年起已过时

答案 2 :(得分: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

答案 3 :(得分:0)

您还可以使用ctags并解析标记文件。一个快速的方法是做一些事情:

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

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

int f;   

答案 4 :(得分:0)

我有一个想法来计算函数.c文件..我们也可以计算这个.java文件。 这是c#类文件,您可以将文件传递给类

class CountFunctions
{

    private FileInfo File;
    private int functions = 0;

    public int getNumberOfFunctions
    {
        get { return functions; }
    }

    public countfunctions(FileInfo fs) {
        File = fs;
        getLineOfCode();
    }

    private void getLineOfCode()
    {
        string line;
        try
        {
            StreamReader reader = File1.OpenText();
            while (true)
            {
                line = reader.ReadLine();

                if (IsFunction(line))
                {
                    Functions++;
                }

                if (line == null)
                    break;
            }
        }
        catch (Exception r)
        {
            Console.WriteLine(r.Message);
        }

    }

    private bool IsFunction(string line)
    {
        if (line.Contains("void") || line.Contains("int") || line.Contains("short") || line.Contains("long") || line.Contains("float") || line.Contains("char") || line.Contains("double"))
        {
            if (!line.Contains(";"))
            {
                return true;
            }
        }
        return false;
    }
} 

答案 5 :(得分:0)

爱迪生设计集团(Edison Design Group)是用于C语言源代码静态分析的工具。它是编译器的前端,您可以利用它来计算代码的各种指标。