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秒で表示されます。