Aikido

Erişilemeyen ölü kodlar nasıl tespit edilir ve kaldırılır

Okunabilirlik

Kural
Erişilemeyen ölü kodu kaldırın
Erişilemeyen kod kafa karıştırıcıdır, test
edilemezdir ve kaldırılmalıdır.

Desteklenen diller: 45+

Giriş

Erişilemeyen kod, kod tabanınızdaki bozuk mantığın işaretidir. Şuradan sonra gelen kodlar return veya throw deyimleri çalıştırılmak üzere yazılmış ancak asla çalışmamaktadır. Her zaman false veren koşullar, asla tetiklenmeyen doğrulama veya hata yönetimini gizler. Kontrol akışı nedeniyle mantığın asla ulaşamadığı dallar, çalıştırılamayan işlevsellik barındırır. Erişilemeyen kod bulduğunuzda, kodunuzun amaçlandığı gibi çalışmadığı bir hata bulmuş olursunuz.

Neden önemli?

Güvenlik açıkları: Erişilemeyen güvenlik kontrolleri uygulamanızı korumaz. Kimlik doğrulama (authentication), yetkilendirme (authorization) veya girdi doğrulama (input validation) bir return deyiminden sonra yer alıyorsa kodunuz güvenli görünür ancak güvenli değildir. Saldırganlar, güvenlik önlemlerine sahip gibi görünen ancak aslında bunları by-pass eden fonksiyonları istismar edebilir. Kod incelemesi (code review), güvenlik mantığı kod tabanında mevcut olduğu ancak hiçbir zaman çalıştırılmadığı için bu açıkları gözden kaçırabilir.

Prod ortamındaki mantık hataları: Ölü kod, fonksiyonunuzun düşündüğünüz mantığı uygulamadığı anlamına gelir. Asla çalışmayan doğrulama, geçersiz verilerin geçmesine izin verir. Erişilemeyen hata yönetimi, hataların yakalanmadan yayılmasına neden olur. Atlanan iş kuralları yanlış sonuçlar üretir. Kod doğru görünür ancak amaçlandığından farklı davranır. Test boşlukları: Erişilemeyen kod test edilemez. Kritik kod erişilemez durumda olmasına rağmen test paketiniz başarılı oluyorsa bu, söz konusu yolları kapsayan testleriniz olmadığını gösterir. Erişilemeyen kod, önemli mantığın bulunduğu ancak çalıştırıldığını doğrulayan testlerin bulunmadığı test kapsamındaki boşlukları ortaya çıkarır.

Bundle boyutu etkisi: Erişilemeyen kod, JavaScript bundle'ınızda ölü ağırlık olarak kullanıcılara gönderilmeye devam eder. Kullanıcılar asla çalışmayan kodu indirir ve ayrıştırır, ancak bu, ölü kodun işaret ettiği mantık hatalarının ikincil bir etkisidir.

Kod örnekleri

❌ Kural dışı:

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' };
    }
}

Neden yanlış: Dolandırıcılık tespiti mantığı asla çalışmaz çünkü fonksiyon bu noktaya ulaşmadan önce return eder. Tutar kontrolünden sonraki şüpheli etkinlik günlüğü de asla yürütülmez. Bu fonksiyon güvenlik önlemlerine sahip gibi görünüyor ancak aslında tüm transferleri dolandırıcılık kontrolü olmadan işliyor.

✅ Kurallara uygun:

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' };
}

Neden önemli: Tüm güvenlik kontrolleri transfer işlenmeden önce çalışır. Dolandırıcılık tespiti her işlemde çalışır. Şüpheli etkinlikler günlüğe kaydedilir. Fonksiyon sahip gibi göründüğü güvenlik mantığını uygular.

Sonuç

Erişilemeyen kod; amaçlanan işlevselliğin asla yürütülmediği mantık hatalarını gösterir. CI hattınızdaki statik analiz araçlarıyla bunu tespit edin ve yalnızca bir kod temizliği olarak değil, kritik bir sorun olarak ele alının. Erişilemeyen kod keşfettiğinizde, bunun neden var olduğunu ve hangi mantığın çalışması gerekirken çalışmadığını araştırın.

Sık Sorulan Sorular

Sorularınız mı var?

Büyük kod tabanlarında erişilemeyen kodu nasıl tespit edebilirim?

Statik analiz araçları, return veya throw deyimlerinden sonraki kod gibi bariz durumları tespit edebilir. Daha karmaşık durumlar için test sırasında kod kapsamı (code coverage) araçlarını kullanın. Tüm test çalıştırmalarında sıfır kapsam gösteren kod erişilemeyen türden olabilir. Bazı kodlar erişilebilir olup sadece test edilmemiş olabileceğinden her durumu manuel olarak inceleyin.

Try-catch bloklarındaki erken return'lerden sonraki kodlar ne olacak?

Try bloğunda yer alan ancak finally'den önce gelen return sonrası kodlara erişilemez. Ancak finally blokları, return'lerden sonra bile her zaman çalışır. Sık yapılan bir hata: Önemli temizlik işlemlerini (cleanup), gerçekten çalışacağı finally bloğu yerine try bloğunda return'den sonraya yerleştirmektir.

Ulaşılamaz kodlar çalışma zamanı (runtime) hatalarına neden olabilir mi?

Hayır, çünkü asla yürütülmezler. Ancak, hata üretmeden tanımlanmamış değişkenlere başvurabilir veya var olmayan fonksiyonları çağırabilirler; bu da onları daha da sinsi yapar. Bu bozuk kod asla çalışmadığı için tüm testlerden geçer, ancak kod tabanını okuyan herkesi yanıltır.

Peki ya özellik bayrakları (feature flags) ve koşullu derleme?

Devre dışı bırakılmış özellik bayraklarının arkasındaki kod, mevcut ortamınızda devre dışı bırakılmış olsa bile çalışma zamanında ulaşılabilirdir. Gerçek ulaşılamaz kodun akış kontrolü nedeniyle yürütülmesi yapısal olarak imkansızdır. Özellik bayraklı kod ise koşullu olarak ulaşılabilirdir ve özellik tamamen kaldırılana kadar kalmalıdır.

Kullanılmayan fonksiyonları ve import'ları kaldırmalı mıyım?

Evet, ancak bu farklı bir ölü kod (dead code) kategorisidir. Ulaşılamaz kod, akış kontrolü nedeniyle yapısal olarak yürütülemez durumdadır. Kullanılmayan fonksiyonlar ise ulaşılabilirdir ancak asla çağrılmazlar. Her ikisinin de kaldırılması gerekir, ancak farklı tespit stratejileri gerektirirler. Kullanılmayan kod tespiti bütünsel program analizi (whole-program analysis) gerektirirken, ulaşılamaz kod tespiti fonksiyon seviyesinde çalışır.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.