メインコンテンツ

静的パスの数がしきい値を上回っている

関数内の静的パスの数が、定義済みしきい値を超えています

R2021a 以降

説明

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

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

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

リスク

このチェッカーに違反している場合、関数にある可能な実行パスの数が過剰である可能性があります。過剰な数の実行パスがあると、すべてのパスを網羅的にテストするのが困難になります。このような関数は、デバッグ、テスト、保守するのが困難です。

修正方法

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

  • 制御構造を長いシーケンスに配置しないようにします。

  • 複雑な関数を複数の関数に分割して簡素化し、テストしやすくします。

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

すべて展開する


int afunc (int x);
int foo(int x,int y) //Noncompliant
{
	int flag;
	if (x <= 0){
		if (x > 10 ) { return 0; }
	}
	if (x<-240) {
		if (x < -2565) { 
			return (x < -253 ? 0: afunc (x <22566 ? 1: afunc(x < -25103 ? 0: 6))); 
		}
	}
	for (int i = 0; i< 10; i++)
	{
		while (x < y ) flag = 1;
		do {++x;} while (i<7);
		flag = 0;
	}
	return flag;
}

この例では、関数 foo に分岐点となるステートメントが多数あり、パスの数は 45 となっています。これは、しきい値として指定されている 40 を超えています。関数には多数の実行パスがあるため、この関数をテストするのは難しく、テストですべての実行パスを網羅できない可能性があります。Polyspace は、非準拠としてこの関数にフラグを設定します。

修正 — コードをリファクタリング

1 つの修正方法として、関数を 2 つの関数に分割します。


int afunc (int x);
int foo2(int x,int y)//Compliant 
{
	
	if (x <= 0){
		if (x > 10 ) { return 0; }
	}
	if (x<-240) {
		if (x < -2565) { 
			return (x < -253 ? 0: afunc (x <22566 ? 1: afunc(x < -25103 ? 0: 6))); 
		}
	}
}

int bar(int x,int y){//Complaint
	int flag;
	for (int i = 0; i< 10; i++)
	{
		while (x < y ) flag = 1;
		do {++x;} while (i<7);
		flag = 0;
	}
	return flag;
}

関数 foo2 および bar のパスは許容される数であり、foo と比べると、これらの関数は容易にテストできます。

チェック情報

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

バージョン履歴

R2021a で導入