warning: statement will never be executed
警告:宣言時の代入文が実行されることはない
[-Wswitch-unreachable]
■この記事の概要
この記事では、C言語のswitch
文で最初のcase
句より前に書かれた実行文や変数宣言が実行されない問題を解説しています。デッドコードとなる理由や、適切な変数の宣言位置を具体例を交えて説明し、誤った記述によるバグを防ぐための注意点を提案しています。
■最初のcaseの上に色々書いてもデッドコード
#include <stdio.h>
int main(int argc,char *argv[]){
switch(argc){
int i = 1234 ; //変数宣言は有効だが実行はされない
int j; //変数宣言は有効
j = 5678 ; //実行はされない
printf("デバッグ文も実行されない%d:%d\n",i,j);
break;
case 1:
printf("変数は未初期化 %d:%d\n",i,j);
break;
case 2:
printf("変数は未初期化 %d:%d\n",i,j);
break ;
case 3:
printf("変数は未初期化 %d:%d\n",i,j);
break ;
}
}
case 前の変数宣言は可能ですが実行はされません。
このため変数の初期化やデバッグ文は実行はされないので
注意して下さい。
■case文が無くてもコンパイルエラーにならない
#include <stdio.h>
void f1(int x)
{
//コンパイルエラーにならない
switch(x){
}
}
意味の無い記述ですがcase文が無くてもコンパイルエラーになりません。
■到達不能の実行文もコンパイルエラーにならない
void f2(int x)
{
switch(x){
printf("実行されない");
}
}
意味の無い記述ですが実行文を記述できます。
x の値とは無関係に実行はされません。
■変数宣言できるが実行はされない
void f3(int x)
{
switch(x){
int i = 0 ; //変数宣言は有効だが実行はされない
int j; //変数宣言は有効
j = 0 ; //実行はされない
printf("実行されない%d:%d",i,j);
}
}
変数も宣言できますが実行はされません(制御が来ません)。
i = 0
j = 0
printf()
は実行されません。
参考:
DCL41-C. switch 文のなかでは最初の case 句より前で変数宣言しない
https://www.jpcert.or.jp/sc-rules/c-dcl41-c.html