SPEAKER 1: Mari kita menulis program yang mendapat rentetan dari pengguna tanpa menggunakan CS50 Perpustakaan berfungsi GetString. Untuk melakukan ini, kami akan pergi ke hadapan dan menggunakan scanf, fungsi yang GetString yang fungsi sebenarnya menggunakan di bawah hood. Tetapi saya akan melakukan ini sengaja dengan cara kereta. Saya akan melakukan dengan cara yang saya rasa akan menjadi betul, tetapi ia ternyata bahawa andaian saya akan agak, agak cacat. Dan sebenarnya, agak berbahaya. Kerana pepijat seperti yang saya kira-kira untuk membuat boleh dieksploitasi oleh musuh- itu bahawa mesin anda atau program anda boleh diambil alih berpotensi. Mari kita mulakan seperti berikut. Pertama mari kita mengisytiharkan tali kita, atau dikenali sekarang sebagai bintang char, dan panggilan ia s. Mari seterusnya meminta pengguna untuk tali, seperti dengan "rentetan sila." Dan mari kita kini mendapat tali dari pengguna menggunakan scanf, quote unquote, "% s." Dalam erti kata lain, mari kita memberitahu kita bahawa scanf jangan sebenarnya mengharapkan untuk mendapatkan rentetan daripada pengguna. Tetapi sekarang kita perlu memberitahu scanf satu perkara yang lain - di mana untuk meletakkan rentetan yang pengguna menyediakan. Well, saya akan cukup hanya bermula dengan koma s, dengan menyatakan bahawa saya ingin scanf untuk meletakkan tali di sana. Saya seterusnya akan mencetak sesuatu seperti printf "terima kasih untuk% s garis sendeng terbalik n koma. "Dan seperti biasa, saya akan lulus dalam tali, s. Sekarang mari kita menyimpan, menyusun, dan menjalankan ini program, dan lihat jika kita tidak boleh mendorong masalah yang saya diramalkan. Buat scanf-1. ./scanf-1. Rentetan sila. Mari kita memberikan sesuatu seperti, "hello." "Terima kasih kerana nol." Hmm, itu bukan apa yang saya menjangkakan. Jadi apa yang berlaku di sini? Nah, ternyata kerana kita diisytiharkan sebagai penyanyi char tetapi kita tidak sebenarnya disimpan dalam s alamat satu sebahagian sebenar ingatan, scanf tidak mempunyai mana-mana sahaja untuk meletakkan tali bahawa pengguna ditaip masuk Sesungguhnya, jika pengguna adalah untuk sekarang taip tali yang lebih lama daripada "hello," misalnya beberapa baris teks atau beberapa perenggan teks, ia agak mungkin kita mungkin mendorong kononnya segmentasi bersalah. Kerana scanf tidak akan tahu bahawa Saya tidak benar-benar meletakkan alamat dalam s. Sebaliknya, ia akan melihat beberapa nilai dalam s, beberapa corak bit yang boleh dengan baik menjadi nilai sampah, sana hanya secara kebetulan. Dan scanf masih akan cuba untuk menulis rentetan pengguna untuk alamat itu, walaupun ia adalah satu nilai sampah, yang memang boleh mendorong kemalangan. Jadi bagaimana kita boleh menetapkan ini?