c。未使用的功能检测实用程序

时间:2012-12-31 16:19:45

标签: c code-analysis

我正在尝试在包含多个库和主程序的C项目中测量我的代码覆盖率利用率。

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

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

4 个答案:

答案 0 :(得分:7)

如果您使用的是gcc,请使用option编译代码:

-Wunused-function
  

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

答案 1 :(得分:1)

cflow可以为程序创建一个调用图,但在某些情况下,它对指向函数的指针不起作用。

for eaxample:

#include <stdio.h>

static int f1(){
        return 1;
}

int (*p_f1)() = f1;

int main() {
        p_f1();
        return 0;
}

答案 2 :(得分: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系统中这样做很容易,比如{{1}然后你需要一些sed或者其他东西来标记所有静态函数,我不太清楚你要怎么做 - 这在很大程度上取决于代码的格式。

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

我没有使用它,但任何体面的交叉引用工具都应该能够识别任何“未使用”的内容,因为没有任何引用。当然,你可能仍然需要遍历代码时间来清除未被调用的函数所使用的函数等。

答案 3 :(得分:0)

cflow具有构建交叉引用表的选项:--xref

输出格式由GNU cflow: Cross-Reference

描述

GNU cflow也能够生成交叉引用列表。此模式由--xref-x)命令行选项启用。交叉引用输出在单独的行上列出每个符号出现。每行显示标识符和它出现的源位置。如果此位置是定义符号的位置,则该位置还会附加一个星号,然后再加上定义。例如,这是d.c程序的交叉引用输出的一部分:

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