メインコンテンツ

goto ステートメントの数がしきい値を超えている

関数に含まれる goto ステートメントの数が、定義済みしきい値を超えています

R2021a 以降

説明

この欠陥は、定義済みしきい値を超える数の goto ステートメントが含まれる関数に対して報告されます。Polyspace が goto ステートメントの数を計算する方法について詳しくは、goto ステートメントの数を参照してください。

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

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

リスク

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

  • モジュールの実行フローが過剰に複雑である。

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

複数の goto ステートメントを使用すると、モジュールでのコード実行の正確な順序を判断するのが難しくなります。このような混乱により、バグや誤った結果につながる可能性があります。このようなコードの複雑なデータ フローにより、モジュールの保守とデバッグが困難になります。

修正方法

このチェックを修正するには、チェッカーのしきい値を変更するか、コードをリファクタリングします。使用されている goto ステートメントのほとんどは、よりわかりやすい制御構造で置き換えることができます。goto ステートメントが必要な場合は、それをドキュメント化し、コード内で注釈を使用してチェッカーを正当化します。レガシ コードベースをチェックするときは、このチェックがトリガーされないよう、しきい値を変更することをお勧めします。

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

すべて展開する

#include<stdbool.h>
bool* getCondition();
void foo(){//Noncompliant
	bool* cond;
	cond = getCondition();
	while(*(cond+0)){
		//...
		while(*(cond+1)){
			//...
			while(*(cond+2)){
				//...
				if(*(cond+3)){
				goto HARDBREAK;
				}
			}
		}
	}
HARDBREAK:
		;
		//....
		return;
}

この例では、深く入れ子になった制御構造に含まれる実行フローを条件付きで抜き出すために goto ステートメントが使用されています。関数に含まれる goto ステートメントの数が、定義された既定のしきい値である 0 を超えているため、Polyspace はこの関数にフラグを設定します。

修正 — コードをリファクタリングするか、しきい値を変更

1 つの修正方法として、コードをリファクタリングして、goto ステートメントがコードに含まれないようにします。たとえば、深く入れ子になった構造から抜け出すために、return ステートメントを使用できます。

#include<stdbool.h>
bool* getCondition();
void foo(){//Compliant
	bool* cond;
	cond = getCondition();
	while(*(cond+0)){
		//...
		while(*(cond+1)){
			//...
			while(*(cond+2)){
				//...
				if(*(cond+3)){
				return;
				}
			}
		}
	}

}

あるいは、goto のこのインスタンスを許容可能と見なす場合もあります。その場合は、チェックを解決するようにチェッカー選択 XML ファイルを変更して、しきい値を変更します。

チェック情報

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

バージョン履歴

R2021a で導入