Apa Itu Stack Overflow?
Stack overflow adalah jenis kesalahan buffer overflow yang terjadi ketika sebuah program mencoba menggunakan lebih banyak ruang memori di call stack daripada yang telah dialokasikan. Call stack, atau sering disebut sebagai stack segment, adalah buffer berukuran tetap yang menyimpan variabel lokal dan data alamat pengembalian selama eksekusi program.
Call stack bekerja dengan arsitektur memori Last-In, First-Out (LIFO). Setiap fungsi memiliki stack frame sendiri untuk menyimpan variabel dan data alamatnya. Saat sebuah fungsi dipanggil, stack frame-nya akan ditambahkan ke bagian atas call stack dan akan tetap berada di sana sampai fungsi selesai dieksekusi. Setelah itu, stack frame akan dihapus, membebaskan ruang memori untuk frame lainnya.
Ukuran call stack biasanya ditentukan saat program mulai berjalan. Ukurannya bergantung pada beberapa faktor, seperti arsitektur host komputer, bahasa pemrograman yang digunakan, dan jumlah memori yang tersedia dalam sistem. Jika program membutuhkan lebih banyak memori daripada yang tersedia di call stack, maka stack overflow terjadi, yang bisa menyebabkan program—bahkan seluruh sistem—crash.
Apa Penyebab Stack Overflow?
Salah satu penyebab paling umum dari stack overflow adalah fungsi rekursif, yaitu fungsi yang terus-menerus memanggil dirinya sendiri untuk menjalankan logika tertentu. Setiap kali fungsi ini dipanggil, ia menggunakan lebih banyak memori stack. Jika terlalu banyak pemanggilan terjadi tanpa batasan yang jelas, memori stack bisa habis, menyebabkan stack overflow.
Stack overflow juga bisa terjadi jika terlalu banyak data disimpan dalam variabel di stack frame. Variabel array sangat rentan terhadap kesalahan ini, terutama jika tidak ada mekanisme pembatasan data yang masuk ke dalam array.
Apa yang Terjadi Saat Stack Overflow?
Ketika stack overflow terjadi, data yang berlebih dapat merusak variabel lain dan alamat data, yang dapat mengubah nilai variabel secara tidak sengaja atau menimpa alamat pengembalian fungsi. Dalam beberapa kasus, ini bisa menyebabkan program crash. Namun, terkadang program tetap berjalan, membuatnya lebih sulit untuk didiagnosis setelah kesalahan ditemukan. Semakin lama program berjalan dalam kondisi seperti ini, semakin sulit mendeteksi dan memperbaikinya.
Program yang rentan terhadap stack overflow juga bisa menjadi celah keamanan yang dapat dieksploitasi oleh hacker. Dengan menimpa call stack, mereka dapat menyisipkan kode berbahaya yang mengubah cara kerja program atau bagaimana ia diakses. Misalnya, seorang hacker bisa memanfaatkan celah stack overflow untuk mengganti kata sandi atau menghapus file konfigurasi.
Apa Itu Heap Overflow?
Jenis lain dari kesalahan buffer overflow adalah heap overflow. Berbeda dengan call stack, heap (atau heap segment) adalah ruang memori yang dialokasikan secara dinamis dan menyimpan variabel global.
Heap juga rentan terhadap buffer overflow, meskipun memorinya dialokasikan secara dinamis. Dalam heap, pengembang bertanggung jawab untuk mengelola dan membebaskan memori yang tidak digunakan. Jika pengelolaan ini tidak dilakukan dengan baik, heap overflow dapat terjadi, yang bisa menyebabkan data penting tertimpa atau hilang. Heap overflow juga bisa terjadi jika variabel yang disimpan berisi lebih banyak data daripada jumlah memori yang dialokasikan.
Lihat juga: memory allocation, memory management, swap file