メインコンテンツ

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

CERT C: Rule DCL41-C

switch ステートメント内の最初の case ラベルの前で変数を宣言しない

説明

ルール定義

switch ステートメント内の最初の case ラベルの前で変数を宣言しないようにします。1

Polyspace 実装

ルール チェッカーは、"最初の case ラベルの前の変数宣言" をチェックします。

すべて展開する

問題

この問題は、switch ブロックで最初の case ラベルの前に変数を定義した場合に発生します。

リスク

switch ブロックでは、switch ステートメントの制御式に基づいて、case ラベルのいずれか、または default ラベルに制御がジャンプします。最初の case ラベルの前で変数を定義した場合、その変数宣言はコンパイラで無視されます。この変数を読み取ると、値が不確定になる可能性があります。

例 — 非準拠の変数宣言
void bar(int iTemp){
	//...
}
void foo(){
	//...
	int bFlag;
	//...
	switch(bFlag){
		int temp;  //Noncompliant
		bar (temp);
	case 0:
            //...
		break;
	case 1:
            //...
		break;	
		
	}
	
}

この例では、変数 temp が最初の case ラベルの前で宣言されています。コンパイラはこの宣言を無視します。case ブロックのいずれかで temp に対する読み取り操作を実行すると、値が不確定になる可能性があります。Polyspace® は、この変数宣言にフラグを設定します。

例 — 準拠した switch ステートメント

前述の問題を修正するには、変数宣言を switch ステートメントの外に移動します。

void bar(int iTemp){
	//...
}
void foo(){
	//...
	int bFlag;
	//...
	int temp;//Compliant  
	bar (temp);	
	switch(bFlag){

	case 0://...
		break;
	case 1:
		break;			
	}	
}

チェック情報

グループ: Rule 02.宣言と初期化 (DCL)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.