【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)

設定後未使用変数 Set but not used

warning: variable ‘x’ set but not used

警告:変数 ‘x’ は設定されたが未使用
[-Wunused-but-set-variable]

■コピペミスで設定後未使用

#include <stdio.h>
int abVScd(int a,int b,int c,int d) {
    int ret1;
    int ret2;     
    
    ret1 = a+b;
    if(ret1 < 0) {
        return  -1;
    }
    
    ret2 = c+d;
    if(ret1 < 0) {//文脈から ret2 の間違い(コピペミス)
        return  -1;
    }
    
    return  (a+b) < (c+d);
}
int main(void) {
    printf("%d\n",abVScd(1,2,3,4));
}

設定後未使用の問題は、
コピペの後で変数名を修正し忘れると発生しやすいです。
このプログラムは ret1 を ret2 に修正し忘れた例です。


■別変数に設定後未使用

#include <stdio.h>
int x_plus_y(int x,int y){
    int ret = 0 ;
    if(x && y){
        int ret;
        ret = x+y;//この ret と外の ret は別物
    }
    return  ret ;
}
int main(void){
    printf("%d\n",x_plus_y(1,2));//3を期待する
}

3行目の ret と
5行目の ret は別物なので、
6行目で ret を設定しても未使用となります。


■デッドコードで設定後未使用

#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 を使用していないので
何のための処理だったのか読み手にわかりません。
変数を使い忘れたデッドコードの可能性があります。

特に字下げの深い所で変数の値設定して
設定後未使用の警告が出る場合、
ソースコードが荒れている事を示唆しています。


■対策!変数は少ない方がいい

#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;
}