【C言語】
デッドコードには冗長コードと到達不能コードの2種類ある

到達不能コード デッドコード 冗長コード

warning: ‘return’ will never be executed

[-Wunreachable-code-return]


■returnは実行されません

#include <stdio.h>
typedef enum    {R,G,B} color;
char    *RGB(color x){
    switch(x){
    case R:
        return  "赤";
        break;
    case G:
        return  "緑";
        break;
    case B:
        break;
        return  "青";//バグ
    }
    return  "予期しない値";
}
int main(void){
    printf("%s\n",RGB(B));
}

breakとreturnの順番を間違えています。


■同じ比較を2回

(warning) Identical condition ‘x==1’, second condition is always false

警告:同じ比較をしているので2番目の比較は常に偽になる[(warning)identicalConditionAfterEarlyExit]

#include <stdio.h>
typedef enum    {R,G,B} color;
char    *RGB(color x){
    if(x == R){
        return  "赤";
    }
    if(x == R){
        return  "緑";
    }
    if(x == B){
        return  "青";
    }
    return  "予期しない値";
}
int main(void){
    printf("%s\n",RGB(G));
}

if(x == R)の比較を2回行っています。
1回目のif文が成立するとreturn するので、
2回目のif文が成立する事はありません。


■両辺同じif(p->x!=0 && p->x!=0)

warning: self-comparison always evaluates to true

[-Wtautological-compare]
警告:両辺同じ物の比較は常に真になる

#include <stdio.h>
#include <stdbool.h>
typedef struct {
    int     Low;
    int     High;
} tag ;
bool same(tag data1, tag data2){
  return (data1.Low  == data2.Low) &&
         (data2.High == data2.High);
}
int main(void){
  tag   data1 = {0,123};
  tag   data2 = {0,456};
  if(same(data1,data2)){
    puts("同じ");
  }
}

論理演算子の両辺が同じなので
条件式に意味がありません。


■then節とelse節が同じ

warning: this condition has identical branches

警告:then節とelse節が同じ
[-Wduplicated-branches]

#include <stdio.h>
char *samediff(int x,int y){
    static char  ans[128];
    if(x == y){
        sprintf(ans,"%dと%dは同じ",x,y);
        return  ans;
    } else {
        sprintf(ans,"%dと%dは同じ",x,y);//バグ
        return  ans;
    }
}
int main(void){
    printf("%s\n",samediff(1,2));
}

then節とelse節が同じなのでif文の意味がありません。
この問題はthen節をコピーしてelse 節を作り、
else節の変更を忘れた時等に発生します。


■同一変数に上書き代入

(style): Variable ‘ret’ is reassigned a value before the old one has been used.

(スタイル):変数’ret’は古い値が使用される前に再設定された。
[(style)redundantAssignment]

extern int Sin(void),Cos(void);
int f1(void){
    int ret = 0; 
    ret = Sin() ;//警告されない
    return  ret ;
}
int f2(void) {
    int  ret;
    ret = 0 ; 
    ret = Sin() ;//警告されない
    return  ret ;
}
int f3(void) {
    int  ret ;
    ret = Sin() ; 
    ret = Cos() ;//★警告される
    return  ret ;
}

この cppcheck の警告は3行目、9行目のような
とりあえず0で初期化した変数に再設定しても警告は出ません。


16行目のようにretを上書きして何のためにSin()関数を呼んだのか不明なものだけ警告してくれます。

参考:

MSC07-C. デッドコードを検出して削除する