複数のライブラリとメイン プログラムで構成される C プロジェクトで、コード カバレッジの使用率を測定しようとしています。
ライブラリとメイン プログラムの両方から使用していない関数を見つけるのに役立つユーティリティはありますか。
コード カバレッジ レポートで無視するために、メイン プログラムで使用されていない関数 (パブリック関数) のリストを作成したいと考えています。
複数のライブラリとメイン プログラムで構成される C プロジェクトで、コード カバレッジの使用率を測定しようとしています。
ライブラリとメイン プログラムの両方から使用していない関数を見つけるのに役立つユーティリティはありますか。
コード カバレッジ レポートで無視するために、メイン プログラムで使用されていない関数 (パブリック関数) のリストを作成したいと考えています。
gcc を使用している場合は、コードをオプションでコンパイルします。
-Wunused-function
静的関数が宣言されているが定義されていない場合、または非インライン静的関数が使用されていない場合は常に警告します。この警告は -Wall によって有効になります。
cflow はプログラムのコール グラフを作成できますが、関数へのポインターではうまく機能しない場合があります。
例:
#include <stdio.h>
static int f1(){
return 1;
}
int (*p_f1)() = f1;
int main() {
p_f1();
return 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ファイルを取得し、すべてを1つの.Cファイルに連結してから、すべての関数の先頭に静的なものを追加し、-Wunused-functonでコンパイルするのはどうですか?コードが非常にうまく記述されていない場合、これからいくつかの「興味深い」効果がありますが、試してみる価値があるかもしれません[Linuxシステムでこれを行うのはかなり簡単find . -name "*.c" -print | xargs cat {} > giantsource.c
です。たとえば、少し必要です。 sedや、すべての関数に静的なラベルを付けるための何か。これは、どのように実行するのかよくわかりません。コードのフォーマットに大きく依存します。
あなたはこれを見たいかもしれません:http: //www.gedanken.demon.co.uk/cxref/
私はそれを使用していませんが、適切な相互参照ツールは、「使用されていない」ものを参照がないものとして識別できるはずです。もちろん、呼び出されていない関数などによって使用されている関数を取り除くために、コードを何度か実行する必要があります。
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 行目で 2 回参照されていることがわかります。
未使用の機能を検出するには、同じプレフィックスの行が続いていないアスタリスクのある行を検索します。次の 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