
warning: Value stored to ‘x’ is never read
警告:’x’に格納された値が読み出されない
[clang-analyzer-deadcode.DeadStores]
■1.return x++ の後置演算子がデッドコード
#include <stdio.h>
int 前置演算子(int x){
return ++x; //OK
}
int 後置演算子(int x){
return x++; //NG:意味なし++
}
int main(void){
printf("%d\n",前置演算子(1)) ;//2と表示される
printf("%d\n",後置演算子(1)) ;//1と表示される
}
自動変数 x を return 時に後置演算で ++ しても、
もはや誰も参照できないので 後置演算++ に意味がありません。
++ した値を return したいのであれば
2行に分けるか、
前置演算子を使いましょう
■2.if((x == 0) || (x != 0 && y != 0))冗長条件
(style) Redundant condition:x!=0.
‘x==0 || (x!=0 && y!=0)’ is equivalent to
‘x==0 || y!=0’
[(style)redundantCondition]
// cppcheck --enable=all
int f1(int x,int y) {
if((x == 0) || (x != 0 && y != 0))//NG
return 1;
return 0;
}
‘x==0 || (x!=0 && y!=0)’ は
‘x==0 || y!=0’と同じです。
第1条件が成立した時は
第2条件はもう判定する必要がありません。
これを論理演算子の「ショートサーキット」動作と言います。
第1条件が成立しなかった時、x!=0が確定しているので
第2条件でx!=0を判定する必要がありません。

●修正後:if((x == 0) || (y != 0))
int f2(int x,int y) {
if((x == 0) || (y != 0))//OK
return 1;
return 0;
}
参考:
EXP02-C. 論理 AND 演算子および論理 OR 演算子のショートサーキット動作について注意する
https://www.jpcert.or.jp/sc-rules/c-exp02-c.html