【C言語】
デッドコード(到達不能コード)
if(x!=0){if(x==0){;}}

(warning): Opposite inner ‘if’ condition leads to a dead code block.

警告:矛盾する逆条件はデッドコードになる[(warning)oppositeInnerCondition]


■この記事の概要

この記事では、C言語におけるデッドコード(到達不能コード)の例を取り上げ、典型的なミスを解説しています。矛盾するif条件や無条件breakswitch文の不要なcase句などを例に、デッドコードと防衛的コードの違いを説明。効率的で保守性の高いコードを書くためのアプローチを具体的に示しています。


■デッドコードは2種類ある

2大コーディングルールで微妙に違います。

CERT-Cルールでは
到達不能コードの事。

MISRA-Cルールでは
実行されるが除去されてもプログラムの動作に影響を与えない演算。


■if文が矛盾しているので制御が来ない

#include <stdio.h>
int f(int x)
{
    if(x != 0) {
        if(x == 0){//NG
            return  1;
        }
    }
    return  0;
}

4行目と5行目が矛盾するので
6行目がデッドコードブロックになります。


■無条件breakでfor文更新に制御が来ない

warning: loop will run at most once

警告:ループは最大でも一度しか実行されない
[-Wunreachable-code-loop-increment]

#include    <stdio.h>
int main(void)
{
    for(int i = 0 ;  i < 10 ;  i++ ) {
        printf("%d\n",i);
        //回りたい?、止まりたい? デバッグの残骸? 
        break ;
    }
}

7行目にbreakがあるので、for文第三式 i++ が実行されません。

デバッグ文を書いたり消したりして
残骸として残った可能性がありますが、
保守者には break の意味がわかりません。


■デッドコードと防衛的コード

#include <stdio.h>
int f(int x){
    switch(x%3){
    case    0:  return  0;
    case    1:  return  1;
    case    2:  return  2;
    case    3:  return  3;//NGデッドコード
    case    4:  return  4;//NGデッドコード
    default:    return  5;//OK防衛的コード
    }
}
int main(void){
    for(int i = 0;i<10;i++){
        printf("%d\n",f(i));
    }
}

x%3の演算結果は0,1,2にしかならないので
case 3,case 4は到達不能のデッドコードとなります。

defaultにも制御はきませんがこれは防衛的コードなので
推奨される書き方です。