メインコンテンツ

ローカルの非静的変数の数がしきい値を上回っている

関数に含まれるローカルの非静的変数の数が、定義済みしきい値を超えている

R2021a 以降

説明

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

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

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

リスク

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

  • 関数が過剰に長い。

  • 関数が 1 つの特定のタスクを実行するのではなく、複数のタスクを実行する。

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

修正方法

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

  • 関数を小さなモジュールに分割して、各関数で特定の 1 つのタスクを実行するようにすることを検討する。

  • 同様の役割を持つ変数を、クラス、構造体、ベクトル、マップなどのコンテナーにバンドルすることを検討する。

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

すべて展開する

#include <string>
void foo(void){//Noncompliant
	
	int Value1,Value2,Value3,Value4,Value5,Value6,Value7,Value8,Value9,Value10,Value11;
	std::string Name1,Name2,Name3,Name4,Name5,Name6,Name7,Name8,Name9,Name10,Name11;
	//....
	
}

この例では、11 の個別のエンティティの名前と、それらのエンティティに関連する値がそれぞれ別個の変数として宣言されています。このように数が多いと、変数を追跡するのが難しくなります。コードにエンティティを追加する場合は、さらに変数を宣言しなければなりません。このようなコードはテスト、保守、デバッグするのが困難です。Polyspace はこの関数にフラグを設定します。

修正 — 関連するデータをコンテナーにバンドル

1 つの修正方法として、関連するデータをコンテナーにバンドルします。たとえば、このコードではデータを std::map コンテナーにバンドルしてから、そのコンテナーをクラス内にラップします。こうすると、コードで宣言しなければならないローカル変数が 1 つのみになり、その変数をデータの格納、管理、アクセスに使用できます。このコードは容易に保守、テスト、デバッグできます。

#include <string>
#include <map>
class Instance{
	public:
	Instance();
	Instance(int, std::string);
	protected:
	addData(int,std::string);
	getValue(std::string);
	//...
	private:
	std::map<std::string, int> DataMap;
	
};
void foo(void){//Compliant
	
	Instance A;
	//....
	A.addData(5,"Name");
	
}

チェック情報

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

バージョン履歴

R2021a で導入