[Powered by Google Translate] [NEDĒĻA 5] [David J. Malan, Hārvarda universitātes] [Tas ir CS50.] [CS50.TV] [Sieviete] Viņš guļ, par ko, es nezinu. [Cilvēks] Tātad, ko mēs zinām? [Sieviete] Tas at 9:15, Ray Santoya bija pie bankomāta. [Cilvēks] Tātad jautājums ir, ko viņš dara pie 09:16? [Sieviete] šaušana 9 mm kaut ko. Varbūt viņš redzēja snaiperis. [Cilvēks] Vai viņš strādā ar viņu. [Sieviete] Wait. Iet atpakaļ vienu. [Cilvēks] Ko tu redzi? [♫ suspenseful mūzika ♫] [Sieviete] Bring savu seju uz augšu. Pilna ekrāna. [Man] Viņa brilles. >> Tur atspulgs. [♫ suspenseful mūzika ♫] [Cilvēks] Tas ir Nuevita s beisbola komanda. Tas ir viņu logo. [Sieviete] Un viņš runā, lai kurš valkā šo jaka. [Deivids Malan] Tātad, tas ir CS50 nedēļa 5, un šodien mēs sagraut mazliet televīzijas un filmu. Tātad, ja jūs esat skatoties izrādi, piemēram, šo vienu šeit, un policija saka "Vai jūs varat tīrīt, ka līdz?" vai "Uzlabot" nav uzlabot reālajā pasaulē. Patiesībā, tas, ko jūs patiešām iegūt, ir mazliet kaut kas līdzīgs šim. Es esmu velk uz augšu vienu no personāla fotogrāfijas no lapas. Šī ir programma, ko sauc Photoshop. Šis ir 1 no 2 Bowdens, 1 no 3 Bowdens faktiski, šodien, jo mums ir Mrs Bowden šeit, kā arī, ar Rob un Pāvils. Bet šeit ir Rob uz ekrāna, un ja mēs tuvinātu šajā atspīdums viņš vienmēr bija viņa acīs, ko jūs faktiski redzēt, ir tas, ko jūs redzat ir tas, ko jūs saņemsiet. Šis ir "uzlabota", tādēļ "CSI" ir tā mazliet nepareizi. Ir viena cita klips, ja mēs varam paņemt uz "CSI" tikai mazliet ilgāk. Tas viens ir jauka frāze izdvest turpmāk, ja jūs vēlaties, lai skaņu tehnikas ar saviem draugiem, kad, tiešām, jūs sakāt absolūti neko. [Cilvēks] Par nedēļas es esmu bijis pētot važonis Killer slepkavības ar noteiktu slimīgu aizraušanos. [Sieviete # 1] Tas ir reālajā laikā. [Sieviete # 2] Es izveidot GUI saskarni, izmantojot Visual Basic, redzēt, ja es varētu izsekot IP adresi. [Malan] Līdz ar to audio no sinhronizācijā malā, radot GUI saskarni, izmantojot Visual Basic izsekot IP adrese ir pilnīgs absurds. Šajās dienās jūs nevarētu izmantot Visual Basic, tur nav GUI nepieciešamība, un IP adrese bija tehniski precīza termins. Lai saglabātu acu, kas paredzēti tiem, un no maniem favorītiem vienu: Šis viena ir nedaudz vairāk mistiskā, jo jums ir jāzina citu valodu. Tur valodā sauc Mērķis-C, kas ir superset C. Kas nozīmē, ka C plus dažas papildu funkcijas, kuru vidū objektorientētā programmēšanas. Un tas ir valoda, kas Apple ir popularizēts iOS plānošanu. Un tāpēc šeit ir klips no cita šovs pavisam, no "Numbers" ka, ja jūs faktiski skatīties cieši jūsu TiVo un pauzes īstajā brīdī, Jūs redzēsiet, ka tas, ko viņi meklē, ir ne gluži tas, kas tiek aprakstīts. Un ļaujiet man mēģināt citu audio savienotājs šeit un redzēt, ja mēs nevaram saglabāt audio sinhroni šoreiz. Es jums "Numbers". [Cilvēks # 1] Tas ir 32-bitu IPv4 adresi. [Cilvēks # 2] IP, kas ir internets. >> Privātais tīkls. Tas ir Anita privātais tīkls. [Malan] Labi. Tas ir mērķis-C, un tas ir par daži mazulis krāsošana programmu, kā jūs varat iespējams secināt no nosaukuma mainīgā tur. Tā ka, tad, bija "Numbers". Tāpēc šodien un šonedēļ mēs ieviest mazliet no pasaules kriminālistikas un ar problēmām tādēļ kontekstu. Šodien būs saīsināts lekcija jo tur īpašs notikums šeit Vēlāk, tāpēc mēs veikt palūrēt, un kaitināt gan studentiem un vecākiem līdzīgi šodien ar dažiem no lietām, kas ir pie horizonta. Starp tiem, kas pirmdien, jums būs vēl dažus klasesbiedrus. EDX, Harvardas un Mits jaunu tiešsaistes iniciatīva atklātu kursprogrammatūru un vairāk, sāk uz Hārvardas universitātes pirmdien. Kas nozīmē, nāk pirmdiena jums būs - kā pagājušajā skaits, 86.000 papildu klasesbiedru tiks pēc kopā ar CS50 lekcijām un sekcijas un walkthroughs un problēmu komplekti. Un kā daļa no šī, jūs kļūtu par atklāšanas klases CS50 un tagad CS50x. Kā daļu no šī, tagad saprotam, ka būs daži upsides kā arī. Lai iegūtu gatavs, par masveida studentu skaita, pietiek pateikt, ka, lai gan mums ir 108 TFS un CAS, ne gluži labākais studentu / skolotāju attiecība, tiklīdz mēs hit 80.000 citiem studentiem. Tāpēc mēs nebrauksim, lai šķirošanas tik daudz problēmu kopas manuāli. Tāpēc ieviesa šonedēļ problēmu kopumu būs CS50 Pārbaudīt, kas būs komandrindas lietderība ietvaros iekārtas ka jūs saņemsiet, kad jūs atjaunināt to vēlāk šajā nedēļas nogalē, un jūs varēsiet vadīt komandu, pārbaudiet 50, par savu PSET, un jūs saņemsiet dažas atsauksmes par to, vai jūsu programma ir pareizi vai nepareizi, saskaņā ar dažādiem dizaina specifikācijām, kas mēs esam sniegta. Tā vairāk par to un problēmu kopums specifikācija un ka CS50x klasesbiedru tiks izmantojot to kā labi. Tātad problēma komplekts 4 ir visu par kriminālistiku. Un šis gabals iedvesmoja daži reālās dzīves sīkumi, kad, kad es biju absolvents skolā, es internēti uz brīdi ar Middlesex County District Attorney birojs dara kriminālistikas darbu ar savu svina kriminālistikas pētnieks, un ko tas sasniedza ir, es domāju, ka es teicu atrodas dažu nedēļu pagātni, ir masa Valsts policijas vai citu nāks, tie varētu samazināties pie lietas, piemēram cieto disku un CD un disketes un tamlīdzīgi, un tad par kriminālistikas biroja mērķis bija noskaidrot, vai tur bija vai nebija pierādījumu par sava veida. Tas bija Īpašā izmeklēšanas dienests, tāpēc tas bija balto apkaklīšu noziegumiem, tas bija vairāk nepatīkamas veida noziegumiem, kaut iesaistot kādu digitālo mediju, izrādās, ka nemaz tik daudz cilvēku rakstiet e-pastu, sakot "es to darīja." Tik bieži šie kriminālistikas meklējumi neieradās visu, ka daudz augļu, bet dažreiz cilvēki varētu rakstīt šādas vēstules. Tāpēc dažreiz centieni tika atalgoti. Bet novest līdz šim tiesu PSET, mēs būtu ieviest 4 PSET bitu grafiku. Lai jūs, iespējams veikt šīs lietas par pašsaprotamu, JPEG, GIF un piemēram, šajās dienās, bet, ja jūs patiešām domājat par to, attēlu, līdzīgi Rob sejā, varētu tikt veidota kā secību punktiņiem, vai pikseļiem. Tagad, ja Robs sejas, tur ir visi krāsu veidu, un mēs sākām redzēt atsevišķus punktus, otherwide pazīstams kā pikseļi, kad mēs sākām, lai tuvinātu collas Bet, ja mēs vienkāršotu pasauli mazliet, un tikai saka, ka tas šeit ir Rob melnā un baltā, labi, lai pārstāvētu melnā un baltā, mēs varam tikai izmantot bināro. Un, ja mēs spēsim izmantot bināro, 1 vai 0, mēs varam paust šo pašu attēlu of Rob s smaidošu seju ar šo modeli biti: 11000011 pārstāv balts, balts, melns, melns, melns, melns, balts balts. Un tāpēc tas nav milzīgs lēciens, tad, lai sāktu runāt par krāsainiem fotoattēliem. Lietas, kas jūs varētu redzēt uz Facebook vai veikt ar digitālo kameru, bet, protams, kad runa ir par krāsu, jums ir nepieciešams vairāk bitu. Un diezgan izplatīta pasaulē fotogrāfijām ir izmantot ne 1-bitu krāsu, jo tas liecina, bet 24-bitu krāsu, kur jūs faktiski iegūt miljoniem krāsu. Tā kā gadījumā, ja mēs pietuvināto par Rob acīm, kas bija jebkurš skaits miljoniem dažādu krāsains iespējām. Tāpēc mēs ieviest šo problēmu kopums 4, kā arī ar walkthrough, kas būs šodien, 03:30, nevis parasto 02:30 jo piektdienas lekciju šeit. Bet video būs tiešsaistē, kā parasti, rīt. Mēs arī jūs iepazīstināt ar citu faila formātu. Tātad tas ir apzināti domāts, lai apskatīt iebiedēt sākumā, bet tas ir tikai daži dokumenti par C struct. Izrādās, ka Microsoft, gadus atpakaļ, palīdzēja popularizēt šo formātu, sauc bitkartes failu formātā, BMP un tas bija super-vienkārša, krāsains grafisko failu formātu, kas tika izmantota jau ilgu laiku un dažreiz vēl tapetes uz galddatoriem. Ja jūs domājat, atpakaļ uz Windows XP un pakalniem un zilas debesis, ka parasti bija BMP, vai bitkartes attēlu, un bitkartes ir jautri mums, jo viņiem ir mazliet vairāk sarežģītību. Tas nav tik vienkārši, kā šo režģa 0 un 1 ir; Tā vietā, jums ir lietas, piemēram, galveni sākumā failu. Tātad citiem vārdiem sakot, iekšpusē. Bmp faila ir viss ķekars 0 un 1 s, bet tur ir dažas papildu 0 un 1 ir tur. Un izrādās, ka tas, ko mēs esam droši par pašsaprotamu gadus, failu formātus, piemēram,. doc vai. xls vai. mp3 vai. mp4, neatkarīgi no failu formāti, ka jūs esat iepazinušies ar. Nu, ko tas vēl nozīmē būt faila formāts? Jo beigās, dienā, visi šie faili mēs izmantojam ir tikai 0 un 1 s un varbūt tiem, 0 un 1 s pārstāvēt, b, c, izmantojot ASCII vai tamlīdzīgi, bet līdz beigām dienā, tas ir tikai 0 un 1 ir. Tik cilvēki tikai reizēm nolemj izgudrot jaunu faila formātu kur viņi standartizēt kāda modeļus bitiem būs patiesībā nozīmē. Un šajā gadījumā šeit, ļaudīm, kas paredzēti bitkartes failu formātu teica, ka pašu pirmo baitu bitkartes failu, kas apzīmēts ar 0 offset, tur, tur būs daži cryptically nosaukts mainīgo sauc bfType, kas vienkārši stāv uz bitkartes failu tipa, kāda veida bitkartes failu tas ir. Jūs varat secināt, varbūt, no otrās rindas, ka ofseta 2, baitu skaits 2 ir modelis 0 un 1 ir kas pārstāv ko? Par kaut lielumu, un tas iet no turienes. Tātad problēma komplektā 4, jums tiks gāja caur kādu no šīm lietām. Mēs ne galu galā rūpes par viņiem visiem, bet pamanāt, ka tas sāk iegūt interesantu ap līnijai vai baits 54, rgbtBlue, zaļš un sarkans. Ja esat kādreiz dzirdējuši akronīms RGB, sarkans zaļš zils, tas ir atsauce uz to. Jo izrādās jūs varat krāsu visu varavīksnes krāsās ar kādu kombināciju sarkanā un zilā un zaļā. Un, patiesībā, telpā vecāki varētu atgādināt dažus no senākajiem projektoru. Šajās dienās, jūs vienkārši jāredz 1 spilgta gaisma nāk no lēcas. Bet atpakaļ dienā, jums bija sarkano lēcu, zilo objektīvs, un zaļo lēcas un kopā viņi mērķis ekrānu un veido krāsainu attēlu. Un diezgan bieži vidējā skolas un vidusskolas būtu šos lēcas arvien tā nedaudz šķībi, tāpēc jums bija sava veida redzes dubultošanās vai trīskāršā attēlus, bet tas bija ideja. Jums bija sarkanā un zaļā un zilā gaisma krāsošana attēlu. Un tas pats princips tiek izmantots datoros. Tātad starp uzdevumiem, tad, lai jums problēmu noteikts 4 ir būs dažas lietas, viens ir faktiski mainītu attēlu. Veikt ar daudziem 0 un 1 s, skaitlis, kura gabalus 0 un 1 ir pārstāvēt ko konstrukcijā, piemēram, tas, un tad izdomāt, kā atkārtot pikseļi: Sarkanās, blūza, zaļumi iekšā tā, ka tad, kad attēls izskatās sākotnēji, kā varētu izskatīties šis vietā pēc tam. Starp citām problēmām, arī būs, ka jums tiks nodota kriminālistikas tēlu faktisko failu no digitālās kameras un par šo kameru, reiz bija viss ķekars fotogrāfijas. Problēma ir, mēs nejauši izdzēsti vai bija attēla bojāts kaut kā. Sliktas lietas notiek ar digitālo kameru, un tāpēc mēs ātri nokopēt visi 0 un 1 s off šo karti, lai jūs, saglabāt tos visus 1 lielā failā, un tad mēs nodot tos jums jo problēma noteikti 4, lai jūs varētu uzrakstīt programmu C, ar kuru atgūt visus šos JPEG, ideāli. Un izrādās, ka JPEG, pat ja viņi nedaudz par sarežģītu faila formātā, viņi daudz sarežģītāka nekā šajā smaidošas sejas šeit. Izrādās, ka katrs JPEG sākas ar tiem pašiem modeļiem 0 un 1 ir. Tātad, izmantojot kamēr cilpa, vai par cilpas vai līdzīgu, Jūs varat atkārtot pār visu 0 un 1 ir šajā kriminālistikas tēlu un katru reizi, kad jūs redzēt īpašu modeli, kas ir definēta šī problēma set specifikācijai, Jūs varat pieņemt, "Ak, šeit ir, ar ļoti lielu varbūtību, sākums JPEG, "un, tiklīdz jūs atrast pats modelis, daži baitu skaits vai kilobaiti vai megabaitiem vēlāk, Jūs varat pieņemt, "Ooh! Šeit ir otrais JPEG foto man bija pēc pirmā. Ļaujiet man apstāties lasot šo pirmo failu, sāciet rakstīt šo jaunu. " Un jūsu programmas 4 PSET produkcija būs tik daudz kā 50 JPEG. Un, ja tas nav 50 JPEG, jums ir mazliet cilpu. Ja Jums ir bezgalīgs skaits JPEG, Jums ir bezgalīgs cilpa. Tā ka, arī būs diezgan izplatīta lieta. Tas, ko ir pie horizonta. Viktorīna 0, aiz mums. Realizēt, katru manu e, ka vienmēr tur ir ļaudis kuri abi ir laimīgi, neitrāls, un skumji ap viktorīnā 0 Time. Un, lūdzu, vērsties pie manis, tad galvas TFS, Zamyla, savu TF vai viens no CA, ka jūs zināt, ja jūs vēlētos, lai apspriestu, kā lietas gāja. Tātad, lai ieskaidrot vecākiem šeit telpā, kāda ir CS50 bibliotēka? Labs darbs. Kas CS50 bibliotēka? Yeah? [Studentu atbildes, nesaprotami] >> Labi, labi. Tātad, tas ir iepriekš uzrakstīta kopa koda ka mēs, darbinieki, rakstīja, mēs piedāvājam Jums, lai sniegtu dažas kopējas funkcijas. Sīkumi, piemēram, saņemt man virkni; saņemt mani int, visas funkcijas, kas ir uzskaitītas šeit. Sākot no šī brīža, mēs sākam, lai patiesi ņemtu šos mācību riteņiem off. Tāpēc mēs esam gatavojas sākt atņemt "string" no jums, kas, atceraties, bija tikai sinonīms kāda faktiskā datu tips? char *. Tātad vecākiem, kas, iespējams, bija - tas ir labi, tāpēc char * mēs sāksim redzēt uz ekrāna vēl jo mēs noņemt "string" no mūsu leksikas, vismaz ja runa ir faktiski rakstot kodu. Tāpat, mēs pārtraukt izmantot kādu no šīm funkcijām tik daudz, jo mūsu programmas ir gatavojas saņemt sarežģītākas nevis vienkārši uzrakstīt programmu, kas sēž tur ar ātru mirgo, gaida, lai lietotājs varētu rakstīt kaut ko iekšā Jūs saņemsiet savu ieguldījumu no citurienes. Piemēram, jūs saņemsiet tos no vairākiem bitiem uz vietējo cieto disku. Jūs tā vietā saņemt tos nākotnē no tīkla savienojumu, daži mājas kaut kur. Tāpēc pieņemsim Noņemiet šo slāni pirmo reizi, un uzvilkt CS50 ierīci un šo failu sauc CS50.h, kurā jūs esat bijis straujš tostarp nedēļas. Bet pieņemsim patiesībā redzēt, kas ir iekšā šo. Tātad no faila zilā top ir tikai viss ķekars komentārus, garantijas informācija un licencēšanu. Tas ir sava veida kopīgu paradigmas programmatūru, jo programmatūras daudz šajās dienās ir tas, ko sauc par "atvērtā koda" kas nozīmē, ka kāds ir uzrakstījis kodu un dara to brīvi pieejamu, ne tikai palaist un izmantot, bet faktiski lasīt un mainīt un integrēt savu darbu. Tātad tas, ko jūs esat, izmantojot, atvērtā koda programmatūru, kaut arī ļoti nelielā formā. Ja es ritiniet uz leju pagātnes komentāriem, lai gan, mēs sāksim redzēt vēl daži pazīstami lietas. Tātad paziņojums augšā šeit, ka CS50.h fails ietver visu ķekars header failus. Tagad lielākā daļa no šiem mēs esam nav redzējis, bet viens ir pazīstams; kurš no šiem mēs esam redzējuši, kaut arī īsi, līdz šim? Jā, standarta bibliotēkas. Stdlib.h ir malloc, tāpēc tiklīdz mēs sākām runāt par dinamisku atmiņas sadalījumu, kas mēs būsim atpakaļ uz nākamo nedēļu, kā arī, mēs sākām ieskaitot šo failu. Izrādās, ka loģiska un patiesa un viltus nav faktiski nepastāv C, per se, ja jūs iekļaut šo failu šeit. Tāpēc mēs esam, lai nedēļas, tika arī standarta bool.h lai jūs varētu izmantot jēdzienu bool, patiess vai nepatiess. Bez tam, jums būtu sava veida viltus to un izmantot int un tikai patvaļīgi pieņemt, ka 0 ir nepatiess un 1 ir taisnība. Tagad, ja mēs ritiniet uz leju tālāk, šeit ir mūsu definīcija virknes. Izrādās, jo mēs esam teica pirms, ka, ja tas * ir nav īsti jautājumu. Jūs pat varat būt vietas visapkārt. Mēs, šajā semestrī, ir veicināt to, jo tas, lai skaidrs, ka * ir saistīts ar veidu. Bet saprast, tāpat kā bieži, ja ne mazliet biežāk, ir likt to tur bet funkcionāli tas pats. Bet tagad, ja mēs lasām, kas tālāk, pieņemsim to apskatīt teikt, GetInt, jo mēs izmantojām, ka, iespējams, pirms kaut kas cits šajā pusgadā. Un šeit ir GetInt. Tas ir tas, ko? Tas ir prototips. Tik bieži mēs esam prototipus pie mūsu galotnēm. C failus, bet jūs varat arī nodot prototipus header failus. h failus, piemēram, šo vienu šeit, lai tad, kad jūs uzrakstīt dažas funkcijas ka jūs vēlaties citiem cilvēkiem, lai varētu izmantot, kas ir tieši gadījumā ar CS50 bibliotēku, Jūs ne tikai īstenot savas funkcijas kaut ko līdzīgu CS50.c, Jūs arī nodot prototipu nav augšpusē šo failu, bet augšpusē galvenes failu, tad header fails ir kādi draugi un kolēģi arī, ar asu iekļaut savu kodu. Tātad visu šo laiku jūs esat, ieskaitot visus šo prototipu efektīvi augšpusē jūsu failu, bet ceļā uz to asu ietver mehānisms ka būtībā kopijas un pastas šo failu savā dzimtajā. Tagad, šeit ir daži diezgan detalizētu dokumentāciju. Mēs esam diezgan daudz par pašsaprotamu, ka GetInt izpaužas int, bet izrādās tur ir daži stūra gadījumi, labi? Ko darīt, ja lietotājs veidiem vairākās kas ir pārāk liels? Quintillion, kas vienkārši nevar ielikt no int? Kāda ir paredzamā rīcība? Nu, ideāli, tas ir prognozējama. Tātad šajā gadījumā, ja jūs faktiski lasīt smalka drukāt, Jūs redzēsiet, ka, ja līnija nav iespējams izlasīt, šī atgriešanās INT_MAX. Mēs nekad par to runāja, bet gan balstoties uz tās kapitalizācijas, kas tas ir, iespējams? Tas ir nemainīgs, tāpēc tas ir dažas īpašas konstante, kas ir iespējams, paziņoja Kādā no šīm header failus, kas ir līdz lielāks failu, un INT_MAX ir iespējams kaut kas līdzīgs, apmēram, 2 miljardus. Ideja ir tāda, ka, jo mums ir nepieciešams, lai kaut kā neizsaka ka kaut kas nogāja greizi, mēs, jā, ir 4000000000 skaitļus mūsu rīcībā, negatīvs 2 miljardus līdz 2 miljardiem, sniegt vai pieņemt. Nu, kāda ir izplatīta programmēšanas ir jums nozagt tikai vienu no šiem skaitļiem. Varbūt 0, varbūt 2 miljardus, varbūt negatīvs 2 miljardiem. Tātad jūs pavadīt kādu no saviem iespējamo vērtību, lai jūs varētu izdarīt uz pasauli ka, ja kaut kas noiet greizi, es atgriezīšos šo super-liela vērtība. Bet jūs nevēlaties lietotājs rakstīt kaut noslēpumains līdzīgu "2, 3, 4 ..." par patiešām lielu skaitu, ja jūs vispārināt vietā kā nemainīgu. Tik tiešām, ja jūs to anālo pēdējo nedēļu, jebkurā laikā jūs aicinu GetInt, jums vajadzētu būt pārbaudei ar IF stāvoklī. Darīja lietotāja tipu, kas INT_MAX, vai precīzāk, darīja GetInt atgriezties INT_MAX? Jo, ja tā notiktu, kas faktiski nozīmē, ka tie nav ierakstiet to, kaut kas nogāja greizi šajā lietā. Tātad tas ir tas, ko parasti sauc par "Sentinel" vērtība, kas nozīmē tikai to īpašu. Nu, pieņemsim tagad vērsties pie. C failus. C fails pastāvējis ierīces kādu laiku, un, patiesībā, ierīce ir tas kompilētu jums vērā, ka lieta, ko mēs sauc par "objekta kodu" bet tas vienkārši nav svarīgi, lai jūs, ja tas ir tāpēc sistēma zina, Šajā gadījumā, ja tā ir, ierīce. Bet pieņemsim ritiniet tagad GetInt, un redzēt, kā GetInt ir strādājusi visu šo laiku. Tātad šeit mums ir līdzīgas komentārus pirms tam. Ļaujiet man tuvinātu tikai koda daļu, un ko mēs esam par GetInt ir šādi. Tas aizņem nav ievadi un tas atgriež int, kamēr (patiess), tāpēc mums ir tīšu bezgalīgu cilpu bet, domājams, mēs izkļūt no šīs kaut vai atgriezties no šī. Tātad, pieņemsim redzēt, kā tas darbojas. Nu, mēs, šķiet, izmantojot GetString Šajā pirmajā rindā iekšpusē cilpa, 166. Tagad tas ir laba prakse, jo kādos apstākļos varētu GetString atgriezties šo īpašo atslēgvārdu, null? Ja kaut kas noiet greizi. Kas varētu iet nepareizi, ja jūs zvanīt kaut kas līdzīgs GetString? Yeah? [Studentu atbilde, nesaprotami] >> Jā. Tāpēc varbūt malloc neizdodas. Kaut kur zem pārsega GetString zvana malloc, kas piešķir atmiņu, kas ļauj datoru veikals visas rakstzīmes, ka lietotājs uz klaviatūras. Un pieņemsim, lietotājs bija visai daudz brīva laika un drukāti vairāk, piemēram, nekā 2 miljardiem rakstzīmes. Vairāk zīmēm nekā datora pat ir RAM. Nu, GetString ir jāspēj apliecina, ka ar jums, pat ja tas ir super, super retāk stūra gadījums. Tas ir kaut kā jāspēj rīkoties ar šo, un tā GetString, ja mēs ejam atpakaļ un lasīt tās dokumentāciju, tas, patiesībā, atgriezties null. Tagad, ja GetString neizdodas, atgriežoties null, GetInt gatavojas neveiksmei , atgriežoties INT_MAX, tāpat kā Sentinel. Šie ir tikai cilvēka konvencijas. Vienīgais veids, kā jūs varētu zināt, tas ir gadījums ir, lasot dokumentus. Tāpēc pieņemsim ritiniet uz leju, kur int ir faktiski GotInt. Tātad, ja es ritiniet uz leju mazliet tālāk, 170 līnija mums ir komentāru virs šīm līnijām. Tātad mēs paziņojam, 172, int n un char C, un tad šī jaunā funkcija ko daži no jums ir stumbled pāri pirms, bet sscanf. Tas nozīmē stīgu skenēšanas f. Citiem vārdiem sakot, man stīgu un es skenēt to informācijas daļas interesi. Tātad, ko tas nozīmē? Nu, pieņemsim, ka es rakstīt, burtiski, 1 2 3 pie klaviatūras, un tad hit ienākt. Kas ir datu tips 1 2 3 kad atgriezās ar GetString? Tas acīmredzot virkne, labi? Man virkni, lai 1 2 3 ir patiešām "1 2 3" ar \ 0 beigās tā. Tas nav int. Tas nav skaitlis. Tas izskatās numuru, bet tas nav reāli. Tātad, ko tas GetInt jādara? Tā ir skenēšanas, ka virkne no kreisās uz labo 1 2 3 \ 0, un kaut kā pārvērst to faktisko skaitlim. Tagad jūs varētu izdomāt, kā to izdarīt. Ja jūs domājat, atpakaļ uz 2 PSET, jums, iespējams, ieguvuši nedaudz ērts ar ķeizaru vai vigenere lai jūs varētu atkārtot pār virkni, Jūs varat pārvērst chars uz Ints ar pick. Tas ir visai daudz darba. Kāpēc ne zvanu funkciju, piemēram sscanf ka tas, ka jums? Tātad sscanf sagaida argumentu, kas šajā gadījumā sauc līnija, kas ir virkne. Jūs tad norādiet, pēdiņās, ir ļoti līdzīgi printf, ko jūs gaidīt, lai redzētu šo string? Ko es saku šeit ir, es gaidīt, lai redzētu decimālskaitlis un varbūt raksturu. Un mēs redzēsim, kāpēc tas tā ir tikai brīdi. Izrādās, ka šis apzīmējums ir tagad atgādina sīkumi Mēs sākām runāt par nedaudz vairāk nekā pirms nedēļas. Kas ir & N un & c darot mums šeit? [Studentu atbildes, nesaprotami] >> Jā. Tas dod man adresi n un adrese c. Tagad, kāpēc ir tik svarīgi? Nu, jūs zināt, ka ar funkcijām C Jūs vienmēr varat atgriezties vērtību vai nav vērtības. Jūs varat atgriezties int, virkne, pludiņa, char, neatkarīgi. Vai jūs varat atgriezties tukšumu, bet jūs varat atgriezties tikai 1 lieta maksimāli. Bet šeit mēs vēlamies sscanf atgriezties man varbūt int, decimālskaitlis, un arī palija, un es paskaidrošu, kāpēc CHAR brīdi. Tātad jūs faktiski vēlaties f atgriezties 2 lietas, tas vienkārši nav iespējams C. Tātad jūs varat strādāt ap ka, laižot 2 adreses, jo tiklīdz jūs nodot funkciju 2 adreses, ko var šo funkciju darīt ar viņiem? Tā var rakstīt uz šīm adresēm. Jūs varat izmantot * operāciju un "iet tur" katrai no šīm adresēm. Tas ir sava veida šo backdoor mehānismu, bet ļoti bieži mainot mainīgo lielumu vērtības vairāk nekā tikai 1 vietu, šajā gadījumā 2. Tagad, ievērosiet, es esmu pārbaudot ar1 ==, un pēc tam atgriežas n ja tas patiesībā novērtē taisnība. Tātad, kas notiek? Nu, tehniski, visi mēs patiešām vēlamies, lai notiktu, GetInt tas ir. Mēs vēlamies, lai parsēt, tā sakot, mēs vēlamies, lai izlasītu string "1 2 3", un, ja izskatās, ka tur ir vairāki tur, ko mēs esam spēcīgi sscanf darīt, ir nodot šo numuru, 1 2 3, šajā mainīgā n par mani. Kāpēc tad tomēr man ir tas, kā arī? Kāds ir arī sakot, sscanf, jūs varētu arī saņemt raksturs šeit loma. [Studentu runājot, nesaprotami] >> Nav - decimālais punkts varētu darboties. Pieņemsim turēt kas domāja par brīdi. Kas vēl? [Studentu, nesaprotami] >> Tātad, laba doma, tas varētu būt NULL raksturs. Tas tiešām nav, šajā gadījumā. Yeah? [Studentu, nesaprotami] >> ASCII. Vai arī ļaujiet man vispārināt vēl vairāk. Lielāks% c tur ir tikai kļūdu labošanas. Mēs negribam, lai būtu varonis pēc skaita, bet ko tas man ļauj to darīt, ir šādi: Izrādās, ka sscanf papildus uzglabāšanai vērtības n un C, šajā piemērā šeit, ko tas arī ir tas atgriež skaitu mainīgo tas likts vērtības iekšā Tātad, ja jūs tikai rakstīt 1 2 3, tad tikai% d gatavojas, lai atbilstu un tikai n izpaužas uzglabā ar vērtību, piemēram, 1 2 3 un nekas izpaužas likts C; c paliek atkritumu vērtību, lai runāt. Atkritumu jo tas nekad nav bijis inicializēta par kādu vērtību. Tātad šajā gadījumā, sscanf atgriež 1, jo es apdzīvo vienu no šiem norādes, tādā gadījumā, lieliski. Man ir int, tāpēc es atbrīvotu līniju, lai atbrīvotu atmiņu ka GetString faktiski piešķirti, un tad es atgriezties n. Cits, ja jums kādreiz prātoju, kur tas retry paziņojums nāk no, nāk tieši no šīs vietas. Ja turpretim, es rakstīt 1 2 3 foo, tikai daži izlases secību teksta, sscanf gatavojas redzēt, ooh, numuru, ooh, numuru, ooh, numuru, Ooh - f. Un tas notiek, lai likt 1 2 3 in n. Tas notiek, lai likt f C, un pēc tam atgriezties 2. Tātad mums ir, tikai izmantojot pamata definīciju scanf uzvedību, ļoti vienkāršs veids - labi, komplekss pēc pirmā acu uzmetiena, bet beigās, dienā, diezgan vienkāršs mehānisms sakot, ir tur int, un, ja tā, ka vienīgā lieta, ka es atklāju? Un baltā telpa šeit ir apzināta. Ja jūs lasīt dokumentāciju sscanf, tā stāsta, ka, ja jūs iekļaut kādu balto laukumu sākumā vai beigās, sscanf pārāk ļaus lietotājam, kāda iemesla dēļ, lai sasniegtu spacebar 1 2 3, un tas būs likumīgs. Tas nebūs bļaut lietotājam tikai tāpēc, ka tie skāra spacebar sākumā vai beigās, kas ir tikai nedaudz vairāk lietotājam draudzīgu. Kādi jautājumi, tad, uz GetInts? Yeah? [Studentu jautājums, nesaprotami] >> Labs jautājums. Ko darīt, ja jūs vienkārši ierakstījāt palija, piemēram F un hit ienākt nekad ierakstot 1 2 3; ko jūs domājat par šo līniju kodu uzvedība tad ir? Tātad sscanf var aptvert, ka pārāk, jo šajā gadījumā, tas nav gatavojas aizpildīt n vai c, tas notiek, lai vietā atgriezties 0. Tādā gadījumā, es esmu iepatikusies arī šo scenāriju, jo paredzamā vērtība es gribu ir 1. Es tikai gribu 1, un tikai 1 lieta jāaizpilda. Labs jautājums. Citi? Visiem labi, tāpēc pieņemsim nav iet caur visu, kas šeit funkcijām, bet viens, kas, šķiet, ir, iespējams, par atlikušo procentu ir GetString jo izrādās, ka GetFloat, GetInt, GetDouble, GetLongLong visu Punt daudz to funkcionalitāti GetString. Tātad, pieņemsim to apskatīt, kā viņš tiek īstenota šeit. Tas viens izskatās mazliet sarežģīti, bet tas izmanto tos pašus pamatus ka mēs sākām runāt par pagājušajā nedēļā. Tātad GetString, kas neņem argumentu kā vienu tukšumā šeit, un tas atgriež virkni, tāpēc es esmu deklarējot virkni sauc buferis. Man nav īsti zināt, ko tas notiek, lai izmantot vēl, bet mēs redzēsim. Izskatās, jauda ir, pēc noklusējuma, 0; nav gluži pārliecināts, kur tas notiek. Nav pārliecināts, ko n gatavojas izmantot vēl. Bet tagad tas kļūst nedaudz vairāk interesants, lai 243 rindā, mēs paziņojam int c, tas ir sava veida stulba detaļām. Char ir 8 biti, un 8 biti var uzglabāt cik atšķirīgas vērtības? 256. Problēma ir, ja jūs vēlaties, lai ir 256 dažādas ASCII rakstzīmes, kas ir, ja jūs domājat atpakaļ, un tas nav kaut iegaumēt. Bet, ja jūs domājat atpakaļ uz šo lielo ASCII topā mums bija nedēļas atpakaļ, tur bija, jo šajā gadījumā, 128 vai 256 ASCII rakstzīmes. Mēs izmantojām visus modeļus 0 un 1 ir atkarīgs. Tas ir problēma, ja jūs vēlaties, lai varētu konstatēt kļūdas. Jo, ja jūs esat jau izmanto 256 vērtības jūsu rakstzīmes, Jums nav īsti plānot uz priekšu, jo tagad jums nav veids, kā pateikt, "Tas nav legit raksturs, tas ir daži kļūdains ziņa." Tātad, ko pasaule dara, ir, viņi izmanto nākamo lielāko vērtību, kaut kā int, lai jums ir traks bitu skaitu, 32 4000000000 iespējamo vērtību, lai jūs varat vienkārši galu galā, izmantojot, būtībā, 257 no tām, kura 1 ir dažas īpaša nozīme kā kļūda. Tātad, pieņemsim redzēt, kā tas darbojas. 246 rindā, man ir šī lielā kamēr cilpa kas zvana fgetc; f nozīmē failu, getc, un tad stdin. Izrādās tas ir tikai precīzāk veids, kā pateikt "lasīt ievadi no klaviatūras." Standarta patēriņš ir klaviatūra, standarta produkcija ir ekrāns, un standarta kļūda, ko mēs redzēsim 4 PSET, nozīmē ekrānu, bet īpašu daļu no ekrāna, lai tas nav nesaista ar faktisko produkciju, kas jums paredzēts drukāt, bet vairāk par to nākotnē. Tik fgetc nozīmē tikai lasīt vienu rakstzīmi no klaviatūras, un uzglabāt to, kur? Uzglabāt to C, un pēc tam pārbaudiet, tāpēc es esmu tikai izmantojot dažas boolean saikļi šeit, pārbaudiet, vai tas nav vienāds \ n, tāpēc lietotājs ir hit ienākt. Mēs vēlamies, lai apturētu šajā punktā, gala no cilpas, un mēs arī vēlamies, lai pārbaudītu par īpašu nemainīgs, EOF, kas, ja jūs zināt vai uzminēt - ko tas kandidēt? Faila beigas. Tātad tas ir sava veida muļķīgi, jo, ja es esmu mašīnrakstīšanu pie klaviatūras, tur tiešām nav failu iesaistīts šajā, bet tas ir tikai sava veida vispārējs termins, ko izmanto, lai apzīmētu ka nekas cits nāk no cilvēka pirkstiem. EOF. Faila beigas. Kā malā, ja jūs esat kādreiz hit kontroles D pie tastatūras, nav, ka jums būtu vēl, jūs esat hit kontroles c. Bet kontrole d nosūta šo īpašo nemainīgu sauc EOF. Tāpēc tagad mums vienkārši ir dažas dinamisku atmiņas sadalījumu. Tātad, ja n 1> tilpums, tagad es ņemšu izskaidrot n. n cik daudz baitu pašlaik buferī, virkne, kas jūs pašlaik veidojot no lietotāja. Ja jums ir vairāk rakstzīmes jūsu bufera nekā jums ir spējas buferi, intuitīvi, kas mums ir jādara, tad ir piešķirt vairāk jaudas. Es esmu gatavojas iziet vairāk nekā daži no aritmētiskā šeit un koncentrēties tikai uz šo funkciju šeit. Jūs zināt, ko malloc ir, vai vismaz vispār pazīstami. Veikt uzminēt ko realloc dara. [Studentu atbilde, nesaprotami] >> Jā. Un tas nav gluži pievienojot atmiņas, tas pārvieto atmiņu šādi: Ja tur vēl iespējams beigās virknes, lai dotu jums vairāk, ka atmiņas nekā tas sākotnēji dod jums, tad jūs saņemsiet, ka papildu atmiņu. Tātad jūs varat vienkārši liekot stīgas rakstzīmes atpakaļ atpakaļ atpakaļ atpakaļ. Bet, ja tas nav gadījums, jo jūs gaidīja pārāk ilgi un kaut izlases ieguva plopped atmiņā tur, bet tur ir papildu atmiņa šeit lejā, tas ir labi. Realloc gatavojas darīt visu smago celšanas jums, pārvietot string esat lasījuši līdz šim no šejienes, likt to tur lejā, un pēc tam sniedz jums dažas vairāk skrejceļu tajā brīdī. Tātad ar viļņa rokas, ļaujiet man teikt, ka tas, ko GetString dara ir tas sāk ar mazu buferi, varbūt 1 vienu rakstzīmi, un ja lietotājs veidiem 2 burtiem, GetString nonāks zvana realloc un saka, "Ooh, 1 raksturs nebija pietiekami. Dodiet man 2 rakstzīmes. " Tad, ja jūs izlasīt loģikas cilpas, tas būs teikt, "Ooh, lietotājs drukāti 3 burtiem. Dodiet man tagad nav 2, bet 4 rakstzīmes, tad dod man 8, tad dod man 16 un 32. " Fakts, ka es esmu Apjoma divkāršošana katru reizi nozīmē, ka bufera nav dodas uz aug lēni. Tas notiek, lai augt super ātri, un kādi varētu būt priekšrocība, ka? Kāpēc man divkāršojot buferi, lai gan lietotājs varētu vienkārši vajag 1 papildus raksturs no klaviatūras? [Studentu atbilde, nesaprotami]. >> Kas tas ir? Tieši tā. Jums nav augt to tik bieži. Un tas ir tikai sava veida - jūs esat nokļuvis hedžēšanas savas likmes šeit. Ideja ir, ka jūs nevēlaties, lai izsauktu realloc daudz, jo tā mēdz būt lēns. Jebkurā laikā jūs lūgt operētājsistēmu atmiņas, kā jūs drīz redzēt turpmākajā problēmu kopumu, tai ir tendence ņemt kādu laiku. Tādējādi samazinot šo laiku, pat ja jūs izšķērdēt dažas vietas, mēdz būt laba lieta. Bet, ja mēs lasām cauri pēdējo daļu GetString šeit, un atkal, izprotot katru rindiņu šeit nav tik svarīgi šodien. Bet paziņo, ka tas beidzot aicina malloc atkal, un tā piešķir tieši tā, kā daudzi baitus, jo tai ir par virkni un tad met prom, piezvanot bez maksas, pārāk liels buferis, ja tas tiešām got dubultojās pārāk daudz reižu. Īsi sakot, tas ir kā GetString ir strādājusi visu šo laiku. Viss tas ir lasīt vienu rakstzīmi laikā atkal un atkal un atkal un katru reizi, ir vajadzīgas dažas papildu atmiņu, tā lūdz operētājsistēmu par to, zvanot realloc. Kādi jautājumi? Labi. Uzbrukums. Tagad, kad mēs saprotam norādes, vai vismaz arvien iepazinušies ar norādes, pieņemsim apsvērt, kā visa pasaule sāk sabrukt ja jums nav gluži aizstāvēt pret sacīkstes lietotājiem, cilvēki, kas cenšas kapāt jūsu sistēmā. Cilvēki, kas cenšas nozagt jūsu programmatūru, apejot kādu reģistrācijas kodu ka viņi citādi varētu būt rakstīt collas Veikt apskatīt šo piemēru šeit, kas ir tikai C kodu kas ir funkcija galvenais apakšā, kas izsauc funkciju foo, un kāda ir tā iet uz foo? [Studentu] viena arguments. >> Vienu argumentu. Tātad argv [1], kas nozīmē pirmo vārdu lietotājs drukāti pie komandrindas pēc a.out vai kāds programmu sauc. Tātad foo, augšā, veic, char *, bet char * ir tieši tas, ko? Stīgu. Nav nekas jauns šeit, un ka virkne ir patvaļīgi tiek saukta bārs. Šajā rindā šeit, char c [12], kas veida daļēji tehniskās angļu, kas ir šī līnija dara? Masīvs -? Rakstzīmes. Dodiet man masīvu 12 rakstzīmes. Lai mēs varētu nosaukt šo buferi. Tas ir tehniski sauc c, bet programmēšanā buferis nozīmē tikai ķekars kosmosa, ka jums var likt dažus stuff iekšā Tad visbeidzot, memcpy, mēs esam nav izmantots agrāk. Bet jūs varat droši uzminēt, ko tā dara. Tā kopijas atmiņu. Ko tas dod? Nu, tas acīmredzot kopē bārs, tās ieejas, uz C, bet tikai līdz garumu joslas. Bet tur ir kļūda šeit. Labi, tāpēc tehniski mums patiešām vajadzētu darīt, strlen (bar) x sizeof (char), kas ir pareizs. Bet sliktākajā gadījumā šeit, pieņemsim, ka That - tik, labi. Tad tur ir 2 kļūdas. Tātad sizeof (char), labi, pieņemsim, tas mazliet plašāks. Tāpēc tagad tur ir vēl kļūda, kas ir tas, ko? [Studentu atbilde, nesaprotami] >> Pārbaudīt par ko? Labi, lai mēs būtu pārbaudei for null, jo sliktas lietas notiek, ja jūsu rādītājs ir NULL, Jo jūs varētu galu galā iet tur, un jums nevajadzētu kādreiz ir iet uz NULL ar dereferencing to ar * operatoru. Tā ka ir labs, un ko vēl mēs darām? Loģiski tur plaisāt arī šeit. [Studentu atbilde, nesaprotami] >> Tāpēc pārbaudiet, ja argc ≥ 2? Labi, tāpēc tur ir 3 bugs šajā programmā šeit. Mēs esam ne pārbaude, ja lietotājs faktiski drukāti jebko ARGV [1], labā. Tātad, kāda ir trešā kļūda? Yeah? [Studentu atbilde, nesaprotami] >> Labi. Tāpēc mēs pārbaudījām vienu scenāriju. Mēs netieši jāpārbauda nav kopēt vairāk atmiņas nekā tas būtu ilgāks par bāru. Tātad, ja virkne lietotājs drukāti ir 10 rakstzīmes garš, tas saka, "Tikai kopēt 10 rakstzīmes." Un tas ir labi, bet kas notiks, ja lietotājs drukāti vārdu uzvednē piemēram, 20 rakstzīmju vārdu, tas ir, sakot kopēt 20 rakstzīmes no bāra uz ko? c, citādi zināma kā mūsu buferis, kas nozīmē, ka jūs tikko rakstīja datus līdz 8 baitu vietām, kas jums nepieder, un jums nepieder viņiem tādā nozīmē, ka jūs nekad piešķirtā tos. Tātad tas ir tas, ko parasti sauc par bufera pārpildes uzbrukumu, vai buferis pārsniegts uzbrukumu, un tas ir uzbrukums, kas nozīmē, ka, ja lietotājs vai programma, kas zvana savu funkciju dara to ļaunprātīgi, kas patiesībā notiek tālāk varētu būt diezgan slikti. Pieņemsim to apskatīt šo attēlu šeit. Šis attēls atspoguļo jūsu kaudze atmiņas. Un atcerēties, ka katru reizi, kad jūs zvanu funkciju, Jūs saņemsiet šo maz rāmi kaudze un tad vēl un tad vēl un tad vēl. Un līdz šim mēs esam tikai veida iegūtā šos prom kā taisnstūros nu tur uz klāja vai uz ekrāna šeit. Bet, ja mēs tuvinātu par vienu no šiem taisnstūriem, kad jūs zvanu funkciju foo, izrādās, ka tur ir vairāk uz skursteņa iekšpusē ka rāmis un šo taisnstūri nekā tikai x un y un a un b, tāpat mēs to runājam swap. Izrādās, ka ir daži zemāka līmeņa detaļas, starp tiem atgriezties adresi. Tātad izrādās, kad galvenais aicina foo, galvenais ir, lai informētu foo Kādi ir galvenie adrese ir datora atmiņā. Jo citādi, tiklīdz foo tiek darīts izpildes, kā šajā gadījumā šeit, kad jūs sasniedzat šo ciešo cirtaini lencēm beigās foo, kā heck tas foo zina, kur kontrole programmas ir vajadzēja iet? Izrādās, ka atbilde uz šo jautājumu ir šajā sarkanā taisnstūrī šeit. Tas ir rādītājs, un tas ir līdz ar datoru, lai uzglabātu, īslaicīgi, par tā saukto skursteņus no galvenā adresi, lai, tiklīdz foo tiek darīts izpildes, dators zina, kur un kādi līnija galvenais, lai dotos atpakaļ uz. Saglabāts rāmis rādītājs attiecas līdzīgi šim. Char * bar šeit pārstāv, ko? Nu, tagad tas zils segments šeit ir Foo ir rāmis, kas ir bārs? Labi, tā josla ir tikai arguments foo funkciju. Tāpēc tagad mēs esam atpakaļ pie pazīstamo attēlu. Tur ir vairāk stuff un vairāk traucējošos uz ekrāna bet tas gaiši zils segments ir tas, ko mēs esam balstoties uz tāfeles kaut ko līdzīgu swap. Tas ir par foo rāmis un vienīgā lieta, kas to tieši tagad atrodas bārs, kas ir šis parametrs. Bet kas vēl būtu kaudze, saskaņā ar šo kodu šeit? Char c [12]. Tāpēc mums vajadzētu arī redzēt 12 kvadrātus atmiņas, piešķirti mainīgo sauc c. Un tiešām mums ir kas uz ekrāna. Ļoti top tur ir c [0], un tad autors šajā diagrammā nav apnikt zīmēšanas visi kvadrātu, bet tur tiešām ir 12 tur jo, ja paskatās labajā apakšējā, c [11], ja jūs skaits no 0, ir 12 šādi baiti. Bet šeit ir problēma: Kurā virzienā ir c aug? Kārtot augšas uz leju, labi? Ja tas sāk augšā un aug uz leju, neizskatās, mēs pa kreisi sev daudz skrejceļa šeit vispār. Mēs esam veida krāsotas sevi stūrī, un ka c [11], ir tiesības uz augšu pret bāru, kas ir tiesības uz augšu pret kaudze rāmi rādītājs, kas ir tiesības uz augšu pret atpakaļadresi, tur vairs nav vietas. Tātad, kāda ir saistība, tad, ja jūs skrūvējamu augšu, un jūs mēģināt lasījums 20 baiti uz 12 baitu buferī? Kur ir šie 8 papildu baiti gatavojas doties? Iekšā viss pārējais, no kuriem daži ir super svarīgi. Un pats svarīgākais, iespējams, ir sarkans lodziņš tur, atgriešanās adrese. Jo pieņemsim, ka jums ir vai nu nejauši vai adversarially pārrakstīt šos 4 baitus, ka rādītājs adrese, ne tikai ar atkritumu, bet ar numuru, kas notiek, lai pārstāvētu faktisko adresi atmiņā? Kas implicaiton, loģiski? [Studentu atbildes, nesaprotami] >> Tieši tā. Kad foo atgriežas un hits, ka cirtaini lencēm, programma gatavojas doties ne lai atgrieztos galvenajā, tas notiek, lai atgrieztos kāds adrese ir šajā sarkanajā lodziņā. Tagad, ja apiet programmatūras reģistrācijas, kāda ir adrese, kas ir atdoti to ir funkcija kas parasti izpaužas sauc pēc esat samaksājis par programmatūru un ievadījis savu reģistrācijas kodu? Jūs varētu šķirot triks datora vērā netaisos šeit, bet, dodoties šeit. Vai, ja jūs patiešām gudrs, pretinieks var reāli ierakstīt pie klaviatūras, Piemēram, nevis faktisko vārdu, nevis 20 rakstzīmes, bet pieņemsim, viņš vai viņa veidiem dažās burtiem, kas pārstāv kodu? Un tas nav būs C kodu, tas būs rakstzīmes kas pārstāv bināro mašīna kodi 0 un 1 ir. Bet pieņemsim, ka viņi pietiekami gudri, lai to izdarītu, lai kaut ielīmēt GetString tūlītēja kaut kas būtībā ir apkopoti kodu, un pēdējie 4 baiti pārrakstīt šo deklarāciju adresi, un ko adresi tas, ka ieejas darīt? Tā veikalos šajā sarkanā taisnstūrī adrese pirmās baitu buferī. Tātad jums ir jābūt ļoti gudrs, un tas ir daudz izmēģinājumu un kļūdu par sliktiem cilvēkiem, kas tur, bet, ja jūs varat izdomāt cik liels tas buferis ir, piemēram, ka pēdējo baitu ieejas, kas jums sniedz programmai gadās būt līdzvērtīgs adresi sākumā jūsu bufera, jūs varat darīt. Ja mēs sakām, normāli, sveiki, un \ 0, ka tas, ko nonāk buferī. Bet, ja mēs vairāk gudrs, un mēs aizpildīt šo buferi ar ko mēs vispārīgi saucam uzbrukuma kods, ,,,: Uzbrukums, uzbrukums, uzbrukums, uzbrukums, ja tas ir tikai kaut kas dara kaut ko sliktu. Nu, kas notiek, ja jūs patiešām gudrs, jūs varētu darīt: Ar sarkano kastē šeit ir skaitļu secība: 80, CO, 35, 08. Ievērojiet, ka saskan ar skaitu, kas ir šeit. Tas ir apgrieztā secībā, bet vairāk par to kādu citu reizi. Ievērojiet, ka šī atgriešanās adrese ir apzināti mainīts vienāda adresi šeit, nevis adrese galvenais. Tātad, ja slikts puisis ir super gudrs, viņš vai viņa gatavojas iekļaut šajā uzbrukuma kods kaut kas līdzīgs, "Dzēst visus lietotāja failiem." Vai "Copy paroles" vai "Izveidot lietotāja kontu, ka es varu piesakāties." Kaut ko vispār, un tas ir gan briesmas un C. jauda Jo jums ir piekļuve atmiņas pa šautru un jūs varat tāpēc rakstīt visu, ko vēlaties par datora atmiņā. Jūs varat veikt dators darīt kaut ko vēlaties, vienkārši kam tas lēkā savā atmiņu. Un tā līdz šai dienai, tik daudz programmas un tik daudz portālu, kas ir apdraudēti vāra uz leju, lai cilvēki, kas izmanto šo. Un tas varētu šķist super-izsmalcinātu uzbrukumu, bet tas ne vienmēr sākas ka veidā. Realitāte ir tāda, ka to, ko slikti cilvēki parasti darīt, ir, vai tas ir pie komandrindas programma vai GUI programmu vai mājas lapā, tiek jūs vienkārši sākt sniegt muļķības. Rakstot tiešām liels vārdu, meklēšanas laukā un nospiediet Enter, un jūs gaidīt, lai redzētu, ja mājas avarē. Vai jūs gaidīt, lai redzētu, vai programma izpaužas dažas kļūdas paziņojumu. Jo, ja jums paveiksies, jo slikts puisis, un jums sniegt dažas trakas ieguldījumu ka avārijās programmu, tas nozīmē, ka programmētājs nav prognozēt savu slikto uzvedību kas nozīmē, ka jūs varat, iespējams, ar pietiekami daudz pūles, pietiekami izmēģinājumu un kļūdu, izdomāt, kā algu precīzāku uzbrukumu. Tik tik daudz drošības daļa ir ne tikai izvairīties no šādiem uzbrukumiem vispār, bet to atklāšanas un faktiski meklē baļķiem un redzēt, ko trakie izejvielas ir cilvēki drukāti savā mājas lapā. Kādi meklēšanas termini ir cilvēki drukāti uz jūsu mājas lapā, cerībā pārpildīta kādu buferi? Un tas viss aprobežojas ar vienkāršu pamati, kas ir masīvs, un ko tas nozīmē, lai sadalītu un izmantot atmiņu? Un atbilst šim, arī tas ir. Tāpēc pieņemsim tikai skatienu iekšpusē cieto disku vēlreiz. Tātad jūs atceraties no nedēļu vai divas pirms, ka tad, kad jūs vilkt failus jūsu atkritni vai trash var, kas notiek? [Studentu] Nekas. >> Jā, pilnīgi nekas. Galu galā, ja jūs darbināt zems diska vietas, Windows vai Mac OS sāks izdzēšot failus jums. Bet, ja jūs vilkt kaut ko tur, tad tas nemaz nav droši. Visas jūsu istabas biedrs, draugs vai ģimenes loceklis, ir jādara, ir divreiz uzklikšķiniet, un voila. Tur visi fragmentārie failus, mēģināja izdzēst. Tātad lielākā daļa no mums ir vismaz zināt, ka jums ir tiesības noklikšķiniet vai kontrolēt klikšķi un tukšas trash, vai kaut kas tamlīdzīgs. Bet pat tad, ka nav gluži darīt to triks. Jo kas notiek, ja jums ir fails uz cietā diska kas pārstāv kādu Word dokumentu vai kādu JPEG? Un tas nozīmē jūsu cietā diska, un pieņemsim, ka tas skaida šeit ir, ka fails, un tas sastāv no visu ķekars 0 un 1 ir. Kas notiek, ja jūs ne tikai vilkt šo failu uz miskasti vai atkritnes, bet arī iztukšojiet to? Kārtot neko. Tas nav absolūti nekas tagad. Tagad tas ir tikai nekas, jo nedaudz kaut kas notiek veidā šīs tabulas. Tātad tur ir dažas no datubāzes vai galda veida iekšpusē datora atmiņā ka būtībā ir 1 kolonnas failu vārdus, un 1 kolonna faila atrašanās vietu, kur tas varētu būt vieta 123, tikai izlases numuru. Lai mēs varētu būt kaut kas līdzīgs x.jpg un atrašanās 123. Un kas notiek tad, kad jūs iztukšot miskasti? Kas iet prom. Bet ko nav iet prom ir 0 un 1 ir. Tātad, kādi ir, tad, savienojums ar PSET 4? Nu, ar 4 PSET, tikai tāpēc, ka mēs esam nejauši izdzēsti Compact Flash karte, kas bija visu no šīm fotogrāfijām, vai vienkārši tāpēc, ka tas, ko neveiksmes kļuva bojāts, nenozīmē, ka 0 un 1 s nav joprojām. Varbūt daži no viņiem tiek zaudēti, jo kaut got bojāti tādā ziņā, ka daži 0 s kļuva 1 un 1 ir kļuvis 0 s. Sliktas lietas var notikt, jo buggy programmatūru vai bojātu aparatūru. Bet daudzi no tiem bitiem, varbūt pat 100% no tām joprojām ir tur, tas ir tikai, ka dators vai kamera nezina, kur JPEG 1 sākusies un kur JPEG 2 sākusies, bet, ja jūs, programmētājs, zināt, ar mazliet gudriem, ja šie JPEG vai ko viņi izskatās, Jūs varat analizēt 0 un 1 un saka, "Ooh. JPEG. Ooh, JPEG. " Jūs varat uzrakstīt programmu ar būtībā tikai par vai kamēr cilpa kas atgūst katru vienu no šiem failiem. Tātad mācība tad ir jāsāk "droši" dzēšot failus ja jūs vēlaties, lai izvairītos no šīs pavisam. Jā? [Studentu jautājums, nesaprotami] >> Ir vairāk atmiņas, nekā jūs agrāk - Oh! Labs jautājums. Tātad, kāpēc, tad, pēc iztukšošanas miskasti, Vai jūsu dators pateikt, ka jums ir vairāk brīvas vietas nekā jūs agrāk? Īsumā, jo tas guļ. Vairāk tehniski, jums ir vairāk vietas. Jo tagad jūs teicāt, jūs varat likt citas lietas, kur tas fails bija kādreiz, bet tas nenozīmē, ka biti dodas prom, un tas nenozīmē, ka biti tiek mainīti visi 0 s, piemēram, jūsu aizsardzību. Savukārt, ja jūs "droši" dzēst failus vai fiziski iznīcināt ierīci, kas patiešām ir vienīgais veids, reizēm, ap to. Tātad, kāpēc nav mēs atstāt šajā daļēji biedējošu piezīmi, un mēs redzēt jūs pirmdien. CS50.TV