UNREACH.GEN

到達不能コード

UNREACH.GEN チェッカーは、コードで到達不能ステートメント、つまり、決して実行されないコードを探します。到達不能コードは通常は論理エラーの結果であり、プログラムまたはその予期される実行時環境のライフサイクルの変更によって引き起こされることがよくあります。

脆弱性とリスク

到達不能コードは、記述されたコードとその設計意図との不一致により、意図しないプログラム動作を引き起こす可能性があります。到達不能コードは、コードのメンテナンスやレビュー時に混乱を引き起こすこともあります。斬新なケースでは、到達不能コードが特定のリソースやコードブランチの保護を担当している場合、その到達不能コードが存在することにより、コードの脆弱性につながる可能性があります。

UNREACH.GEN のインスタンスについてフラグを立てられたコードを修正するための推奨案を提示するのは困難です。これは、コードがエラーのために到達不能である場合があったり、または単に開発者がコードをできるだけ安全に記述することを望み、実際には到達不能な追加コードを追加したためです。

脆弱コード例 1

コピー
    extern void exit(int);
    int stub();

    int demo_return_or_exit(int t) {
        if (t > 0) {
            return t + 1;
        } else {
            exit(22);
        }
       stub(); 
       return t + 3;
    }

この例では、Klocwork は到達不能コードレポートを生成し、10 行目での 'stub()' 関数の呼び出しが到達不能であることを示します。この関数は、先行する if/else ステートメントのパスすべてによって終了させられます。到達不能コードが冗長である場合、削除してもかまいません。あるいは、先行する終了ステートメントが誤配置されている場合、削除するか条件付きステートメント内に配置することができます。

脆弱コード例 2

コピー
    extern void exit(int);
    int stub();
    
    int demo_infeasible_if(int t) {
        if (t > 0) {
            if (t == 0) {
                stub(); // <== unreachable
            }
        }
       return t - 1;
    }

この場合、Klocwork は到達不能コードレポートを生成し、7 行目での 'stub()' 関数の呼び出しが、条件が実行可能でないパスで発生する ('t' が 0 より大きいパスで 't' が 0 に等しくなることは決してありません) ので、到達不能であることを示します。この問題を解決するため、不可能性チェックとそれ以降の到達不能コードが冗長である場合、それらを削除することができます。あるいは、不正確なパス条件があれば、変更します。

関連チェッカー

拡張機能

このチェッカーは機能を拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。