メインコンテンツ

未使用のパラメーター

関数プロトタイプに、関数本体で読み取りも書き込みもされないパラメーターがある

説明

この欠陥は、関数パラメーターが関数本体で読み取りも書き込みもされない場合に発生します。チェッカーは、本体が空の関数内の未使用パラメーターにはフラグを設定しません。

リスク

未使用のパラメーターがあるということは、コードが不完全である可能性を示しています。パラメーターは、コーディングし忘れた操作用に想定されていた可能性があります。

コピーされたオブジェクトが大きいと、冗長なコピーによりパフォーマンスが低下する可能性がある。

修正方法

そのパラメーターは使用が意図されたものかどうかを判断します。意図されていない場合は、関数本体で使用されないパラメーターを削除します。

未使用のパラメーターを意図的に設けることもあります。たとえば、後で関数を機能拡張する際の使用が想定されたパラメーターを設けます。後日の使用が想定されている旨のコード コメントを追加してください。そのコード コメントは、作成者やコード レビュー担当者にとって、関数に未使用のパラメーターがある理由を理解するのに役立ちます。

あるいは、関数本体に (void)var; などのステートメントを追加します。var は未使用のパラメーターです。このステートメントへと拡張されたマクロを定義して、そのマクロを関数本体に追加することができます。

すべて展開する

void func(int* xptr, int* yptr, int flag) {
    if(flag==1) {
        *xptr=0;
    }
    else {
        *xptr=1;
    }
}

int main() {
    int x,y;
    func(&x,&y,1);
    return 0;
}

この例では、パラメーター yptrfunc の本体で使用されていません。

修正 — パラメーターを使用

1 つの修正方法として、そのパラメーターの使用が想定されていたかどうかをチェックします。そのパラメーターの使用が想定されていた場合は、コードを修正します。

void func(int* xptr, int* yptr, int flag) {
    if(flag==1) {
        *xptr=0;
        *yptr=1;
    }
    else {
        *xptr=1;
        *yptr=0;
    }
}

int main() {
    int x,y;
    func(&x,&y,1);
    return 0;
}
修正 — 未使用のパラメーターであることを明示

別の修正方法として、未使用のパラメーターについて認識していることを明示します。

#define UNUSED(x) (void)x

void func(int* xptr, int* yptr, int flag) {
    UNUSED(yptr);
    if(flag==1) {
        *xptr=0;
    }
    else {
        *xptr=1;
    }
}

int main() {
    int x,y;
    func(&x,&y,1);
    return 0;
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: UNUSED_PARAMETER
影響度: Low

バージョン履歴

R2015b で導入