SPEAKER 1: Pieņemsim uzrakstīt programmu, kas izpaužas string no lietotāja bez izmantojot CS50 bibliotēkas darboties GetString. Lai to paveiktu, mēs iesim uz priekšu un izmantot scanf, funkcija, kas GetString funkcija faktiski izmanto zem motora pārsega. Bet es esmu gatavojas darīt to apzināti ar buggy veidā. Es esmu gatavojas darīt tādā veidā, ka es domāju, ka būtu labi, bet izrādās, ka mans pieņēmums ir gatavojas būt diezgan, diezgan kļūdains. Un patiesībā, ir diezgan bīstami. Jo kļūdas, piemēram, kādu es esmu par to, lai padarīt var izmantot ar pretiniekiem tāds, ka jūsu mašīna, vai jūsu programma var pārņemt iespējami. Sāksim šādi. Vispirms pieņemsim pasludināt mūsu virkni, citādi zināma tagad kā char zvaigzne, un sauc to s. Lets nākamais atgādinās lietotājam par virkni, kā ar "string, lūdzu." Un pieņemsim tagad saņemt virkni no lietotāja izmantojot scanf, citējot likt pēdiņas beigās, "% s." Uz Citiem vārdiem sakot, pieņemsim informē scanf, ka mēs Vai tiešām gaidīt, lai saņemtu virkni no lietotāja. Bet tagad mums ir nepieciešams, lai pastāstītu scanf viena cita lieta - kur likt virkni, kas lietotājs sniedz. Nu, es esmu gatavojas gluži vienkārši sākt ar komatu s, norādot, ka es gribētu scanf likt virkni tur. Es esmu blakus gatavojas izdrukāt kaut ko piemēram, printf "Paldies par% s slīpsvītru n komats. "Un, kā vienmēr, es esmu gatavojas pāriet virknes, s. Tagad pieņemsim saglabāt, apkopot un palaist šo programmu, un redzēt, ja mēs nevaram izraisīt problēma man prognozēt. Padarīt Scanf-1. ./scanf-1. String lūdzu. Pieņemsim sniegt kaut ko līdzīgu, "hello". "Paldies par nulli." Hmm, tas nav ko es biju gaidījis. Tātad, kas notiek šeit? Nu, izrādās, ka mēs būtu deklarējuši s kā char zvaigzne, bet mēs neesam faktiski uzglabā s adresi faktiskais rieciens atmiņas, scanf nebija nekur likt virkni ka lietotājs drukāti collas Patiešām, ja lietotājs būtu tagad rakstīt daudz ilgāk string par "hello" piemēram vairākas teksta rindas vai vairāki punkti teksta, tas ir diezgan Iespējams, ka mēs varētu izraisīt tā saukto segmentāciju vaina. Jo scanf nav gatavojas zināt, ka Man nav tiešām likts adresi iekšpusē s. Drīzāk, tas notiek, lai redzētu kādu vērtību S, daži modelis biti, kas var ļoti labi būt atkritumu vērtību, tur tikai nejauši. Un scanf joprojām turpinās, lai mēģinātu uzrakstīt lietotājs string uz šo adresi, pat tad, ja tā ir atkritumu vērtību, kas tiešām varētu izraisīt avāriju. Tātad, kā mēs gatavojamies noteikt šo?