SPEAKER 1: Mari kita menulis sebuah program yang mendapatkan string dari pengguna tanpa menggunakan CS50 Perpustakaan berfungsi GetString. Untuk melakukan hal ini, kita akan pergi ke depan dan menggunakan scanf, fungsi yang GetString tersebut fungsi benar-benar menggunakan di bawah tenda. Tapi aku akan melakukan ini dengan sengaja dengan cara buggy. Aku akan lakukan dengan cara yang saya pikir akan benar, tapi ternyata asumsi saya akan cukup, cukup cacat. Dan pada kenyataannya, cukup berbahaya. Karena bug seperti yang saya akan membuat dapat dimanfaatkan oleh musuh sehingga mesin Anda atau program Anda dapat diambil alih berpotensi. Mari kita mulai sebagai berikut. Pertama mari kita mendeklarasikan string kita, atau dikenal sekarang sebagai bintang char, dan menyebutnya s. Mari selanjutnya meminta pengguna untuk string, seperti "string silakan." Dan mari kita mendapatkan string dari pengguna menggunakan scanf, kutipan tanda kutip, "% s." Di Dengan kata lain, mari kita menginformasikan scanf kita yang pada kenyataannya berharap untuk mendapatkan string dari pengguna. Tapi sekarang kita perlu memberitahu scanf satu hal lain - di mana harus menempatkan string yang pengguna menyediakan. Yah, aku akan cukup sederhana mulai dengan koma s, menetapkan bahwa saya ingin scanf untuk menempatkan string di sana. Saya selanjutnya akan mencetak sesuatu seperti printf "terima kasih untuk% s backslash n koma. "Dan seperti biasa, aku akan lulus dalam string, s. Sekarang mari kita simpan, kompilasi, dan menjalankan ini Program, dan melihat apakah kita tidak dapat menginduksi masalah saya prediksi. Membuat scanf-1. ./scanf-1. String silakan. Mari kita memberikan sesuatu seperti, "halo." "Terima kasih atas nol." Hmm, itu bukan apa yang kuharapkan. Jadi apa yang terjadi di sini? Nah, ternyata karena kita menyatakan s sebagai bintang arang tapi kami tidak sebenarnya disimpan dalam s alamat dari potongan yang sebenarnya memori, scanf tidak punya tempat untuk menempatkan string bahwa pengguna diketik masuk Memang, jika pengguna adalah untuk sekarang ketik string lebih lama daripada "Halo," misalnya beberapa baris teks atau beberapa paragraf teks, itu cukup kemungkinan bahwa kita mungkin menginduksi disebut segmentasi kesalahan. Karena scanf tidak akan tahu bahwa Saya belum benar-benar menempatkan alamat dalam s. Sebaliknya, itu akan melihat beberapa nilai di s, beberapa pola bit yang mungkin sangat baik menjadi nilai sampah, ada hanya kebetulan. Dan scanf masih akan mencoba untuk menulis string pengguna ke alamat tersebut, bahkan jika itu adalah nilai sampah, yang memang bisa menyebabkan kecelakaan. Jadi bagaimana kita akan memperbaiki ini?