Java, int veya uzun ilkel türler için tamsayı taşması ile hiçbir şey yapmaz ve pozitif ve negatif tamsayılarla taşmayı yok sayar.
Bu cevap ilk önce tamsayı taşmasını açıklar, ifade değerlendirmesindeki ara değerlerle bile bunun nasıl olabileceğine bir örnek verir ve daha sonra tamsayı taşmasını önlemek ve tespit etmek için ayrıntılı teknikler veren kaynaklara bağlantılar verir.
Tamsayı aritmetiği ve beklenmedik veya algılanmayan taşma ile sonuçlanan ifadeler yaygın bir programlama hatasıdır. Beklenmeyen veya algılanmayan tamsayı taşması, özellikle dizi, yığın ve liste nesnelerini etkilediğinden, iyi bilinen bir kullanılabilir güvenlik sorunudur.
Taşma, pozitif veya negatif değerin söz konusu ilkel tip için maksimum veya minimum değerlerin üzerinde olacağı bir pozitif veya negatif yönde meydana gelebilir. Taşma, ifade veya işlem değerlendirmesi sırasında bir ara değerde meydana gelebilir ve nihai değerin aralık içinde olması beklenen bir ifade veya işlemin sonucunu etkileyebilir.
Bazen negatif taşmaya yanlışlıkla taşma denir. Düşük değer, bir değerin, gösterimin izin verdiğinden sıfıra yakın olması durumunda gerçekleşir. Yetersiz akış tamsayı aritmetiğinde gerçekleşir ve beklenir. Tamsayı yetersizliği, bir tamsayı değerlendirmesi -1 ile 0 veya 0 ile 1 arasında olduğunda gerçekleşir. Kesirli sonuç 0'a düşer. Bu normaldir ve tamsayı aritmetiği ile beklenir ve hata olarak kabul edilmez. Ancak, kodun bir istisna atmasına neden olabilir. Tamsayı taşması sonucu bir ifadede bölen olarak kullanılıyorsa, bir örnek "ArithmeticException: / sıfıra" istisnasıdır.
Aşağıdaki kodu göz önünde bulundurun:
int bigValue = Integer.MAX_VALUE;
int x = bigValue * 2 / 5;
int y = bigValue / x;
bu da x'in 0'a atanmasıyla sonuçlanır ve daha sonra bigValue / x değerinin değerlendirilmesi, y değerine 2 atanması yerine "ArithmeticException: / sıfıra" (yani sıfıra böl) bir istisna atar.
X için beklenen sonuç 858.993.458 olur ve bu da maksimum int değeri 2.147.483.647'den düşüktür. Ancak, Integer.MAX_Value * 2 değerlendirilmesinden elde edilen ara sonuç, maksimum int değerini aşan ve 2s tamamlayıcı tamsayı gösterimine uygun olarak -2 olan 4.294.967.294 olacaktır. Sonraki -2 / 5 değerlendirmesi, x'e atanan 0 olarak değerlendirilir.
X hesaplaması için ifadeyi, değerlendirildiğinde, çarpmadan önce bölen bir ifadeye yeniden düzenleme:
int bigValue = Integer.MAX_VALUE;
int x = bigValue / 5 * 2;
int y = bigValue / x;
sonuç olarak x'in 858.993.458 ve y değerinin 2 atanması beklenir.
BigValue / 5'ten elde edilen ara sonuç 429.496.729'dur ve bu bir int için maksimum değeri aşmaz. 429.496.729 * 2'lik müteakip değerlendirme, bir int için maksimum değeri aşmaz ve beklenen sonuç x'e atanır. Bu durumda y için değerlendirme sıfıra bölünmez. X ve y için değerlendirmeler beklendiği gibi çalışır.
Java tamsayı değerleri 2s tamamlayıcı imzalı tamsayı gösterimine göre saklanır ve davranır. Ortaya çıkan bir değer, maksimum veya minimum tamsayı değerlerinden daha büyük veya daha küçük olduğunda, bunun yerine 2'nin tamamlayıcı tamsayı değeri ortaya çıkar. En sıradan tamsayı aritmetik durumları olan 2s tamamlayıcı davranışını kullanmak için açıkça tasarlanmayan durumlarda, ortaya çıkan 2s tamamlayıcı değeri, yukarıdaki örnekte gösterildiği gibi bir programlama mantığına veya hesaplama hatasına neden olacaktır. Mükemmel bir Wikipedia makalesi, burada 2'nin tamamlayıcı ikili tamsayılarını açıklıyor: Two'nun tamamlayıcısı - Wikipedia
İstenmeyen tamsayı taşmasını önlemek için teknikler vardır. Teknikler, ön koşul testi, sürüm yükseltme ve BigInteger kullanılarak kategorize edilebilir.
Ön koşul testi, aritmetik bir işleme veya ifadeye giren değerlerin, bu değerlerle taşma olmamasını sağlamak için incelenmesini içerir. Programlama ve tasarım, giriş değerlerinin taşmaya neden olmayacağını garanti eden testler yaratmalı ve ardından taşmaya neden olacak giriş değerleri meydana gelirse ne yapılacağını belirlemelidir.
Upcasting, aritmetik işlemi veya ifadeyi gerçekleştirmek için daha büyük bir ilkel tipin kullanılmasını ve daha sonra elde edilen değerin bir tamsayı için maksimum veya minimum değerlerin ötesinde olup olmadığının belirlenmesini içerir. Upcasting ile bile, bir işlem veya ifadedeki değerin veya bazı ara değerin, upcast tipi için maksimum veya minimum değerlerin ötesinde olması ve taşmaya neden olması, bu da algılanmayacak ve beklenmeyen ve istenmeyen sonuçlara neden olacaktır. Analiz veya ön koşullar aracılığıyla, üst sürüm olmadan önleme mümkün veya pratik olmadığında, üst sürüm ile taşmayı önlemek mümkün olabilir. Söz konusu tamsayılar zaten uzun ilkel tipler ise, Java'daki ilkel tiplerle yayın yapmak mümkün değildir.
BigInteger tekniği, BigInteger kullanan kütüphane yöntemlerini kullanarak aritmetik işlem veya ifade için BigInteger'in kullanılmasını içerir. BigInteger taşmıyor. Gerekirse kullanılabilir tüm belleği kullanacaktır. Aritmetik yöntemleri normalde tamsayı işlemlerinden biraz daha az verimlidir. BigInteger kullanan bir sonucun bir tamsayı için maksimum veya minimum değerlerin ötesinde olması mümkündür, ancak sonuca götüren aritmetikte taşma meydana gelmez. Bir BigInteger sonucu istenen ilkel sonuç türü için örneğin int veya long için maksimum veya minimum değerlerin üzerindeyse, programlama ve tasarımın ne yapılacağını belirlemesi gerekecektir.
Carnegie Mellon Yazılım Mühendisliği Enstitüsü'nün CERT programı ve Oracle, güvenli Java programlama için bir dizi standart oluşturdu. Standartlara, tamsayı taşmasını önleme ve tespit etme teknikleri dahildir. Standart, burada kolayca erişilebilen bir çevrimiçi kaynak olarak yayınlanmıştır: Java için CERT Oracle Güvenli Kodlama Standardı
Tamsayı taşmasını önlemek veya tespit etmek için kodlama tekniklerinin pratik örneklerini tanımlayan ve içeren standardın bölümü burada: NUM00-J. Tamsayı taşmasını algılama veya önleme
Java için CERT Oracle Güvenli Kodlama Standardı'nın kitap formu ve PDF formu da mevcuttur.