Lompat ke isi

Integer overflow

Dari Wikipedia bahasa Indonesia, ensiklopedia bebas
Integer overflow dapat ditunjukkan melalui odometer yang meluap, versi mekanis dari fenomena tersebut. Semua digit diatur ke maksimum 9 dan kenaikan berikutnya dari digit putih menyebabkan kaskade penambahan bawaan yang mengatur semua digit ke 0, tetapi tidak ada digit yang lebih tinggi (digit 1.000.000) untuk diubah menjadi 1, sehingga penghitung kembali ke nol. Ini adalah pembungkusan berbeda dengan penjenuhan.

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.[1] Implementasi bilangan bulat paling umum dalam komputer modern adalah komplemen dua.[2] 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."[3]

Asal usul

[sunting | sunting sumber]

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: 999999 + 1. Demikian pula, sistem biner yang terbatas pada 4 posisi (bit) akan memiliki hasil yang tidak valid untuk operasi berikut: 1111 + 1. 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.[4]

Batasan Integer Khas
Bits Alias[a] Rentang Rentang Bertanda[b] Rentang Tak Bertanda
8-bit byte[5][c], sbyte,[6] oktet 28 − 1 -128[7] 0[8]
127[9] 255[10]
16-bit word, short, int16,[11] uint16[12] 216 − 1 −32.768[13] 0[14]
32.767[15] 65.535[16]
32-bit[d] int32,[17] uint32[18] 232 − 1 -2.147.483.648[19] 0[20]
2.147.483.647[21] 4.294.967.295[22]
64-bit[e] int64,[23] uint64[24] 264 − 1 −9.223.372.036.854.775.808[25] 0[26]
9.223.372.036.854.775.807[27] 18.446.744.073.709.551.615[28]
128-bit int128,[29] uint128[30] 2128 − 1 −170.141.183.460.469.231.731.687.303.715.884.105.728 0
170.141.183.460.469.231.731.687.303.715.884.105.727 340.282.366.920.938.463.463.374.607.431.768.211.455
  1. ^ Tipe data integer (int) biasanya menggunakan komplemen dua sehingga bertanda. Awalan 'u' menandakan implementasi tak bertanda.
  2. ^ Rentang Bertanda mengasumsikan komplemen dua
  3. ^ Tipe data byte biasanya tak bertanda secara default. Awalan 's' menandakan implementasi bertanda.
  4. ^ Yang paling umum untuk komputer pribadi hingga 2005.
  5. ^ Yang paling umum untuk komputer pribadi hingga 2025.

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 257 mod 28, 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

[sunting | sunting sumber]
  1. ^ "Apa itu kesalahan luapan?".
  2. ^ Misalnya, "Signed integers are two's complement binary values that can be used to represent both positive and negative integer values", Bagian 4.2.1 dalam Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture, November 2006
  3. ^ Staf ISO. "ISO/IEC 9899:2011 Teknologi informasi - Bahasa pemrograman - C". ANSI.org.
  4. ^ "Intel® AVX-512 - Teknik Perkalian Modular Cepat".
  5. ^ ".NET Byte Struct".
  6. ^ ".NET SByte Struct".
  7. ^ ".NET SByte.MinValue Field".
  8. ^ ".NET Byte.MinValue Field".
  9. ^ ".NET SByte.MaxValue Field".
  10. ^ ".NET Byte.MaxValue Field".
  11. ^ ".NET Int16 Struct".
  12. ^ ".NET UInt16 Struct".
  13. ^ ".NET Int16.MinValue Field".
  14. ^ ".NET UInt16.MinValue Field".
  15. ^ ".NET Int16.MaxValue Field".
  16. ^ ".NET UInt16.MaxValue Field".
  17. ^ ".NET Int32 Struct".
  18. ^ ".NET UInt32 Struct".
  19. ^ ".NET Int32.MinValue Field".
  20. ^ ".NET UInt32.MinValue Field".
  21. ^ ".NET Int32.MaxValue Field".
  22. ^ ".NET UInt32.MaxValue Field".
  23. ^ ".NET Int64 Struct".
  24. ^ ".NET UInt64 Struct".
  25. ^ ".NET Int64.MinValue Field".
  26. ^ ".NET UInt64.MinValue Field".
  27. ^ ".NET Int64.MaxValue Field".
  28. ^ ".NET UInt64.MaxValue Field".
  29. ^ ".NET Int128 Struct".
  30. ^ ".NET UInt128 Struct".

Pranala luar

[sunting | sunting sumber]