Integer overflow

Dalam pemrograman komputer, **integer overflow** (meluapnya bilangan bulat) terjadi ketika sebuah operasi aritmetika pada bilangan bulat berusaha membuat nilai numerik yang berada di luar rentang yang dapat direpresentasikan dengan jumlah digit tertentu – baik lebih tinggi dari nilai maksimum yang dapat direpresentasikan atau lebih rendah dari nilai minimum yang dapat direpresentasikan.

Integer overflow menentukan luapan dari tipe data integer. Sebuah luapan (dari jenis apa pun) terjadi ketika sebuah program komputer atau sistem mencoba menyimpan lebih banyak data dalam lokasi berukuran tetap daripada yang dapat ditangani, mengakibatkan kehilangan data atau korupsi data. Implementasi bilangan bulat paling umum dalam komputer modern adalah komplemen dua. Dalam komplemen dua, bit paling signifikan mewakili tanda (positif atau negatif), dan bit paling tidak signifikan yang tersisa mewakili angka tersebut. Sayangnya, untuk sebagian besar arsitektur, ALU tidak mengetahui representasi biner tersebut bertanda. Operasi aritmetika dapat menghasilkan nilai bit yang melebihi ukuran tetap bit yang mewakili angka, hal ini menyebabkan bit tanda berubah, sebuah integer overflow. Contoh paling terkenal adalah: 2.147.483.647 + 1 = -2.147.483.648 dan -2.147.483.648 - 1 = 2.147.483.647.

Pada beberapa prosesor seperti unit pemroses grafis (GPU) dan prosesor sinyal digital (DSP) yang mendukung aritmetika saturasi, hasil yang meluap akan *dijepit*, yaitu diatur ke nilai minimum dalam rentang yang dapat direpresentasikan jika hasilnya di bawah minimum dan diatur ke nilai maksimum dalam rentang yang dapat direpresentasikan jika hasilnya di atas maksimum, daripada dibungkus.

Kondisi luapan dapat memberikan hasil yang mengarah pada perilaku yang tidak diinginkan. Secara khusus, jika kemungkinannya tidak diantisipasi, luapan dapat membahayakan keandalan dan keamanan program.

Untuk beberapa aplikasi, seperti pengatur waktu dan jam, pembungkusan pada luapan bisa diinginkan. Standar C11 menyatakan bahwa untuk bilangan bulat tidak bertanda, pembungkusan modulo adalah perilaku yang ditentukan dan istilah luapan tidak pernah berlaku: "komputasi yang melibatkan operan tidak bertanda tidak pernah dapat meluap."

## Asal usul
Integer overflow terjadi ketika sebuah operasi aritmetika pada bilangan bulat berusaha membuat nilai numerik yang berada di luar rentang yang dapat direpresentasikan dengan jumlah digit tertentu. Dalam konteks pemrograman komputer, bilangan bulat tersebut adalah biner, tetapi sistem bilangan posisional apa pun dapat memiliki hasil yang tidak valid dari operasi aritmetika jika posisinya terbatas. Seperti yang ditunjukkan dalam contoh odometer, menggunakan sistem desimal, dengan batasan 6 posisi (digit) operasi berikut akan memiliki hasil yang tidak valid: . Demikian pula, sistem biner yang terbatas pada 4 posisi (bit) akan memiliki hasil yang tidak valid untuk operasi berikut: . Untuk kedua contoh, hasilnya akan memiliki nilai yang melebihi rentang yang dapat direpresentasikan oleh batasan tersebut. Cara lain untuk melihat masalah ini adalah bahwa operasi posisi paling signifikan memiliki bawaan yang membutuhkan posisi/digit/bit lain untuk dialokasikan, melanggar batasan.

Semua bilangan bulat dalam pemrograman komputer memiliki batasan nilai maks dan nilai min. Faktor utama untuk menentukan rentangnya adalah alokasi bit dan apakah itu bertanda atau tidak bertanda. Integer standar bergantung pada platform dan bahasa pemrograman. Representasi integer tambahan bisa lebih kecil atau lebih besar dari standar. Contohnya adalah integer pendek dan integer panjang secara berurutan. Bahun presisi-berubah-ubah ada, tetapi akan dibatasi oleh presisi yang ditetapkan sebelumnya atau memori sistem yang tersedia.

Sebagian besar ALU melakukan operasi pada bilangan biner tak bertanda (positif). ALU ini tidak memiliki kemampuan apa pun untuk menangani bilangan bertanda (positif dan negatif). Karena sebagian besar angka dalam program perlu mendukung angka negatif, sebuah abstraksi digunakan, mendefinisikan ulang makna bit untuk menyertakan tanda. Solusi paling umum adalah komplemen dua. Sebagian besar bahasa pemrograman menyediakan konstruk ini. Sebuah integer bertanda 32-bit akan menggunakan bit paling signifikan untuk menandakan tanda (positif atau negatif), dan 31-bit yang tersisa untuk mewakili angka. Ketika sebuah operasi terjadi yang menghasilkan bawaan melewati 31-bit yang dialokasikan untuk angka tersebut, bit tanda ditimpa. ALU tidak tahu bahwa itu melakukan kesalahan. Itu menjadi tanggung jawab program untuk mendeteksi kesalahan luapan ini.

Untuk penggunaan integer tak bertanda dengan lebar register ALU, ALU tidak mampu mengembalikan hasil dengan lebih banyak bit di luar lebarnya. ALU akan mengembalikan hasil bersama dengan bendera untuk carry-out. Ketika bendera ini dikembalikan benar, ALU telah mendeteksi luapan.

Setelah luapan terdeteksi, itu menjadi tanggung jawab program untuk menanganinya dengan logika tambahan. Nilai hasil dari operasi tersebut rusak dan dapat menyebabkan masalah tambahan jika tidak ditangani dengan benar.

Menggunakan integer dengan ukuran yang sama dengan lebar register ALU akan memiliki kinerja terbaik di sebagian besar aplikasi. Ekstensi instruksi SIMD dapat menyediakan operasi tunggal untuk integer yang melebihi lebar register. Untuk prosesor x86 32-bit, Streaming SIMD Extensions (SSE2) menambahkan register untuk integer 64-bit. Untuk prosesor x86-64 64-bit, Advanced Vector Extensions (AVX) menambahkan register hingga integer 512-bit.

Ketika operasi aritmetika tak bertanda menghasilkan hasil lebih besar dari maksimum di atas untuk integer N-bit, sebuah luapan mengurangi hasil menjadi modulo pangkat N dari 2, hanya mempertahankan bit paling tidak signifikan dari hasil dan secara efektif menyebabkan *pembungkusan*.

Khususnya, mengalikan atau menambahkan dua integer dapat menghasilkan nilai yang secara tak terduga kecil, dan mengurangkan dari integer kecil dapat menyebabkan pembungkusan ke nilai positif besar (misalnya, penambahan integer 8-bit 255 + 2 menghasilkan 1, yang adalah , dan sama halnya pengurangan 0 − 1 menghasilkan 255, sebuah representasi komplemen dua dari −1).

Pembungkusan seperti itu dapat menyebabkan kerugian keamanan—jika nilai yang meluap digunakan sebagai jumlah byte untuk mengalokasikan buffer, buffer akan dialokasikan dengan ukuran yang secara tak terduga kecil, berpotensi leading ke buffer overflow yang, tergantung pada penggunaan buffer, mungkin pada gilirannya menyebabkan eksekusi kode sewenang-wenang.

Jika variabel memiliki tipe integer bertanda, sebuah program dapat membuat asumsi bahwa variabel selalu berisi nilai positif. Sebuah integer overflow dapat menyebabkan nilai membungkus dan menjadi negatif, yang melanggar asumsi program dan dapat leading ke perilaku tak terduga (misalnya, penambahan integer 8-bit 127 + 1 menghasilkan −128, sebuah komplemen dua dari 128). (Sebuah solusi untuk masalah khusus ini adalah menggunakan tipe integer tak bertanda untuk nilai yang diharapkan dan diasumsikan oleh program tidak akan pernah negatif.)

## Referensi

## Pranala luar

*Phrack #60, Basic Integer Overflows
*Phrack #60, Big Loop Integer Protection
*Efficient and Accurate Detection of Integer-based Attacks
*WASC Threat Classification – Integer Overflows
*Understanding Integer Overflow in C/C++
*Binary Overflow – Binary Arithmetic
*ISO C11 Standard