我在C中有完整的项目,可以使用gcc或Visual Studio构建。没有外部库的调用。
我想知道该项目中有多少功能。
源代码中没有未使用的函数,项目附带了使用不同参数运行它的测试,因此对于动态方法(例如运行时调用树),我需要在每次测试后累积结果。
是否有任何工具可以执行静态或动态分析?
答案 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 cloning,function 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语言源代码静态分析的工具。它是编译器的前端,您可以利用它来计算代码的各种指标。