Overflow bilangan bulat adalah masalah umum dalam pemrograman. Dalam sebagian besar bahasa pemrograman, nilai bilangan bulat disimpan dalam memori dengan panjang tetap. Bilangan bulat dapat dibagi menjadi bilangan bulat tanpa tanda dan bilangan bulat dengan tanda, perbedaannya terletak pada apakah bit tertinggi digunakan sebagai bit tanda untuk menunjukkan positif atau negatif. Misalnya, memori 32-bit dapat menyimpan bilangan bulat tanpa tanda dari 0 hingga 4.294.967.295 (uint32), atau bilangan bulat dengan tanda dari -2.147.483.648 hingga 2.147.483.647 (int32).
Ketika hasil perhitungan melebihi rentang yang dapat diwakili oleh tipe integer, akan terjadi overflow. Sebagian besar bahasa pemrograman tidak memeriksa kesalahan ini, melainkan melakukan operasi modulo sederhana atau menghasilkan perilaku yang tidak terdefinisi. Ini dapat menyebabkan hasil program berjalan tidak terduga. Dalam kontrak pintar blockchain, terutama di bidang DeFi, perhitungan integer sangat umum, sehingga perlu perhatian khusus terhadap celah overflow integer.
Definisi Overflow Bilangan Bulat
Overflow integer dibagi menjadi dua kondisi: overflow ( dan underflow ).
Overflow: Hasil melebihi nilai maksimum tipe integer. Misalnya, 0xFFFFFFFF dari uint32 ditambah 1 akan menjadi 0x00000000.
Underflow: Hasil lebih kecil dari nilai minimum tipe integer. Misalnya, 0 dari uint32 dikurangi 1 akan menjadi 0xFFFFFFFF.
Teknologi Perlindungan
Dalam Rust, langkah-langkah berikut dapat diambil untuk mencegah overflow integer:
Konfigurasi Cargo.toml agar mode release juga memeriksa overflow integer:
Menggunakan uint crate untuk mendukung bilangan bulat yang lebih besar:
karat
gunakan uint::construct_uint;
construct_uint! {
pub struct U1024(16);
}
Gunakan fungsi matematika aman seperti checked_*:
karat
let result = x.checked_add(y).expect("Penambahan overflow");
Gunakan fungsi konversi seperti as_u128() untuk memeriksa overflow:
karat
let amount_u256 = U256::from(u128::MAX) + 1;
let amount_u128 = amount_u256.as_u128(); // akan memicu panic
Dengan metode ini, kita dapat secara efektif mencegah kerentanan overflow integer dalam kontrak pintar Rust, meningkatkan keamanan kontrak. Saat menulis kontrak pintar yang melibatkan perhitungan matematis, sangat penting untuk menangani operasi integer dengan hati-hati dan mengambil langkah perlindungan yang tepat.
Lihat Asli
Halaman ini mungkin berisi konten pihak ketiga, yang disediakan untuk tujuan informasi saja (bukan pernyataan/jaminan) dan tidak boleh dianggap sebagai dukungan terhadap pandangannya oleh Gate, atau sebagai nasihat keuangan atau profesional. Lihat Penafian untuk detailnya.
8 Suka
Hadiah
8
4
Bagikan
Komentar
0/400
GasDevourer
· 07-20 17:20
Hati-hati terhadap proyek yang berpotensi merugikan!
Lihat AsliBalas0
SchrodingerAirdrop
· 07-19 14:45
Pemilik lantai benar, bagaimana jika kita belajar rust bersama?
Lihat AsliBalas0
liquiditea_sipper
· 07-17 23:42
Wow, pemeriksaan overflow harus dilakukan!
Lihat AsliBalas0
TokenCreatorOP
· 07-17 23:24
Eh, siapa yang belum pernah terjebak dalam masalah ini~
Tips perlindungan overflow integer pada smart contract Rust
Kerentanan Overflow Integer dan Perlindungannya
Overflow bilangan bulat adalah masalah umum dalam pemrograman. Dalam sebagian besar bahasa pemrograman, nilai bilangan bulat disimpan dalam memori dengan panjang tetap. Bilangan bulat dapat dibagi menjadi bilangan bulat tanpa tanda dan bilangan bulat dengan tanda, perbedaannya terletak pada apakah bit tertinggi digunakan sebagai bit tanda untuk menunjukkan positif atau negatif. Misalnya, memori 32-bit dapat menyimpan bilangan bulat tanpa tanda dari 0 hingga 4.294.967.295 (uint32), atau bilangan bulat dengan tanda dari -2.147.483.648 hingga 2.147.483.647 (int32).
Ketika hasil perhitungan melebihi rentang yang dapat diwakili oleh tipe integer, akan terjadi overflow. Sebagian besar bahasa pemrograman tidak memeriksa kesalahan ini, melainkan melakukan operasi modulo sederhana atau menghasilkan perilaku yang tidak terdefinisi. Ini dapat menyebabkan hasil program berjalan tidak terduga. Dalam kontrak pintar blockchain, terutama di bidang DeFi, perhitungan integer sangat umum, sehingga perlu perhatian khusus terhadap celah overflow integer.
Definisi Overflow Bilangan Bulat
Overflow integer dibagi menjadi dua kondisi: overflow ( dan underflow ).
Overflow: Hasil melebihi nilai maksimum tipe integer. Misalnya, 0xFFFFFFFF dari uint32 ditambah 1 akan menjadi 0x00000000.
Underflow: Hasil lebih kecil dari nilai minimum tipe integer. Misalnya, 0 dari uint32 dikurangi 1 akan menjadi 0xFFFFFFFF.
Teknologi Perlindungan
Dalam Rust, langkah-langkah berikut dapat diambil untuk mencegah overflow integer:
toml [profile.release] overflow-checks = true panic = 'abort'
karat gunakan uint::construct_uint;
construct_uint! { pub struct U1024(16); }
karat let result = x.checked_add(y).expect("Penambahan overflow");
karat let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // akan memicu panic
Dengan metode ini, kita dapat secara efektif mencegah kerentanan overflow integer dalam kontrak pintar Rust, meningkatkan keamanan kontrak. Saat menulis kontrak pintar yang melibatkan perhitungan matematis, sangat penting untuk menangani operasi integer dengan hati-hati dan mengambil langkah perlindungan yang tepat.