4

我正在尝试测量我在 C 项目中的代码覆盖率利用率,该项目由几个库和主程序组成。

是否有一个实用程序可以帮助我从库和主程序中找到我不使用的功能。

我想构建我的主程序未使用的函数(公共函数)列表,以便在我的代码覆盖率报告中忽略它们。

4

4 回答 4

6

如果您使用 gcc,您可以使用以下选项编译代码:

-Wunused-function

每当声明了静态函数但未定义或未使用非内联静态函数时发出警告。此警告由 -Wall 启用。

于 2012-12-31T16:21:55.470 回答
2

cflow 可以为程序创建调用图,但在某些情况下它不能很好地处理指向函数的指针。

例如:

#include <stdio.h>

static int f1(){
        return 1;
}

int (*p_f1)() = f1;

int main() {
        p_f1();
        return 0;
}
于 2013-01-02T14:12:53.483 回答
0

有免费可用的覆盖工具 - 例如与 gcc 工具套件一起运行的“gcov”。但是,代码覆盖率只会告诉您哪些功能会受到您的测试(或您为执行代码所做的任何事情)的影响,例如

ptr = malloc(...);
if (!ptr)
{
   allocation_failed(__FILE__, __LINE__);
}

如果您还使用一些使您的分配不时失败的工具,只会显示调用了 allocation_failed 。

我不知道有一种工具可以向您展示大型系统(具有多个库等)不使用哪些功能。我希望您可以通过使用“nm”的输出和一些“拉入”来制作一些东西。在这种情况下,它不会涵盖未使用的 foo 和 bar :

unit1.c:
   extern int foo(void);

   int bar()
   {
       return foo();
   }


unit2.c:

   int foo(void)
   {
      return 42;
   }

   int baz(void)
   {
      return bar();
   }

然后 baz 不在任何地方使用。但是如果你删除baz,它会显示没有调用bar,然后你可以删除foo...

编辑:疯狂的想法时间-如何获取项目中的每个 C 文件并将整个内容连接到一个单独的 .C 文件中,然后在每个函数的开头添加静态,并使用 -Wunused-functon 进行编译 - 我敢肯定如果你的代码写得不是很好,这会产生一些“有趣”的效果,但它可能值得一试[在 Linux 系统中这样做相当容易,比如find . -name "*.c" -print | xargs cat {} > giantsource.c- 你需要一点点sed 或其他东西将所有函数标记为静态,我不太确定你会怎么做——这在很大程度上取决于代码的格式。

你可能想看看这个: http ://www.gedanken.demon.co.uk/cxref/

我没有使用过它,但任何体面的交叉引用工具都应该能够将任何“未使用”的东西识别为没有任何引用。当然,您可能仍然需要多次运行代码以清除未被调用的函数所使用的函数等。

于 2012-12-31T16:37:01.303 回答
0

cflow可以选择构建交叉引用表:--xref

GNU cflow描述了输出的格式:Cross-Reference

GNU cflow 还能够生成交叉引用列表。此模式由--xref( -x) 命令行选项启用。交叉引用输出将每个符号出现在单独的行上。每行显示标识符和它出现的源位置。如果此位置是定义符号的位置,则另外用星号标记并后跟定义。例如,这里是 dc 程序的交叉引用输出的片段:

printdir * d.c:42 void printdir (int level,char *name)
printdir   d.c:74
printdir   d.c:102

它表明函数 printdir 在第 42 行中定义,并在第 74 行和第 102 行被引用了两次。

要检测未使用的函数,请搜索带有星号的行,而不是具有相同前缀的行。以下 GNU Awk 代码打印未使用的函数:

 {
   if( $2 == "*" ) {
      if( f ) {
         print f
      }
      f = $1
   }
   else {
      f = ""
   }
}

命令可能是:

cflow -x src/*.c src-gen/*.c | awk -f find-unused-functions.awk
于 2020-11-05T23:10:25.467 回答