Saya mencoba menjelaskan kesalahan segmentasi kepada seseorang, dan saya berpikir tentang tingkat 256 kill-screen di Pacman, dan bagaimana hal itu dipicu oleh integer overflow, dan seberapa mirip perilakunya dengan "keadaan tidak dikenal" yang sering dijelaskan dalam segmentasi kesalahan.
Saya ingin mengatakan ini adalah contoh yang baik dari apa yang saya sebut "segfault tidak tertangani", tetapi saya lebih suka mendapatkan pendapat kedua sebelum saya berpotensi menyebarkan informasi yang salah.
Saya mencoba mencarinya, tetapi yang saya dapatkan hanyalah dokumen tentang bug itu sendiri, serta perselisihan antara Paus Hipster dan Namco.
Jadi, apakah Anda menganggap perilaku di tingkat 256 Pacman sebagai contoh pelanggaran segmentasi yang tidak ditangani?
Jawaban:
Tentu saja tidak.
Mengakses alamat memori yang tidak Anda alokasikan selalu merupakan kesalahan pemrograman. Dan bertindak berdasarkan informasi yang Anda dapatkan darinya menghasilkan perilaku yang tidak terdefinisi, sebanyak itu akurat. Saya tidak tahu platform apa yang ditulis Pac-man asli, tapi saya cukup yakin itu menunjukkan perilaku ini sama seperti mesin von Neumann lainnya.
Namun, "kesalahan segmentasi" adalah istilah teknis untuk kondisi yang jauh lebih spesifik. Itu terjadi ketika komputer secara otomatis mendeteksi bahwa ini terjadi dan menghentikan proses daripada membiarkan perilaku yang tidak ditentukan terjadi. Ini membutuhkan model memori khusus (tersegmentasi) dengan penandaan kepemilikan yang canggih. Saya tidak berpikir 1980 permainan arcade memiliki itu, dan sebenarnya perilaku permainan menunjukkan bahwa kesalahan itu tidak terdeteksi, dan perilaku yang tidak terdefinisi memang terjadi.
sumber
Sepertinya Anda membingungkan "perilaku tidak terdefinisi" dan "kesalahan segmentasi".
Tidak ada yang namanya segfault tidak tertangani. Kesalahan segmentasi adalah penanganan kesalahan, menurut definisi.
Jika Anda tidak memiliki OS yang mendeteksi akses memori buruk dan menghentikan proses untuk keselamatan, maka Anda tidak memiliki kesalahan segmentasi.
Jika ada, maka, ini adalah contoh yang cukup bagus tentang bagaimana UB tidak selalu menghasilkan segfault.
sumber
Tidak satu pun dari istilah ini yang sesuai untuk bug dalam game arcade yang diprogram dalam bahasa assembly dan berjalan tanpa manfaat dari perangkat keras perlindungan memori atau sistem operasi.
"Perilaku tidak terdefinisi" adalah istilah termutakhir dalam bahasa C dan yang terkait, diciptakan oleh komite standar C pada tahun 1989. Kode memiliki perilaku tidak terdefinisi ketika spesifikasi bahasa tidak menentukan apa yang akan dilakukan. Tidak ada hal seperti itu dalam bahasa assembly Z80: efek dari setiap opcode dengan setiap input yang mungkin didefinisikan dengan baik. Arti bahasa Inggris konvensional dari "perilaku tidak terdefinisi" dapat dibaca untuk diterapkan - kill screen adalah perilaku yang tidak didefinisikan oleh orang-orang yang menulis game - tetapi saya tidak akan menggunakannya dalam konteks ini karena terlalu mungkin memberikan yang salah kesan.
"Segmentasi fault" adalah istilah termutakhir dalam POSIX, yang pada akhirnya diturunkan dari jargon pemrograman sistem PDP. Kesalahan segmentasi terjadi ketika suatu program mencoba mengakses alamat memori yang tidak "dipetakan" ke apa pun: perangkat keras dan sistem operasi mendeteksi ini dan mematikan program yang tidak berfungsi, dengan cara yang ditentukan dengan hati-hati yang memungkinkan program kesempatan untuk pulih . Sesuatu sepertiini bisa terjadi sebagai akibat dari bug dalam program permainan Pac-Man, karena papan sirkuit Pac-Man hanya mengisi sedikit kurang dari setengah ruang alamat 64kB Z80 dengan ROM, RAM, dan periferal, tapi saya belum tahu t tidak dapat mengetahui apa yang akan dilakukan perangkat keras nyata jika perangkat lunak berusaha mengakses memori yang belum dipetakan. Apa pun yang akan dilakukan, itu akan tidak pantas untuk menggambarkan sebagai "kesalahan segmentasi", karena "sistem operasi" untuk Pac-Man (sejauh itu bahkan memiliki satu) bukan merupakan implementasi dari Unix dan, sekali lagi, itu akan memberi kesan yang salah.
Bug level 256, sementara itu, tidak mengakses memori yang belum dipetakan, jadi ini bisa diperdebatkan.
Adalah akurat untuk mengatakan bahwa permainan memiliki bug yang bermanifestasi setelah naik ke level 256. Juga akurat untuk mengatakan bahwa akar penyebab bug adalah bilangan bulat bilangan bulat , dan bahwa konsekuensinya adalah kerusakan memori (atau, setara, pelanggaran) dari memori dan jenis keamanan ). Ini semua adalah istilah CS tujuan umum yang didefinisikan tanpa mengacu pada bahasa atau lingkungan OS tertentu.
Juga akurat untuk mengamati bahwa efek bug mirip dengan efek, dalam lingkungan modern, bug-korupsi memori yang tidak memprovokasi kesalahan segmentasi. Jika Anda membaca salah satu luncuran eksploitasi Project Zero , Anda akan melihat kesamaan yang luar biasa dengan analisis Don Hodges tentang layar pembunuh Pac-Man .
Perhatikan bahwa emulator yang tidak dengan setia mereproduksi layar kill ketika memberi makan ROM Pac-Man tidak meniru perangkat keras game dengan benar.
sumber
Bug level-256 dalam Pac Man menghasilkan program membaca data yang berada di luar akhir tabel yang dimaksud, tetapi masih dapat dibaca , dan menulis ke bagian layar yang berada di luar yang ingin dituliskan oleh program, tetapi masih berada dalam area layar yang diizinkan untuk ditulis oleh program . Tidak ada area memori lain yang terpengaruh.
Alasan bug membuat game tidak dapat dimainkan adalah karena mesin menentukan kapan seorang pemain memakan titik-titik dengan memeriksa apa yang ada di layar, dan memutuskan bahwa levelnya sudah selesai ketika pemain telah memakan 244 titik. Dengan menimpa bagian layar, bug membuat pemain tidak bisa makan 244 titik; akibatnya, permainan tidak akan pernah memberi kredit kepada pemain dengan menyelesaikan level dan memuat ulang layar dengan titik-titik.
sumber
Seperti yang dikatakan sebelumnya tidak itu bukan kesalahan seg. Saya akan menambahkan mengapa masalah terjadi: ini meluap .
Nomor level disimpan pada byte sehingga kisarannya adalah 0-255. Setiap kali Anda menyelesaikan level, penghitung bertambah. Pada level 256, penghitung sebenarnya adalah 0 karena overflow.
Namun permainan mencoba untuk menampilkan beberapa buah di bagian bawah level. Jumlah / jenis buah tergantung pada levelnya. Rumus menampilkan satu buah per level jadi di bawah level 8. Menurut penghitung Anda berada di level 0 jadi di bawah 8. Tes itu benar dan Anda harus mencetak 255 buah (nilai level lama). Yang tidak mungkin dan memberikan layar glitched ini.
sumber