Aikido

到達不能なデッドコードを特定して削除する方法

可読性

ルール
到達不能な デッドコードを 削除する 
到達不能な コードは混乱を招き、 テスト不可能であるため、 削除すべきです。 

対応言語: 45+

はじめに

到達不能コードは、コードベースのロジックが壊れていることを示します。その後のコード return または スロー ステートメントは実行されるように書かれているにもかかわらず、決して実行されません。常に偽となる条件は、決してトリガーされない検証やエラー処理を隠しています。制御フローによってロジックが到達しないブランチには、実行できない機能が含まれています。到達不能なコードを発見した場合、それはコードが意図したとおりに機能していないバグを見つけたことになります。

なぜ重要なのか

セキュリティ脆弱性: 到達不能なセキュリティチェックは、アプリケーションを保護しません。認証、認可、または入力バリデーションがその後に現れる場合 return ステートメントでは、コードは安全に見えますが、実際はそうではありません。攻撃者は、セキュリティ対策があるように見えるが実際にはそれらをバイパスする関数をエクスプロイトできます。コードレビューでは、セキュリティロジックがコードベースに存在しても実行されないため、これらの脆弱性を見逃す可能性があります。

本番環境でのロジックバグ: デッドコードは、関数が意図したロジックを実装していないことを意味します。実行されないバリデーションは、無効なデータを通過させてしまいます。到達不能なエラーハンドリングは、エラーが捕捉されずに伝播することを意味します。バイパスされるビジネスルールは、誤った結果を生み出します。コードは正しく見えますが、意図とは異なる動作をします。テストのギャップ: 到達不能なコードはテストできません。重要なコードが到達不能であるにもかかわらずテストスイートがパスする場合、それはそれらのパスをカバーするテストがないことを意味します。到達不能なコードは、重要なロジックが存在するにもかかわらず、その実行を検証するテストがないテストカバレッジのギャップを明らかにします。

バンドルサイズへの影響: 到達不能なコードは、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の後に配置することです。

到達不能なコードはランタイムエラーを引き起こす可能性がありますか?

いいえ、それは決して実行されないからです。しかし、未定義の変数を参照したり、存在しない関数を呼び出したりしてもエラーを引き起こさないため、さらに悪質です。この壊れたコードは実行されないためすべてのテストに合格しますが、コードベースを読む人を誤解させます。

フィーチャーフラグと条件付きコンパイルについてはどうですか?

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

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

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

今すぐ、安全な環境へ。

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

クレジットカードは不要です | スキャン結果は32秒で表示されます。