メインコンテンツ

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

ローカルの静的変数の数がしきい値を超えている

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

R2021a 以降

説明

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

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

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

リスク

静的変数の内容が、さまざまな形で影響を受ける可能性があります。関数に含まれる静的変数の数が多すぎると、コードでデータが適切にカプセル化されずに、関数の間で予期しない相互依存性が生じる可能性があります。これらの要因により、コードのテストと保守が困難になります。また、診断するのが難しいバグにつながる可能性もあります。

修正方法

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

  • データまたはコードをカプセル化およびモジュール化して独立したものにします。

  • 関数の間での通信には、グローバル変数や静的変数ではなく、ローカル変数を使用します。

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

すべて展開する


void foo(void){//Noncompliant
	
	static int a;
	static int b;
	static int c;
	static int d;
	static int e;
	static int f;
	static int g;
	//...
}

この例では、関数 foo が指定されたしきい値 5 を超える、7 つのローカルの静的変数を使用しています。Polyspace は、この関数にフラグを設定します。

修正 — 関連するデータをカプセル化

1 つの修正方法として、関連するデータを構造体またはクラスにカプセル化します。このコードでは、関連する整数変数を構造体にカプセル化しています。これにより、関数 foo には構造体の静的コピーが 1 つだけ含まれるようになります。


typedef struct {
	int a;
	int b;
	int c;
	int d;
	int e;
	int f;
	int g;
} data_vars;
void foo(void){//Compliant
	
	static data_vars A;
	//...
}

チェック情報

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

バージョン履歴

R2021a で導入