warning: variable ‘r2’ set but not used
警告:変数 ‘r2’ は設定されたが未使用
[-Wunused-but-set-variable]
■1.コピペミスの可能性
int f1(int a,int b,int c,int d)
{
int r1,r2;
r1 = a+b;
if(0 == r1) {
return 1;
}
r2 = c+d;
if(0 == r1) {//文脈から r2 の間違い(コピペミス)
return 1;
}
return 0;
}
int main(void)
{
return f1(1,2,3,4);
}
設定後未使用の問題は、
コピペの後で変数名を修正し忘れると発生しやすいです。
このプログラムは r1 を r2 に修正し忘れた例です・
特に定数を左に記述するヨーダ記法で記述した場合
主語を読み飛ばして
if(0 == r1) を
「もしゼロならば」と読みがちなので間違いに気づきにくいです。
if(r1 == 0) と自然に記述した場合、
「もしr1がゼロならば」と読めるので間違いに気づきやすいです。
■2.別の有効範囲の変数を見ている可能性
int f2(int x,int y)
{
int ret = 0 ;
if(x){
int ret;
ret = x+y;//ダメこの ret と外の ret は別物
}
return ret ;
}
3行目の ret と
5行目の ret は別物なので、
6行目で ret を設定しても未使用となります。
■3.デッドコードの可能性
#include <stdio.h>
//体積を求める
int get_volume(int x,int y,int z){
int volume=0;
int ret = 0 ;
if(x > 0){
if(y > 0){
if(x > 0){
volume = x*y*z ;//求めた体積を使っていない
} else{
ret = -1;
}
} else{
ret = -1;
}
} else {
ret = -1;
}
return ret;
}
int main(void) {
printf("体積 = %d\n",get_volume(2,3,4));
return 0;
}
変数 volume を使用していないので
何のための処理だったのか読み手にわかりません。
変数を使い忘れたデッドコードの可能性があります。
特に字下げの深い所で変数の値設定して
設定後未使用の警告が出る場合、
ソースコードが荒れている事を示唆しています。
■4.対策(変数は少ない方がいい)
#include <stdio.h>
//体積を求める
int get_volume(int x,int y,int z){
if(x <= 0)
return -1;
if(y <= 0)
return -1;
if(z <= 0)
return -1;
return x*y*z ;
}
int main(void) {
printf("体積 = %d\n",get_volume(2,3,4));
return 0;
}