Aikido

到達不能なデッドコードの特定と除去方法

読みやすさ

ルール
削除 到達不能 デッド コード
到達不能 コード  混乱を招く、 テスト不可能であり、
そして すべき 取り除かれるべきである 削除されるべきである。

サポート言語: 45+

はじめに

到達不能なコードは、コードベース内の論理的欠陥を示します。 戻る または 投げる 実行されるために記述されたが、決して実行されないステートメントがある。常に偽となる条件は、決して発動しない検証やエラー処理を隠している。制御フローによって論理が到達しない分岐には、実行不可能な機能が含まれている。到達不可能なコードを見つけたとき、それはコードが意図した動作をしていないバグを発見したことになる。

なぜそれが重要なのか

セキュリティ上の脆弱性: 到達不可能なセキュリティチェックはアプリケーションを保護しません。認証、認可、または入力検証が 戻る あなたのコードは一見安全に見えますが、実際にはそうではありません。攻撃者は、セキュリティ対策があるように見えるが実際にはそれを回避する機能を悪用できます。コードレビューではこれらの脆弱性を見逃す可能性があります。なぜなら、セキュリティロジックはコードベースに存在しているものの、実行されることがないからです。

本番環境におけるロジックバグ:デッドコードは、関数が想定したロジックを実装していないことを意味する。実行されない検証は不正なデータを透過させる。到達不可能なエラー処理は、エラーが捕捉されずに伝播することを意味する。 バイパスされたビジネスルールは誤った結果を生む。コードは正しく見えても、意図した動作とは異なる。テストの穴:到達不能なコードはテストできない。重要なコードが到達不能なのにテストスイートが通過する場合、それらのパスをカバーするテストが存在しないことを意味する。到達不能なコードは、重要なロジックが存在するにもかかわらず、その実行を検証するテストがないテストカバレッジの穴を露呈する。

バンドルサイズへの影響:到達不能なコードは、JavaScriptバンドル内のデッドウェイトとしてユーザーに配信され続けます。ユーザーは実行されないコードをダウンロードして解析しますが、これはデッドコードが示すロジック上のバグに比べれば二次的な問題です。

コード例

非準拠:

function transferFunds(fromAccount, toAccount, amount) {
    if (!fromAccount || !toAccount) {
        return { success: false, error: 'Invalid accounts' };
    }

    if (amount <= 0) {
        return { success: false, error: 'Invalid amount' };
        logSuspiciousActivity(fromAccount, amount);
    }

    const balance = getBalance(fromAccount);
    if (balance >= amount) {
        deductFunds(fromAccount, amount);
        addFunds(toAccount, amount);
        return { success: true };
    }

    return { success: false, error: 'Insufficient funds' };

    // Check for fraud patterns
    if (isHighRiskTransaction(fromAccount, toAccount, amount)) {
        notifyFraudTeam(fromAccount, toAccount, amount);
        return { success: false, error: 'Transaction blocked' };
    }
}

誤りの理由:不正検知ロジックは、関数が到達する前に戻ってしまうため、決して実行されません。金額チェック後の不審な活動ログ記録も同様に実行されません。この関数はセキュリティ対策があるように見えますが、実際には不正チェックなしで全ての送金を処理しています。

✅ 準拠:

function transferFunds(fromAccount, toAccount, amount) {
    if (!fromAccount || !toAccount) {
        return { success: false, error: 'Invalid accounts' };
    }

    if (amount <= 0) {
        logSuspiciousActivity(fromAccount, amount);
        return { success: false, error: 'Invalid amount' };
    }

    if (isHighRiskTransaction(fromAccount, toAccount, amount)) {
        notifyFraudTeam(fromAccount, toAccount, amount);
        return { success: false, error: 'Transaction blocked' };
    }

    const balance = getBalance(fromAccount);
    if (balance >= amount) {
        deductFunds(fromAccount, amount);
        addFunds(toAccount, amount);
        return { success: true };
    }

    return { success: false, error: 'Insufficient funds' };
}

これが重要な理由:すべてのセキュリティチェックは送金処理前に実行されます。不正検知はすべての取引で動作します。不審な活動は記録されます。この機能は、見かけ通りセキュリティロジックを実装しています。

結論

到達不能なコードは、意図した機能が実行されないロジックのバグを示します。CIパイプライン内の静的解析ツールでこれを検出し、単なるコードのクリーンアップではなく重大な問題として扱ってください。到達不能なコードを発見したら、その存在理由と、実行されるはずだったロジックがなぜ動作しないのかを調査してください。

よくある質問

ご質問は?

大規模なコードベースにおいて、到達不可能なコードをどのように特定すればよいですか?

静的解析ツールは、return文やthrow文の後のコードなど明らかなケースを検出できます。より複雑なケースについては、テスト中にコードカバレッジツールを使用してください。すべてのテスト実行でカバレッジがゼロのコードは到達不能である可能性があります。一部のコードは到達可能だが単にテストされていないだけの場合もあるため、各ケースを手動でレビューしてください。

try-catchブロック内の早期リターン後のコードはどうなりますか?

tryブロック内のreturn文の直後でfinallyの前にあるコードは実行されない。しかしfinallyブロックはreturn後も常に実行される。よくある間違い:重要なクリーンアップ処理をfinallyではなくtryブロック内のreturn文の直後に配置すること(実際にはfinallyで実行されるべき)。

到達不可能なコードは実行時エラーを引き起こす可能性がありますか?

いいえ、それは決して実行されないからです。しかし、未定義の変数を参照したり、存在しない関数を呼び出したりしてもエラーが発生しないため、さらに悪質です。この欠陥のあるコードは実行されないため全てのテストを通過しますが、コードベースを読む者を誤った方向に導きます。

機能フラグと条件付きコンパイルについてはどうでしょうか?

無効化された機能フラグの背後にあるコードは、現在の環境で無効化されていても実行時に到達可能です。真に到達不可能なコードは、制御フロー上構造的に実行が不可能です。機能フラグ付きコードは条件付きで到達可能であり、機能が完全に削除されるまで残しておく必要があります。

未使用の関数とインポートを削除すべきでしょうか?

はい、しかしそれは別の種類のデッドコードです。到達不能コードは制御フロー上、構造的に実行不可能です。未使用関数は到達可能ですが、決して呼び出されません。どちらも除去すべきですが、異なる検出戦略を必要とします。未使用コードの検出にはプログラム全体の分析が必要ですが、到達不能コードの検出は関数レベルで機能します。

今すぐ安全を確保しましょう

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。