Aikido

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

Okunabilirlik

Kural
Ulaşılamayan ölü kodu kaldırın
Ulaşılamayan 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 ifadelerinden sonra gelen kod gibi bariz durumları tespit eder. Karmaşık durumlar için test aşamasında kod kapsamı (code coverage) araçlarını kullanın. Kapsamlı test suitleri genelinde sıfır kapsam gösteren kod muhtemelen ulaşılamaz durumdadır; ancak yalnızca test edilmemiş olabileceğinden bunu manuel olarak doğrulamalısınız.

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

Bir try bloğunda return ifadesinden sonra gelen ancak finally bloğundan önce yer alan kodlara ulaşılamaz. Finally bloğu, return işlemlerinden sonra bile her zaman çalışır. Yaygın görülen bir hata, temizleme (cleanup) kodunu finally bloğu içinde gerçekten çalışacağı yer yerine, try bloğunda return ifadesinden sonraya yerleştirmektir.

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

Ulaşılamayan kodun kendisi BİR hatadır. Bu durum, çalışması gereken kritik mantığın (logic) yürütülmediği anlamına gelir. Ulaşılamayan kodunuz doğrulama, güvenlik kontrolleri veya hata yönetimi içeriyorsa, fonksiyonunuz istisna (exception) fırlatmasa bile bozuktur. Buradaki hata, ulaşılamayan kodun çökmesine yol açması değil, hedeflenen işlevselliğin asla çalışmamasıdır.

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

Devre dışı bırakılmış özellik bayraklarının (feature flags) arkasındaki kod, ortamınızda devre dışı bırakılmış olsa bile çalışma zamanında (runtime) hâlâ ulaşılebilirdir. Gerçek anlamda ulaşılamayan kod, kontrol akışı (control flow) nedeniyle yapısal olarak yürütülmesi imkansız olan koddur. Özellik bayrağına bağlı kodlar ise koşullu olarak ulaşılebilirdir ve siz o özelliği tamamen kaldırana kadar kalmalıdır.

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

Evet, ancak bu farklı bir sorundur. Ulaşılamayan kod, kontrol akışı nedeniyle fonksiyonu içinde yapısal olarak çalıştırılamaz durumdadır. Kullanılmayan fonksiyonlar ise çağrılabilir ancak hiçbir zaman çağrılmazlar. Her ikisi de kaynak israfına yol açar ancak farklı tespit stratejileri gerektirirler. Ulaşılamayan kod tespiti fonksiyon düzeyinde çalışırken, kullanılmayan kod tespiti tüm programın analiz edilmesini gerektirir.

Ş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.