メインコンテンツ

関数呼び出しの数がしきい値を上回っている

関数に含まれる関数呼び出しの数が、関数の呼び出し発生数に対して定義されているしきい値を超えている

R2021a 以降

説明

この欠陥は、関数本体に、関数の呼び出し発生数に対して指定されているしきい値を超える数の関数呼び出しが含まれている場合に報告されます。Polyspace® が関数呼び出しの発生数を計算する方法について詳しくは、呼び出しの発生数を参照してください。

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

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

リスク

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

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

  • 関数が他の複数の関数との高い相互依存性を持っている。

  • 他の関数での変更が、フラグが設定された関数に予期しない影響を与える。

これらの要因により、関数の保守とデバッグが困難になります。

修正方法

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

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

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

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

すべて展開する


 long long power(double x, int n){
	 long long BN = 1;
	 for(int i = 0; i<n;++i){
		 BN*=x;
	 }
	 return BN;
 }
long long factorial(int n){
	 long long BN = 1;
	 for(int i = 1; i<=n;++i){
		 BN*=i;
	 }
	 return BN;
 }
 
 double AppxIndex(double m, double f){//Noncompliant
	 double U = (power(m,2) - 1)/(power(m,2)*factorial(2));
	 double V = (power(m,4) + 27*power(m,2)+38)/factorial(3)*(2*power(m,2)+3);
	 return (1+2*f*power(U,2)*(1+power(m,2)*factorial(static_cast<int>(U/V))
       + power(m,3)/power(m,3)*(U-V)))/( (1-2*f*power(U,2)*(1+power(m,2)*
        factorial(static_cast<int>(U/V)) + power(m,3)/power(m,3)*(U-V)))); }

この例では、関数 AppxIndex に、呼び出しの発生数に対して指定されているしきい値 10 を超える、17 の異なる関数呼び出しが含まれています。このように呼び出しの発生数が多いということは、この関数が実行しているタスクが多すぎることを意味します。また、この関数が持つ、他の関数との相互依存性が高いことも意味します。これらの要因により、AppIndex の保守、テスト、またはデバッグが困難になります。

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

1 つの修正方法として、関数をリファクタリングします。ここでは、関数が特定のタスクを実行する複数の小さな関数に分割されています。

  long long power(double x, int n){//Compliant
	long long BN = 1;
	for(int i = 0; i<n;++i){
		BN*=x;
	}
	return BN;
}
long long factorial(int n){//Compliant
	long long BN = 1;
	for(int i = 1; i<=n;++i){
		BN*=i;
	}
	return BN;
}

double CalculateU(double m){//Compliant
	return (power(m,2) - 1)/(power(m,2)*factorial(2));
}

double CalculateV(double m){//Compliant
	return (power(m,4) + 27*power(m,2)+38)/factorial(3)*(2*power(m,2)+3);
}

double CalculateMid(double m, double f){//Compliant
	double U = CalculateU(m);
	double V = CalculateU(m); 
	return (2*f*power(U,2)*(1+power(m,2)*factorial(static_cast<int>(U/V))
             + power(m,3)/power(m,3)*(U-V)));
}

double AppxIndex(double m, double f){//Compliant
	
	return (1+CalculateMid(m,f))/( (1-CalculateMid(m,f)));
}

チェック情報

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

バージョン履歴

R2021a で導入