Tam sayı taşması, programlamada yaygın bir sorundur. Çoğu programlama dilinde, tam sayı değerleri sabit uzunluktaki bellek içinde depolanır. Tam sayılar, işaretsiz ve işaretli olarak ikiye ayrılır; fark, en yüksek bitin pozitif veya negatif sayıyı göstermek için işaret biti olarak kullanılıp kullanılmadığıdır. Örneğin, 32 bit bellek, 0 ile 4,294,967,295 arasında bir işaretsiz tam sayıyı (uint32) depolayabilir veya -2,147,483,648 ile 2,147,483,647 arasında bir işaretli tam sayıyı (int32) depolayabilir.
Tam sayı türünün temsil edebileceği aralığın dışına çıktığında taşma (overflow) meydana gelir. Çoğu programlama dili bu hatayı kontrol etmez, bunun yerine basit bir mod işlemi yapar veya tanımsız bir davranış sergiler. Bu, programın çalışma sonuçlarının beklenmedik olmasına neden olabilir. Blok zinciri akıllı sözleşmelerinde, özellikle DeFi alanında, tam sayı hesaplamaları oldukça yaygındır, bu nedenle tam sayı taşma açıklarına özel dikkat gösterilmelidir.
Tam Sayı Taşması Tanımı
Tam sayı taşması, iki durumdan oluşur: üst taşma ( overflow ) ve alt taşma ( underflow ).
Taşma: Sonuç, tamsayı türünün maksimum değerini aşar. Örneğin, uint32'nin 0xFFFFFFFF değerine 1 eklenirse 0x00000000 olur.
Aşağı taşma: Sonuç, tam sayı türünün minimum değerinden daha küçük olduğunda meydana gelir. Örneğin, uint32'nin 0'dan 1 çıkarılması 0xFFFFFFFF'a dönüşür.
Koruma Teknolojisi
Rust'ta tam sayı taşmasını önlemek için aşağıdaki önlemler alınabilir:
Cargo.toml dosyasını yapılandırın, release modunda tam sayı taşmalarını da kontrol edin:
checked_* gibi güvenli matematik fonksiyonlarını kullanın:
pas
let result = x.checked_add(y).expect("Toplama taşması");
as_u128() gibi tür dönüştürme fonksiyonlarını kullanarak taşmayı kontrol etme:
pas
let amount_u256 = U256::from(u128::MAX) + 1;
let amount_u128 = amount_u256.as_u128(); // panik tetikleyecek
Bu yöntemlerle, Rust akıllı sözleşmelerinde tamsayı taşma açıklarını etkili bir şekilde önleyebilir ve sözleşmenin güvenliğini artırabiliriz. Matematiksel hesaplamalar içeren akıllı sözleşmeler yazarken, tamsayı işlemlerini dikkatlice ele almak ve uygun koruma önlemleri almak şarttır.
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
8 Likes
Reward
8
4
Share
Comment
0/400
GasDevourer
· 07-20 17:20
Dikkat, dolandırıcılık projelerine dikkat edin!
View OriginalReply0
SchrodingerAirdrop
· 07-19 14:45
Ev sahibi haklı, neden birlikte Rust öğrenmiyoruz?
Rust akıllı sözleşmeler tamsayı taşma koruma ipuçları
Tam sayı taşma açığı ve korunması
Tam sayı taşması, programlamada yaygın bir sorundur. Çoğu programlama dilinde, tam sayı değerleri sabit uzunluktaki bellek içinde depolanır. Tam sayılar, işaretsiz ve işaretli olarak ikiye ayrılır; fark, en yüksek bitin pozitif veya negatif sayıyı göstermek için işaret biti olarak kullanılıp kullanılmadığıdır. Örneğin, 32 bit bellek, 0 ile 4,294,967,295 arasında bir işaretsiz tam sayıyı (uint32) depolayabilir veya -2,147,483,648 ile 2,147,483,647 arasında bir işaretli tam sayıyı (int32) depolayabilir.
Tam sayı türünün temsil edebileceği aralığın dışına çıktığında taşma (overflow) meydana gelir. Çoğu programlama dili bu hatayı kontrol etmez, bunun yerine basit bir mod işlemi yapar veya tanımsız bir davranış sergiler. Bu, programın çalışma sonuçlarının beklenmedik olmasına neden olabilir. Blok zinciri akıllı sözleşmelerinde, özellikle DeFi alanında, tam sayı hesaplamaları oldukça yaygındır, bu nedenle tam sayı taşma açıklarına özel dikkat gösterilmelidir.
Tam Sayı Taşması Tanımı
Tam sayı taşması, iki durumdan oluşur: üst taşma ( overflow ) ve alt taşma ( underflow ).
Taşma: Sonuç, tamsayı türünün maksimum değerini aşar. Örneğin, uint32'nin 0xFFFFFFFF değerine 1 eklenirse 0x00000000 olur.
Aşağı taşma: Sonuç, tam sayı türünün minimum değerinden daha küçük olduğunda meydana gelir. Örneğin, uint32'nin 0'dan 1 çıkarılması 0xFFFFFFFF'a dönüşür.
Koruma Teknolojisi
Rust'ta tam sayı taşmasını önlemek için aşağıdaki önlemler alınabilir:
toml [profile.release] overflow-checks = true panic = 'abort'
pas uint::construct_uint kullanın;
construct_uint! { pub struct U1024(16); }
pas let result = x.checked_add(y).expect("Toplama taşması");
pas let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // panik tetikleyecek
Bu yöntemlerle, Rust akıllı sözleşmelerinde tamsayı taşma açıklarını etkili bir şekilde önleyebilir ve sözleşmenin güvenliğini artırabiliriz. Matematiksel hesaplamalar içeren akıllı sözleşmeler yazarken, tamsayı işlemlerini dikkatlice ele almak ve uygun koruma önlemleri almak şarttır.