Aikido

Bölme işlemlerini gerçekleştirmeden önce kalansız böleni (divisor) neden kontrol etmelisiniz?

Okunabilirlik

Kural
Bölme işlemlerinden önce böleni kontrol edin.
Sıfıra bölme işlemi çalışma zamanı hatalarına yol açar ve
açık kontrollerle önlenmelidir.

Desteklenen diller: 45+

Giriş

Sıfıra bölme, çoğu dilde anlık çalışma zamanı hatalarına neden olarak uygulamaların zarif bir şekilde kapanmasına (graceful degradation) izin vermeden çökmesine yol açar. Kullanıcı girdileri, hesaplanan değerler veya veritabanı sonuçları beklenmeyen bir şekilde sıfır bölenler üretebilir. Sınır durum (edge case) verileri hatayı tetiklediğinde, kontrol edilmeyen tek bir bölme işlemi bile prod ortamındaki servisleri çökletebilir.

Neden önemli?

Sistem kararlılığı: Sıfıra bölme; Java, C ve Python gibi dillerde uygulamanın aniden çökmesine neden olabilir. Prod ortamında bu durum; düşen istekler, kesintiye uğrayan işlemler ve hizmet dışı kalan servisler anlamına gelir. Sıfıra bölme işleminin Sonsuzluk veya NaNdöndürdüğü JavaScript'te bile bu değerler hesaplamalar boyunca yayrılarak yanlış sonuçlara yol açar.

Veri bütünlüğü: Toplu işlem (batch processing) veya veri hatları sırasında bölme hataları meydana geldiğinde, çökme öncesinde kısmi sonuçlar yazılabilir. Bu durum verileri tutarsız durumlarda bırakarak manuel kurtarma gerektirir ve eksik verilere bağımlı olan alt sistemleri potansiyel olarak bozar.

Saldırı yüzeyi: Saldırganlar, servisleri çökertmek amacıyla sıfır bölen üreten girdileri kasıtlı olarak oluşturabilir. Bölenleri doğrulamadan hesaplamalar gerçekleştiren API uç noktaları birer hizmet engkleme (DoS) vektörüne dönüşür. Tek bir kötü amaçlı istek bile tüm servisi erişilemez hale getirebilir.

Kod örnekleri

❌ Kural dışı:

function calculateAverageOrderValue(totalRevenue, orderCount) {
    return totalRevenue / orderCount;
}

function calculateConversionRate(conversions, visitors) {
    return (conversions / visitors) * 100;
}

Neden yanlış: Her iki fonksiyon da bölen sıfır olduğunda çöker. calculateAverageOrderValue() değeri orderCount 0 olduğunda hata verir ve calculateConversionRate() değeri visitors değeri 0'dır. Bu senaryolar oldukça gerçeğe uygundur: yeni işletmelerin hiç siparişi olmayabilir, kampanyaların hiç ziyaretçisi olmayabilir.

✅ Kurallara uygun:

function calculateAverageOrderValue(totalRevenue, orderCount) {
    if (orderCount === 0) {
        return 0;
    }
    return totalRevenue / orderCount;
}

function calculateConversionRate(conversions, visitors) {
    if (visitors === 0) {
        return 0;
    }
    return (conversions / visitors) * 100;
}

Neden önemli?: Açık kontroller, sıfıra bölme çökmelerini engeller. Bölme işleminin mümkün olmadığı durumlarda fonksiyonlar mantıklı varsayılan değerler (sıfır) döndürür. Uygulama, uç durum girdilerinde bile çalışmaya devam ederek kararlılığını ve erişilebilirliğini korur.

Sonuç

Bölme işlemlerinden önce her zaman bölenleri doğrulayın. İş mantığınıza bağlı olarak uygun varsayılan değerler döndürün, açıklayıcı hatalar fırlatın veya sıfır durumunu ele alın. Özellikle kullanıcı girdileri veya harici veriler söz konusu olduğunda, bölenlerin asla sıfır olmayacağını varsaymayın.

Sık Sorulan Sorular

Sorularınız mı var?

Negatif sıfır veya kayan noktalı sayı (floating point) uç durumları için kontrol yapmalı mıyım?

JavaScript'te -0 === 0 ifadesi true değerini döndürür; bu nedenle tek bir kontrol her iki durumu da yönetebilir. JavaScript, uygulamanın çökmesi yerine Infinity veya NaN döndürdüğünden, uygulamanız hassas sayısal hesaplamalar gerektiriyorsa sonuçta bunları da kontrol etmelisiniz: if (!isFinite(result)). Bazı alanlar, kayan noktalı sayı aritmetiğinde hassasiyet kaybını önlemek için bölen büyüklüğünü (sıfıra yakın çok küçük sayıları) kontrol etmeyi gerektirir.

Çökme yerine Infinity döndüren diller hakkında ne söylenebilir?

JavaScript, sıfıra bölme durumunda hata değil Infinity döndürür. Ancak Infinity, hesaplamalar boyunca yayılarak beklenmeyen sonuçlar üretir. Sıfır bölenleri Infinity davranışına güvenmek yerine açıkça kontrol edin ve uygun şekilde yönetin.

Veritabanı sorgularında bölme işlemini nasıl yönetirim?

Veritabanı davranışı değişiklik gösterir: PostgreSQL sıfıra bölmede hata fırlatırken, MySQL varsayılan olarak NULL döndürür. Veritabanları arasında güvenilirlik için NULLIF kullanın: SELECT total / NULLIF(count, 0) ifadesi hata yerine NULL döndürür. Veya açık CASE ifadeleri kullanın: CASE WHEN count = 0 THEN 0 ELSE total / count END. Veritabanı düzeyindeki kontroller, belirli veritabanı davranışından bağımsız olarak sorunları önler.

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