メインコンテンツ

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

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

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

R2021a 以降

説明

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

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

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

リスク

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

  • 関数が他の多くの関数に依存しているため、依存する関数のいずれかに変更が加えられると、その変更によって予期しない動作が引き起こされる。

  • 関数が実行するタスクが多すぎる。

  • モジュールで不測の、または計画外の状況に発展する。

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

修正方法

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

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

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

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

すべて展開する

class A{
	//..
};
class B{
	//...
};
void transform1(A &a, B &b){
	//...
}
void transform2(A &a, B &b){
	//...
}
void transform3(A &a, B &b){
	//...
}
void transform4(A &a, B &b){
	//...
}
void transform5(A &a, B &b){
	//...
}
void transform6(A &a, B &b){
	//...
}
void transform7(A &a, B &b){
	//...
}
void transform8(A &a, B &b){
	//...
}
void main(){//Noncompliant
	A a; 
	B b;
	transform1(a,b);
	transform2(a,b);
	transform3(a,b);
	transform4(a,b);
	transform5(a,b);
	transform6(a,b);
	transform7(a,b);
	transform8(a,b);
}

この例では、main() 関数が関数呼び出しに対して定義されているしきい値を超える、8 つの異なる関数を呼び出します。8 つの関数のどれもが問題の原因になり得るため、main() をデバッグするのは困難です。Polyspace は main() 関数にフラグを設定します。

修正 — それぞれ特定のタスクを実行する関数を設計

1 つの修正方法として、それぞれ特定のタスクを実行する関数を設計します。この例の場合、個別のタスクが既にそれぞれ異なる関数にデリゲートされていますが、main() もこれらのタスクを実行する可能性があります。main のタスクの負荷を複数の関数に分割すると、関数のデバッグ、保守、テストが容易になる可能性があります。

class A{
	//..
};
class B{
	//...
};
void transform1(A &a, B &b){
	//...
}
void transform2(A &a, B &b){
	//...
}
void transform3(A &a, B &b){
	//...
}
void transform4(A &a, B &b){
	//...
}
void transform5(A &a, B &b){
	//...
}
void transform6(A &a, B &b){
	//...
}
void transform7(A &a, B &b){
	//...
}
void transform8(A &a, B &b){
	//...
}
void FirstStep(A &a, B &b){
	transform1(a,b);
	transform2(a,b);
	transform3(a,b);
}
void SecondStep(A &a, B &b){
	transform4(a,b);
	transform5(a,b);
	transform6(a,b);
}
void ThirdStep(A &a, B &b){
	transform7(a,b);
	transform8(a,b);
}
void main(){//Compliant
	A a; 
	B b;
	FirstStep(a,b);
	SecondStep(a,b);
	ThirdStep(a,b);
}

チェック情報

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

バージョン履歴

R2021a で導入