メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

呼び出し元の関数の数がしきい値を超えている

関数の個別の呼び出し元の数が、定義済みしきい値を超えている

R2021a 以降

説明

この欠陥は、チェッカーの定義済みしきい値を超える数の個別の呼び出し元が含まれる関数に対して報告されます。Polyspace が関数の呼び出し元の数を計算する方法について詳しくは、呼び出し元関数の数を参照してください。

Polyspace® は、ユーザーがしきい値を指定しない限り、既定のしきい値として 5 を使用します。しきい値を指定できる選択ファイルを指定するには、オプション [ファイルごとにチェッカーを設定] (-checkers-selection-file) または [チェッカー アクティベーション ファイル] (-checkers-activation-file) を使用します。

polyspace-comments-import を使用して以前の解析からコメントをインポートすると、Polyspace は以前の結果のコード メトリクスの呼び出し元関数の数に関するレビュー情報を、このチェッカーの現在の結果にコピーします。現在の結果に同じコード メトリクスが含まれている場合、レビュー情報はそのコード メトリクスにもコピーされます。

リスク

このチェッカーに違反している場合は、次の可能性があります。

  • フラグが設定された関数で発生している問題が伝播し、さまざまな場所で予期しない影響を与えている。

  • ファイル内のデータ フローが複雑になっていて、問題の根本原因を見つけるのが難しい。

  • フラグが設定された関数が複数のタスクを実行している。

これらの要因により、モジュールの保守とデバッグが困難になります。

修正方法

このチェックを修正するには、コードをリファクタリングするか、チェッカーのしきい値を変更します。コードをリファクタリングする場合は、コード内の関数を次のように設計します。

  • 各関数が単一の特定のタスクを実行するようにする。

  • 関数が他の関数に与える二次的影響を最小限にする。

ベスト プラクティスは、開発後のリファクタリング コストを回避するために、開発の早期段階でモジュールの複雑度をチェックすることです。

すべて展開する

void utilityFunc(){//Noncompliant
	//...
}

void task1(){
	utilityFunc();
	//...
}
void task2(){
	utilityFunc();
	//...
}
void task3(){
	utilityFunc();
	//...
}
void task4(){
	utilityFunc();
	//...
}
void task5(){
	utilityFunc();
	//...
}
void task6(){
	utilityFunc();
	//...
}
void task7(){
	utilityFunc();
	//...
}

この例では、関数 utilityFunc が 7 つの異なる関数によって呼び出されます。これは、utilityFunc が複数のタスクを実行することを意味している可能性があります。utilityFunc で発生している問題が、utilityFunc を呼び出す 7 つの関数のいずれかに予期しない影響を与える可能性があります。このような相互依存性により、コードの保守とデバッグが困難になります。Polyspace は、関数 utilityFunc に非準拠としてフラグを設定します。

修正 — 関数をリファクタリング

1 つの修正方法として、関数をリファクタリングします。たとえば、さまざまなタスクで必要となる複数の異なるタスクを、1 つではなく 2 つのユーティリティ関数にデリゲートします。

void utilityFuncA(){//Compliant
	//...
}
void utilityFuncB(){//Compliant
	//...
}

void task1(){
	utilityFuncA();
	//...
}
void task2(){
	utilityFuncA();
	//...
}
void task3(){
	utilityFuncA();
	//...
}
void task4(){
	utilityFuncB();
	//...
}
void task5(){
	utilityFuncB();
	//...
}
void task6(){
	utilityFuncB();
	//...
}
void task7(){
	utilityFuncB();
	//...
}

チェック情報

グループ: ソフトウェアの複雑度
言語: C | C++
頭字語: SC04
既定のしきい値: 5

バージョン履歴

R2021a で導入