1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [TEDEN 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [To je CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Ženska] Laže, kaj, ne vem. 5 00:00:17,780 --> 00:00:20,300 [Man] Torej, kaj vemo? 6 00:00:20,300 --> 00:00:24,120 [Ženska] To je 09:15, Ray Santoya je bil na bankomatu. 7 00:00:24,120 --> 00:00:27,420 [Man] Torej, vprašanje je, kaj je počel na 9:16? 8 00:00:27,420 --> 00:00:29,980 [Ženska] Streljanje 9 mm v nečem. 9 00:00:29,980 --> 00:00:31,900 Mogoče je videl ostrostrelca. 10 00:00:31,900 --> 00:00:34,000 [Man] Ali bi delal z njim. 11 00:00:34,000 --> 00:00:36,330 [Ženska] Čakaj. Pojdi nazaj 1. 12 00:00:36,330 --> 00:00:38,330 [Man] Kaj vidiš? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ napeto glasba] 14 00:00:44,520 --> 00:00:48,320 [Ženska] Prinesite svoj obraz navzgor. Celoten zaslon. 15 00:00:48,320 --> 00:00:51,230 [Man] Njegova očala. >> Tam je odsev. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ napeto glasba] 17 00:01:00,810 --> 00:01:03,580 [Man] To je Nuevita za baseball moštva. To je njihov logo. 18 00:01:03,580 --> 00:01:07,790 [Ženska] In on govori, da kdor je nosil to jakno. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Torej, to je CS50 teden 5, in danes smo uničiti malo televizijo in film za vas. 20 00:01:13,730 --> 00:01:16,170 Torej, ko gledaš predstavo, kot je ta v tej zadevi, 21 00:01:16,170 --> 00:01:19,910 in policisti pravijo, "Ali lahko očistite, da se dogaja?" ali "Okrepiti" 22 00:01:19,910 --> 00:01:21,900 ni okrepila v realnem svetu. 23 00:01:21,900 --> 00:01:25,220 V bistvu, kaj si res dobil je le malo kaj takega. 24 00:01:25,220 --> 00:01:27,570 Sem potegnil eno izmed zaposlenih fotografij iz strani. 25 00:01:27,570 --> 00:01:30,980 To je program, imenovan Photoshop. To je 1 od 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 od 3 Bowdens dejansko, danes, saj imamo gospo Bowden tudi tukaj, z Rob in Pavla. 27 00:01:36,300 --> 00:01:41,950 Ampak tukaj je Rob na zaslonu, in če bomo povečaj o tem sijočimi on je vedno imel v svojem očesu, 28 00:01:41,950 --> 00:01:47,600 kaj je dejansko videti je, da tisto, kar vidite, kaj dobiš. 29 00:01:47,600 --> 00:01:51,690 To je "okrepljen", tako da "CSI" so se malo narobe. 30 00:01:51,690 --> 00:01:55,190 Še en posnetek, če smo izbrali za "CSI" malce dlje. 31 00:01:55,190 --> 00:01:58,500 Ta je lep stavek, da odslej izreči, če želite 32 00:01:58,500 --> 00:02:10,280 dobro tehnično s prijatelji, ko je res, da si rekel ničesar. 33 00:02:10,280 --> 00:02:12,970 >> [Man] Že več tednov sem bil preiskuje umore Taksist Killer 34 00:02:12,970 --> 00:02:15,360 z določeno fascinacijo morbid. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] To je v realnem času. 36 00:02:17,160 --> 00:02:22,930 [Woman # 2], bom ustvariti grafični vmesnik z uporabo Visual Basic, vidim, če lahko sledim IP naslov. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Torej zvok ni bil sinhroniziran v prahi, ki ustvarja grafični vmesnik z uporabo Visual Basic 38 00:02:29,570 --> 00:02:31,820 izslediti IP naslov je popoln nesmisel. 39 00:02:31,820 --> 00:02:33,840 Te dni ga ne bi uporabljali Visual Basic, 40 00:02:33,840 --> 00:02:38,920 ni potrebe za GUI in IP-naslov je bil tehnično natančen izraz. 41 00:02:38,920 --> 00:02:41,730 Torej, bodite pozorni na to, ena izmed mojih najljubših: 42 00:02:41,730 --> 00:02:45,070 Ta je malo bolj skrivnostno, ker morate vedeti, drugačen jezik. 43 00:02:45,070 --> 00:02:47,860 Tam je jezik imenuje Objective-C, ki je nadgradnja C. 44 00:02:47,860 --> 00:02:51,960 Kar pomeni, da je C plus nekaj dodatnih funkcij, med njimi objektno programiranje. 45 00:02:51,960 --> 00:02:55,070 In to je jezik, ki ga je Apple iOS populariziral za programiranje. 46 00:02:55,070 --> 00:02:58,760 In tukaj je posnetek iz drugega predstavo v celoti, iz "Numbers" 47 00:02:58,760 --> 00:03:02,450 da če dejansko pogledate pozorno na TiVo in premor v pravem trenutku, 48 00:03:02,450 --> 00:03:07,700 boste videli, da to, kar gledamo ni ravno tisto, kar je opisano. 49 00:03:07,700 --> 00:03:11,170 In mi poskušali drug zvočni priključek tukaj in videli, če ne moremo 50 00:03:11,170 --> 00:03:13,780 da zvoka v sinhronizirani tokrat. 51 00:03:13,780 --> 00:03:20,530 Dam ti "številke". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] To je 32-bitni IPv4 naslov. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, to je internet. >> Zasebno omrežje. To je zasebno omrežje je Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] Ok. To je Objective-C, in to je za barvanje nekega otroški program, 55 00:03:43,810 --> 00:03:51,140 kot si lahko morda sklepali iz imena spremenljivke tam. 56 00:03:51,140 --> 00:03:54,410 Tako da, potem je "številke". Torej, danes in ta teden bomo predstavili 57 00:03:54,410 --> 00:03:57,740 Malo svetu forenzike in konteksta, v težave, zato. 58 00:03:57,740 --> 00:04:00,590 Danes bo skrajšano predavanje zato, ker je poseben dogodek tukaj 59 00:04:00,590 --> 00:04:05,530 kasneje, tako da bomo pokukajmo in draži tako študentom kot tudi njihovi starši danes 60 00:04:05,530 --> 00:04:07,420 z nekaterimi stvarmi, ki so na obzorju. 61 00:04:07,420 --> 00:04:12,240 Med njimi, kot v ponedeljek, boste imeli še nekaj sošolci. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard in MITs novo spletno pobuda za odprto učno 63 00:04:16,050 --> 00:04:19,120 in še več, je začela na univerzi Harvard v ponedeljek. 64 00:04:19,120 --> 00:04:21,490 Kar pomeni, da pride ponedeljek boste imeli - kot v zadnjem štetju 65 00:04:21,490 --> 00:04:26,210 86.000 dodatnih sošolci bodo po skupaj s predavanji CS50 je 66 00:04:26,210 --> 00:04:29,170 in oddelki in walkthroughs in problemov sklopov. 67 00:04:29,170 --> 00:04:32,350 In v okviru tega, boste postali člani ustanovni razred 68 00:04:32,350 --> 00:04:35,090 CS50 in zdaj CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Kot del tega zdaj zavedajo, da se bodo nekatere upsides kot dobro. 70 00:04:39,310 --> 00:04:43,790 Pri pripravah na to, za veliko število študentov, 71 00:04:43,790 --> 00:04:47,180 zadošča reči, da čeprav imamo 108 TFS in CAS, 72 00:04:47,180 --> 00:04:50,790 ni ravno najboljši študent / učitelja razmerje, ko bomo zadeli 80.000 druge študente. 73 00:04:50,790 --> 00:04:52,850 Torej mi ne bo treba razvrščanje toliko problem postavlja ročno. 74 00:04:52,850 --> 00:04:55,920 Tako je predstavil ta teden v problemski sklop bo CS50 Preverite, 75 00:04:55,920 --> 00:04:58,450 , ki se bo ukazne vrstice v aparatu 76 00:04:58,450 --> 00:05:01,200 da boste dobili, ko jo boste osvežili kasneje ta teden, 77 00:05:01,200 --> 00:05:03,200 in boste lahko, da zaženete ukaz, preverite, 50, 78 00:05:03,200 --> 00:05:06,500 na svoj pset, in boste dobili nekaj povratnih informacij o tem, ali je vaš program 79 00:05:06,500 --> 00:05:11,160 pravilna ali nepravilna glede na različne tehnične zahteve za obliko, ki smo jih navedli. 80 00:05:11,160 --> 00:05:13,580 Torej, več o tem in specifikacija problem niz in 81 00:05:13,580 --> 00:05:17,240 se CS50x sošolci bodo uporabili tudi to. 82 00:05:17,240 --> 00:05:19,230 >> Torej, problem sklop 4 je vse o forenziki. 83 00:05:19,230 --> 00:05:21,940 In je bil ta del se zgleduje po nekaj resničnih stvari, 84 00:05:21,940 --> 00:05:24,620 pri čemer, ko sem bil v šoli, sem za nekaj časa interniran v 85 00:05:24,620 --> 00:05:28,650 Uradu Middlesex County District pravobranilstvo delaš forenzično delo 86 00:05:28,650 --> 00:05:31,650 z njihovo vodilno forenzično raziskovalca, in kaj je ta znašala 87 00:05:31,650 --> 00:05:35,260 je, mislim, da sem že pred nekaj teden preteklost, je masa državne policije ali drugih 88 00:05:35,260 --> 00:05:39,000 bi prišel, bi odložiš stvari, kot so trdi diski in CD-jev in disket 89 00:05:39,000 --> 00:05:42,340 in podobno, nato pa je cilj urada forenzike je bil ugotoviti, ali 90 00:05:42,340 --> 00:05:44,600 ni bilo ali ni bilo dokazov, neke vrste. 91 00:05:44,600 --> 00:05:48,010 To je bila posebna enota Preiskave, tako da je bilo beli ovratnik kriminalu, 92 00:05:48,010 --> 00:05:52,350 je bilo bolj zaskrbljujoče vrste kaznivih dejanj, 93 00:05:52,350 --> 00:05:55,990 kaj vključuje neke vrste digitalnih medijev, se izkaže, da ne, da je veliko ljudi 94 00:05:55,990 --> 00:05:59,370 napisati e-poštno sporočilo "Uspelo mi je." 95 00:05:59,370 --> 00:06:03,290 Tako pogosto ti forenziko iskanja ni obrnila navzgor vse, da je veliko sadja, 96 00:06:03,290 --> 00:06:05,850 ampak včasih bi ljudje pišejo take e-pošte. 97 00:06:05,850 --> 00:06:08,490 Torej, včasih je bila nagrajena za prizadevanja. 98 00:06:08,490 --> 00:06:14,420 >> Vendar pa vodi do tega forenzično pset, bomo uvedbo v pset 4 bit grafike. 99 00:06:14,420 --> 00:06:18,260 Torej, ste verjetno, da te stvari za samoumevne, JPEG, GIF in podobno, v teh dneh, 100 00:06:18,260 --> 00:06:21,640 ampak če si res misliš o tem, slika, podobno kot obraz Rob je, 101 00:06:21,640 --> 00:06:24,430 lahko obravnavamo kot zaporedje pik ali pik. 102 00:06:24,430 --> 00:06:26,680 Zdaj, v primeru obrazu Rob je, tam je vse vrste barv, 103 00:06:26,680 --> 00:06:29,940 in smo začeli videti posamezne pike, otherwide znane kot pik, 104 00:06:29,940 --> 00:06:31,610 ko smo začeli, da povečate palca 105 00:06:31,610 --> 00:06:35,590 Ampak, če bomo poenostavili svet malo in samo rečem, da je to tukaj, je Rob 106 00:06:35,590 --> 00:06:40,560 črno-belo, no, da predstavlja črno-belo moreva uporabiti binarno. 107 00:06:40,560 --> 00:06:44,960 In če bomo uporabiti binarno, 1 ali 0, lahko izrazimo to isto sliko 108 00:06:44,960 --> 00:06:51,970 nasmejane obraza Rob je s tem vzorcu bitov: 11000011 predstavlja 109 00:06:51,970 --> 00:06:55,160 bela, bela, črna, črna, črna, črna, bela bela. 110 00:06:55,160 --> 00:06:59,290 In tako to ni velik korak, nato pa začeti govoriti o barvite fotografije. 111 00:06:59,290 --> 00:07:01,920 Stvari, ki bi jih vidite na Facebooku ali pa z digitalnim fotoaparatom, 112 00:07:01,920 --> 00:07:04,730 ampak, seveda, ko gre za barve, za ogled potrebujete več bitov. 113 00:07:04,730 --> 00:07:08,470 In zelo pogosto v svetu fotografije je uporaba ne 1-bitne barve 114 00:07:08,470 --> 00:07:12,730 kot to kaže, pa 24-bitno barvno, če ste dejansko dobili milijone barv. 115 00:07:12,730 --> 00:07:15,430 Tako kot v primeru, ko povečujete na očeh Rob je, 116 00:07:15,430 --> 00:07:19,270 da bi bila katera številka milijonov različnih barvnih možnosti. 117 00:07:19,270 --> 00:07:22,260 >> Torej bomo uvesti to vrsto problema 4 kot tudi v walkthrough, 118 00:07:22,260 --> 00:07:27,050 , ki bo danes ob 3:30 namesto običajnega 2:30 zaradi petkovega predavanja tukaj. 119 00:07:27,050 --> 00:07:29,930 Vendar pa bo video na spletu, kot običajno, jutri. 120 00:07:29,930 --> 00:07:31,880 Prav tako vam bomo predstavili drugi obliki zapisa. 121 00:07:31,880 --> 00:07:34,150 Torej to pomeni, da si namenoma zastrašujoče na prvi, 122 00:07:34,150 --> 00:07:38,980 ampak to je le nekaj dokumentacije za struct C. 123 00:07:38,980 --> 00:07:42,280 Izkazalo se je, da je Microsoft pred leti, pomagal popularizirati ta format, 124 00:07:42,280 --> 00:07:46,630 imenuje bitna format, BMP, in to je super-enostaven, 125 00:07:46,630 --> 00:07:50,390 barvna grafična oblika datoteke, ki je bila uporabljena za dalj časa 126 00:07:50,390 --> 00:07:53,640 in včasih še za ozadja na namiznih računalnikov. 127 00:07:53,640 --> 00:07:57,410 Če menite, da nazaj na Windows XP in gričev in modro nebo, 128 00:07:57,410 --> 00:08:00,660 da je običajno BMP ali bitna slika in bitne slike 129 00:08:00,660 --> 00:08:03,340 so zabava za nas, saj imajo malo več kompleksnosti. 130 00:08:03,340 --> 00:08:05,640 To ni tako preprosto, kot to mrežo 0 in 1 je; 131 00:08:05,640 --> 00:08:10,680 Namesto, da imate stvari, kot glavo na začetku datoteke. 132 00:08:10,680 --> 00:08:15,520 Torej, z drugimi besedami, znotraj datoteke. BMP je cel kup 0 in 1 je, 133 00:08:15,520 --> 00:08:18,070 vendar pa je nekaj dodatnega 0 in 1 je tam. 134 00:08:18,070 --> 00:08:21,450 In izkazalo se je, da tisto, kar smo verjetno samoumevno let, 135 00:08:21,450 --> 00:08:27,040 datotek, kot so. doc. ali xls ali. mp3 ali mp4,. 136 00:08:27,040 --> 00:08:29,910 ne glede na formati, da ste seznanjeni s. 137 00:08:29,910 --> 00:08:31,900 No, kaj to sploh pomeni, da je format? 138 00:08:31,900 --> 00:08:35,740 Ker na koncu dneva vse te datoteke, ki jih uporabljamo so samo 0 in 1 je 139 00:08:35,740 --> 00:08:39,950 in morda tisti 0 in 1 je predstavljati, b, c, z ASCII ali podobno, 140 00:08:39,950 --> 00:08:42,030 toda do konca dneva, saj je samo 0 in 1 je. 141 00:08:42,030 --> 00:08:45,300 >> Torej, ljudje le občasno odloči, da izumiti novo obliko datoteke 142 00:08:45,300 --> 00:08:49,420 kjer so standardizacija, kaj se bo vzorce bitov pravzaprav pomeni. 143 00:08:49,420 --> 00:08:52,790 In v tem primeru tudi tu ljudje, ki so namenjeni bitno obliko datoteke 144 00:08:52,790 --> 00:08:58,260 je dejal, da je že na prvi bajt v datoteke bitnih, kot je označena z odmikom 0, tam, 145 00:08:58,260 --> 00:09:02,320 tam bo še nekaj cryptically imenom spremenljivke se imenuje bfType, 146 00:09:02,320 --> 00:09:06,510 ki samo stoji za vrsto datoteke bitne slike, kakšne datoteke bitnih je to. 147 00:09:06,510 --> 00:09:10,780 Lahko sklepamo, morda v drugi vrstici, ki izravna 2, bajt številko 2, 148 00:09:10,780 --> 00:09:15,980 ima vzorec 0 in 1, ki predstavlja kaj je? 149 00:09:15,980 --> 00:09:18,320 Velikost nečesa, in gre od tam. 150 00:09:18,320 --> 00:09:20,660 Torej, v kompletu 4 problema, boste šli skozi nekatere od teh stvari. 151 00:09:20,660 --> 00:09:24,480 >> Mi ne bo končalo skrbeti za vse od njih, vendar pa opazite, da se začne, da bi dobili zanimive 152 00:09:24,480 --> 00:09:30,780 okoli vrstice ali bajt 54, rgbtBlue, zelena in rdeča. 153 00:09:30,780 --> 00:09:35,280 Če ste kdaj slišali kratico RGB, rdeča zelena modra, to je sklic na to. 154 00:09:35,280 --> 00:09:37,840 Ker se je izkazalo, lahko slikate vse barve mavrice 155 00:09:37,840 --> 00:09:41,580 z nekaterimi kombinacijo rdeče in modre in zelene. 156 00:09:41,580 --> 00:09:46,560 In v resnici, lahko starši v sobi spomniti na nekatere izmed prvih projektorjev. 157 00:09:46,560 --> 00:09:49,360 Te dni, boste videli 1 Močna svetloba prihaja iz leče. 158 00:09:49,360 --> 00:09:52,870 Ampak nazaj v dan, si imel rdečo lečo, modro lečo in zeleno lečo 159 00:09:52,870 --> 00:09:56,620 in skupaj so usmerjene na zaslonu in oblikovali barvito sliko. 160 00:09:56,620 --> 00:09:59,590 In zelo pogosto bi srednje šole in srednje šole so tiste leče 161 00:09:59,590 --> 00:10:02,680 vedno tako rahlo Nakrivo, tako da si nekako vidi dvojno ali trojno slike, 162 00:10:02,680 --> 00:10:07,500 ampak da je bila ideja. Imeli ste rdečo in zeleno in modro svetlobo, slikarstvo sliko. 163 00:10:07,500 --> 00:10:09,570 In ta ista načela se uporabljajo v računalnikih. 164 00:10:09,570 --> 00:10:12,000 >> Tako med drugim izzivom, potem za vas problem nastaviti 4 165 00:10:12,000 --> 00:10:16,080 se bo nekaj stvari, ena je, da dejansko velikost slike. 166 00:10:16,080 --> 00:10:18,050 Da bi se v vzorec 0 in 1 je, 167 00:10:18,050 --> 00:10:22,840 ugotovimo, katere kose 0 in 1 je predstavljati, kaj v strukturi, kot je ta, 168 00:10:22,840 --> 00:10:26,800 in nato ugotovimo, kako se podvajajo pikslov: rdeče, blues, zelenice 169 00:10:26,800 --> 00:10:32,460 notranjost tako, da ko slika izgleda takole najprej bi lahko izgledal tako namesto po tem. 170 00:10:32,460 --> 00:10:35,590 Med drugimi izzivi, preveč, se bo, da bomo predali vam 171 00:10:35,590 --> 00:10:38,900 Forenzični slika dejanskega datoteke iz digitalnega fotoaparata 172 00:10:38,900 --> 00:10:42,410 in na to kamero, nekoč, je bilo cel kup fotografij. 173 00:10:42,410 --> 00:10:47,030 Problem je, da smo pomotoma izbrisali ali pa je slika poškodovana nekako. 174 00:10:47,030 --> 00:10:51,040 Slabe stvari se dogajajo pri digitalnih fotoaparatih, in tako smo se hitro kopirajo vse 0 in 1 je 175 00:10:51,040 --> 00:10:55,410 off to kartico za vas, shrani vse v 1 veliko datoteko, nato pa jih bomo predali za vas 176 00:10:55,410 --> 00:11:00,000 pri reševanju iz 4, tako da lahko napisati program v C, s katerimi si opomore 177 00:11:00,000 --> 00:11:02,660 vse te JPEGs, v najboljšem primeru. 178 00:11:02,660 --> 00:11:06,280 In izkazalo se je, da so JPEG, čeprav je to precej kompleksne oblike zapisa datoteke, 179 00:11:06,280 --> 00:11:09,580 oni so veliko bolj zapleten kot to nasmejan obraz tukaj. 180 00:11:09,580 --> 00:11:14,320 Izkazalo se je, da ima vsak JPEG začne z istimi vzorci 0 in 1 je. 181 00:11:14,320 --> 00:11:18,820 Torej z uporabo while zanko ali za zanke in podobno, 182 00:11:18,820 --> 00:11:22,350 lahko izbirate v vseh 0 in 1 je v tem forenzične slike 183 00:11:22,350 --> 00:11:26,670 in vsakič, ko vidiš poseben vzorec, ki je opredeljen v specifikaciji je problem podloga, 184 00:11:26,670 --> 00:11:29,770 lahko prevzame, "Oh, tukaj je zelo velika verjetnost, 185 00:11:29,770 --> 00:11:33,520 začetek JPEG, "in takoj, ko je bil isti vzorec, 186 00:11:33,520 --> 00:11:36,050 nekaj več bajtov ali kilobajtih ali megabajtih kasneje, 187 00:11:36,050 --> 00:11:40,550 lahko prevzame, "Oh! Tukaj je 2. JPEG, fotografije sem po prvi. 188 00:11:40,550 --> 00:11:44,720 Naj nehate brati, da je prvo datoteko, da začnete pisati to novo. " 189 00:11:44,720 --> 00:11:49,980 In izhod vašega programa za pset 4 se bo kar 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 In če to ni 50 JPEG, imate malo zanko. 191 00:11:52,400 --> 00:11:55,580 Če imate nešteto JPEG, imate neskončno zanko. 192 00:11:55,580 --> 00:11:58,280 Tako, da bo tudi precej značilen primer. 193 00:11:58,280 --> 00:12:00,280 To je tisto, kar je na obzorju. 194 00:12:00,280 --> 00:12:03,740 >> Kviz 0, za nami. Zavedaj se, na moj email, da vedno obstaja ljudje 195 00:12:03,740 --> 00:12:06,820 ki so tako srečni, nekako nevtralen, in žalosten okoli 0 kvizu čas. 196 00:12:06,820 --> 00:12:10,160 In vas prosimo, da stik z mano, glave TFS, Zamyla, svoje TF 197 00:12:10,160 --> 00:12:14,120 ali eden od CA, da boste vedeli, če bi želeli, da bi razpravljali, kako je šlo. 198 00:12:14,120 --> 00:12:16,460 >> Torej, da bi naredil vtis na starše tu v sobi, 199 00:12:16,460 --> 00:12:23,990 kaj je CS50 knjižnica? Dobro delo. 200 00:12:23,990 --> 00:12:32,280 Kaj CS50 knjižnica? Ja? [Študentski odgovori, nerazumljiv] 201 00:12:32,280 --> 00:12:35,730 >> Dobro, dobro. Torej je prewritten niz kode, ki smo zaposleni, je zapisal, 202 00:12:35,730 --> 00:12:38,460 nudimo vam, da zagotovi nekaj skupnih funkcij. 203 00:12:38,460 --> 00:12:42,290 Stvari, kot se mi je niz, se mi je int, vse funkcije, ki so tukaj naštete. 204 00:12:42,290 --> 00:12:45,260 Že sedaj smo začeli res, da te usposabljanje kolesa off. 205 00:12:45,260 --> 00:12:48,230 Torej bomo začeli odvzamejo "niz" od tebe, 206 00:12:48,230 --> 00:12:52,790 ki odpoklic, je le sinonim za tisto, kar dejansko podatkovni tip? char *. 207 00:12:52,790 --> 00:12:57,020 Tako za starše, da je bil verjetno -, da je dobro, tako da bom char * začnemo videti 208 00:12:57,020 --> 00:13:00,810 Na zaslonu toliko, kot smo odstranili "niz" iz našega besednjaka, 209 00:13:00,810 --> 00:13:02,760 vsaj ko gre za dejansko pisanje kode. 210 00:13:02,760 --> 00:13:06,240 Prav tako bomo prenehali uporabljati nekatere od teh funkcij toliko, 211 00:13:06,240 --> 00:13:08,390 ker naši programi bodo dobili bolj zapletene 212 00:13:08,390 --> 00:13:11,370 ne samo pisati programe, ki sedijo tam s hitro utripa, 213 00:13:11,370 --> 00:13:13,580 čaka, da uporabnik vnesti nekaj palcev 214 00:13:13,580 --> 00:13:15,220 Dobili boste svoje vložke od drugod. 215 00:13:15,220 --> 00:13:18,720 Na primer, jih boste dobili od več bitov na lokalni trdi disk. 216 00:13:18,720 --> 00:13:23,340 Boste namesto njih priti v prihodnosti od omrežne povezave, nekatere spletne strani nekje. 217 00:13:23,340 --> 00:13:27,460 Torej lupine nazaj te plasti prvič, in izvlecite CS50 naprave 218 00:13:27,460 --> 00:13:32,300 in ta datoteka imenuje CS50.h, ki ste bili ostri tudi več tednov. 219 00:13:32,300 --> 00:13:34,380 >> Ampak kaj je dejansko videti, kaj je notri tega. 220 00:13:34,380 --> 00:13:38,250 Torej začetek datoteke v modrem je samo cel kup pripomb, 221 00:13:38,250 --> 00:13:41,340 informacije o garanciji in izdajanja dovoljenj. To je neke vrste skupne paradigme 222 00:13:41,340 --> 00:13:44,600 programske opreme, saj je veliko programske opreme v teh dneh, je tisto, kar se imenuje "open source" 223 00:13:44,600 --> 00:13:46,940 kar pomeni, da je nekdo napisal kodo 224 00:13:46,940 --> 00:13:50,060 in se je prosto dostopen, ne samo za vožnjo in uporabo, 225 00:13:50,060 --> 00:13:53,660 ampak dejansko bere in spreminja in vključiti v svoje delo. 226 00:13:53,660 --> 00:13:55,790 Torej, to je tisto, kar ste bili z uporabo, odprtokodno programsko opremo, 227 00:13:55,790 --> 00:13:58,030 čeprav v zelo majhnem obliki. 228 00:13:58,030 --> 00:14:01,860 Če bi se pomaknite navzdol mimo pripomb, čeprav bomo začeli videti nekaj bolj znanih stvari. 229 00:14:01,860 --> 00:14:08,090 Tako obvestilo na vrhu tukaj, da datoteka vsebuje CS50.h cel kup glavi datoteke. 230 00:14:08,090 --> 00:14:11,160 Zdaj, večina od njih še nismo videli prej, vendar je 231 00:14:11,160 --> 00:14:15,640 znano, katera od teh smo videli, čeprav na kratko, tako daleč? 232 00:14:15,640 --> 00:14:18,720 Ja, standardne knjižnice. Stdlib.h je malloc, 233 00:14:18,720 --> 00:14:21,590 tako da, ko smo začeli govoriti o dinamično dodeljevanje pomnilnika, 234 00:14:21,590 --> 00:14:24,960 ki jih bomo vrnili naslednji teden pa smo začeli tudi te datoteke. 235 00:14:24,960 --> 00:14:29,660 Izkazalo se je, da je bool in resnično in lažno dejansko ne obstajajo v C, per se, 236 00:14:29,660 --> 00:14:32,460 razen če so te datoteke tukaj. 237 00:14:32,460 --> 00:14:35,770 Tako smo več tednov, je bil tudi standardni bool.h 238 00:14:35,770 --> 00:14:39,020 tako da lahko uporabite pojem bool, resnična ali neresnična. 239 00:14:39,020 --> 00:14:41,830 Brez tega bi morali nekako ponaredek, in uporabite int 240 00:14:41,830 --> 00:14:45,920 in samo samovoljno domnevati, da je 0 false in 1 je res. 241 00:14:45,920 --> 00:14:49,980 >> Zdaj, če se pomaknite naprej, tu je naša opredelitev niza. 242 00:14:49,980 --> 00:14:54,820 Izkazalo se je, kot smo že povedal, da če je ta * je sploh ni važno. 243 00:14:54,820 --> 00:14:56,750 Lahko celo prostor vsem. 244 00:14:56,750 --> 00:15:01,550 Mi, ta semester, so bili njeni promociji, kot je to razvidno, da je * ima opraviti s tipom. 245 00:15:01,550 --> 00:15:05,370 Toda zavedati, tako kot pogoste, če ne malo več skupnega, je, da ga ni 246 00:15:05,370 --> 00:15:07,480 ampak funkcionalno gre za isto stvar. 247 00:15:07,480 --> 00:15:11,070 Toda zdaj, če beremo določa tudi, vzemimo si rekel, GetInt, 248 00:15:11,070 --> 00:15:15,350 saj smo se, da je mogoče, preden karkoli drugega v tem polletju. 249 00:15:15,350 --> 00:15:19,620 In tukaj je GetInt. To je tisto? 250 00:15:19,620 --> 00:15:24,650 To je prototip. Tako pogosto, smo pripravili prototipe na vrhovih naših. C datoteke 251 00:15:24,650 --> 00:15:28,190 lahko pa tudi postaviti prototip v glavi datoteke. h datoteke, 252 00:15:28,190 --> 00:15:32,110 kot je ta v tej zadevi, tako da, ko pišete nekaterih funkcij 253 00:15:32,110 --> 00:15:36,790 , ki jo želite, da drugi ljudje lahko uporabljali, kar je točno zgodilo pri CS50 knjižnici 254 00:15:36,790 --> 00:15:40,900 ne samo izvaja svoje naloge v nekaj podobnega CS50.c, 255 00:15:40,900 --> 00:15:46,720 si prav tako prototipe ni na vrhu te datoteke, vendar na vrhu glave datoteke 256 00:15:46,720 --> 00:15:50,810 torej, da glava datoteke je tisto, kar so prijatelji in sodelavci, 257 00:15:50,810 --> 00:15:52,800 z ostrimi tudi v svoji kodi. 258 00:15:52,800 --> 00:15:55,440 Torej vsem tem času ste bili tudi vsi ti prototipov 259 00:15:55,440 --> 00:15:59,870 dejansko na vrhu datoteke, ampak s pomočjo tega mehanizma so ostri 260 00:15:59,870 --> 00:16:03,320 da v bistvu kopije in paste za to datoteko na svoje. 261 00:16:03,320 --> 00:16:06,400 No, tukaj je nekaj precej podrobno dokumentacijo. 262 00:16:06,400 --> 00:16:08,880 >> Smo precej samoumevno, da GetInt dobi int, 263 00:16:08,880 --> 00:16:10,740 vendar se izkaže, da je nekaj primerov kotiček, kajne? 264 00:16:10,740 --> 00:16:14,320 Kaj pa, če uporabnik vnese v številu, ki je tako prevelika? 265 00:16:14,320 --> 00:16:17,350 Quintillion, da preprosto ni dovolj prostora v notranjosti notr? 266 00:16:17,350 --> 00:16:21,180 Kakšna je pričakovana vedenja? No, idealno pa je, da je predvidljiv. 267 00:16:21,180 --> 00:16:23,460 Torej, v tem primeru, če ste dejansko prebrali drobni tisk, 268 00:16:23,460 --> 00:16:27,850 boste videli, da če proga ne more prebrati, ta vrne INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Nikoli nisva govorila o tem, ampak glede na njeno kapitalizacijo, 270 00:16:30,800 --> 00:16:33,030 kaj je to, verjetno? 271 00:16:33,030 --> 00:16:36,610 To je stalna, tako da je nekaj posebnega konstanta, ki je verjetno razglašena 272 00:16:36,610 --> 00:16:39,460 V eni od teh glavi datoteke, ki je višje v spisu, 273 00:16:39,460 --> 00:16:43,400 INT_MAX in je verjetno nekaj podobnega, v grobem, 2000000000. 274 00:16:43,400 --> 00:16:48,160 Ideja je, da zato, ker moramo nekako pomenilo, da je nekaj šlo narobe, 275 00:16:48,160 --> 00:16:51,090 smo, da imajo 4000000000 številke so nam na voljo, 276 00:16:51,090 --> 00:16:53,980 Negativni 2000000000 na do 2 milijard EUR, več ali manj. 277 00:16:53,980 --> 00:16:58,030 No, tisto, kar je pogosto pri načrtovanju je, da kradejo samo eno od teh številk. 278 00:16:58,030 --> 00:17:02,250 Morda 0, morda 2 milijardi morda negativno 2000000000. 279 00:17:02,250 --> 00:17:06,720 Torej, ste porabili eno od svojih možnih vrednosti, tako da lahko zavežejo na svetu 280 00:17:06,720 --> 00:17:10,089 da če gre kaj narobe, se bom vrnil to super-veliko vrednost. 281 00:17:10,089 --> 00:17:13,329 Ampak vi ne želite, da si tipkanje nekaj Grobni, kot je "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 za res veliko več, če boste namesto tega posplošiti kot stalnica. 283 00:17:17,079 --> 00:17:19,380 Torej res, če si bil analni v zadnjih nekaj tednih, 284 00:17:19,380 --> 00:17:23,800 kadarkoli pokličeš GetInt, morate bili preverjanje z if stanju. 285 00:17:23,800 --> 00:17:27,109 Ali si tip v INT_MAX, ali natančneje, 286 00:17:27,109 --> 00:17:29,900 vam GetInt zameno INT_MAX? Ker če je to storil, 287 00:17:29,900 --> 00:17:35,140 ki dejansko pomeni, da ni treba vnesti, kaj je šlo narobe v tej zadevi. 288 00:17:35,140 --> 00:17:38,970 Torej, to je tisto, kar je splošno znano kot "divjega" vrednost, kar pomeni samo nekaj posebnega. 289 00:17:38,970 --> 00:17:41,020 >> No, da preidem na s. Datoteke c. 290 00:17:41,020 --> 00:17:44,500 Datoteka C, obstaja na napravi za nekaj časa, 291 00:17:44,500 --> 00:17:47,540 in v resnici, aparat je naložen za vas 292 00:17:47,540 --> 00:17:49,720 v to stvar, ki jo imenuje "objektni kodi" 293 00:17:49,720 --> 00:17:52,940 ampak to šele ni pomembno za vas, če je to zato, ker sistem ne ve, 294 00:17:52,940 --> 00:17:54,780 v tem primeru, kje je naprava. 295 00:17:54,780 --> 00:18:00,620 No, pa se pomaknite navzdol do zdaj GetInt, in videli, kako GetInt je delal ves ta čas. 296 00:18:00,620 --> 00:18:02,380 Torej, tukaj imamo podobne pripombe od prej. 297 00:18:02,380 --> 00:18:04,930 Naj približati le tisti del kode, 298 00:18:04,930 --> 00:18:07,410 in kaj imamo za GetInt je naslednja. 299 00:18:07,410 --> 00:18:12,770 To traja nobenega vnosa in se vrne int, medtem ko je (pravi), tako da imamo namerno neskončno zanko 300 00:18:12,770 --> 00:18:16,560 ampak, verjetno bomo iztrgajo iz tega nekako, ali pa se vrnite od znotraj tega. 301 00:18:16,560 --> 00:18:19,890 Torej, poglejmo, kako to deluje. No, zdi se, da z uporabo GetString 302 00:18:19,890 --> 00:18:22,550 V tej prvi vrstici znotraj zanke 166. 303 00:18:22,550 --> 00:18:25,320 To je zdaj dobra praksa, saj v kakšnih okoliščinah 304 00:18:25,320 --> 00:18:30,820 GetString lahko vrne to posebno, ključne besede, NULL? 305 00:18:30,820 --> 00:18:38,460 Če gre kaj narobe. Kaj bi lahko šlo narobe, ko pokličete nekaj podobnega GetString? 306 00:18:38,460 --> 00:18:42,550 Ja? [Student odgovor, nerazumljiv] >> Ja. Mogoče malloc ne uspe. 307 00:18:42,550 --> 00:18:45,310 Nekje pod pokrovom motorja GetString kliče malloc, 308 00:18:45,310 --> 00:18:48,210 ki dodeljuje pomnilnik, kar omogoča, da računalniška trgovina 309 00:18:48,210 --> 00:18:50,950 vse znake, da uporabnik vnese v tipkovnici. 310 00:18:50,950 --> 00:18:53,270 In predvidevam si imel še celo veliko prostega časa 311 00:18:53,270 --> 00:18:56,470 in vnesli več, na primer kot 2 milijardi znakov. 312 00:18:56,470 --> 00:18:59,600 Več znakov, kot računalnik pa ima tudi RAM. 313 00:18:59,600 --> 00:19:02,350 No, GetString je, da bi lahko pomenilo, da za vas, 314 00:19:02,350 --> 00:19:05,650 tudi če je to super, super občasni kotiček primer. 315 00:19:05,650 --> 00:19:08,490 To je na nek način bi lahko poskrbel za to, in tako GetString, 316 00:19:08,490 --> 00:19:11,850 če gremo nazaj in preberite dokumentacijo, se v resnici vrnil NULL. 317 00:19:11,850 --> 00:19:16,150 Zdaj, če ne GetString z vrnitvijo NULL, GetInt bo ne 318 00:19:16,150 --> 00:19:19,370 z vrnitvijo INT_MAX, tako kot kontrolna. 319 00:19:19,370 --> 00:19:22,650 To so samo človeške konvencije. Edini način, da bi vedel, da je to primer 320 00:19:22,650 --> 00:19:24,840 je z branjem dokumentacije. 321 00:19:24,840 --> 00:19:28,200 Torej se pomaknite navzdol, kjer int dejansko GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Torej, če sem se pomaknite navzdol malo naprej, v skladu 170 imamo komentar nad temi smernicami. 323 00:19:34,220 --> 00:19:38,470 Tako izjavljamo, v 172, int n in char c, in potem to novo funkcijo 324 00:19:38,470 --> 00:19:41,870 ki so se nekateri izmed vas naletel že prej, vendar sscanf. 325 00:19:41,870 --> 00:19:44,190 To je kratica za godalni f skeniranja. 326 00:19:44,190 --> 00:19:48,580 Z drugimi besedami, daj mi niz in ga bom za skeniranje informacijami interesov. 327 00:19:48,580 --> 00:19:53,820 Torej, kaj to pomeni? No, recimo, da sem tip v dobesedno 1 2 3 na tipkovnici, 328 00:19:53,820 --> 00:19:59,730 in nato pritisnite enter. Kaj je podatkovni tip 1 2 3 kdaj vrnila GetString? 329 00:19:59,730 --> 00:20:05,010 Očitno niz, kajne? Imam niz, tako da 1 2 3 res »1 2 3" 330 00:20:05,010 --> 00:20:07,260 s \ 0 na koncu. To ni int. 331 00:20:07,260 --> 00:20:10,420 To ni več. Izgleda kot nekaj, vendar to ni dejansko. 332 00:20:10,420 --> 00:20:14,680 Torej, kaj GetInt narediti? Treba je pregledati, da se niz leve proti desni, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0 in nekako spremeniti to dejansko celo število. 334 00:20:19,010 --> 00:20:21,010 Zdaj lahko ugotovimo, kako to storiti. 335 00:20:21,010 --> 00:20:24,240 Če menite, da nazaj na pset 2, boste verjetno malo udobno 336 00:20:24,240 --> 00:20:26,810 s Cezarjem ali vigenere, tako da lahko izbirate v niz, 337 00:20:26,810 --> 00:20:29,800 lahko pretvorite znakov, da ints s kramp. To je cel kup dela. 338 00:20:29,800 --> 00:20:32,800 Zakaj ne pokličete funkcijo kot sscanf, da stori za vas? 339 00:20:32,800 --> 00:20:37,520 Torej sscanf pričakuje argument v tem primeru se imenuje vrstica, ki je niz. 340 00:20:37,520 --> 00:20:41,310 Nato določi, v narekovajih, zelo podoben printf, 341 00:20:41,310 --> 00:20:44,960 Kaj pričakujete, da boste videli v tem nizu? 342 00:20:44,960 --> 00:20:52,980 Kaj sem tukaj povedati, pričakujem, da decimalno številko in morda tudi značaj. 343 00:20:52,980 --> 00:20:54,990 In bomo videli, zakaj je temu tako, v trenutku. 344 00:20:54,990 --> 00:20:58,440 Izkazalo se je, da je ta zapis je zdaj spominja stvari 345 00:20:58,440 --> 00:21:00,840 smo začeli govoriti o nekaj več kot tednom dni. 346 00:21:00,840 --> 00:21:05,430 >> Kaj je & n & c in delaš za nas? [Študentski odgovori, nerazumljiv] 347 00:21:05,430 --> 00:21:07,610 >> Ja. To mi dali naslov in naslov n c. 348 00:21:07,610 --> 00:21:10,440 Zakaj je to pomembno? No, saj veš, da je s funkcijami v C 349 00:21:10,440 --> 00:21:13,440 lahko vedno vrne vrednost ali nobene vrednosti. 350 00:21:13,440 --> 00:21:16,630 Lahko vrne int, niz, float, char, karkoli. 351 00:21:16,630 --> 00:21:21,150 Ali se lahko vrnete praznino, vendar pa lahko vrnejo le 1 stvar maksimalno. 352 00:21:21,150 --> 00:21:26,100 Ampak tukaj želimo sscanf, da me vrnejo morda int, decimalno številko, 353 00:21:26,100 --> 00:21:29,240 in tudi char, in bom razložiti, zakaj zna v trenutku. 354 00:21:29,240 --> 00:21:34,250 Torej si dejansko želijo, da se vrnete f 2 stvari, ki preprosto ni mogoče v C. 355 00:21:34,250 --> 00:21:38,460 Torej si lahko izognete, da s posredovanjem v 2 naslovi, 356 00:21:38,460 --> 00:21:43,710 ker takoj, ko se z roko v odvisnosti 2 naslove, kaj lahko to funkcijo naredili z njimi? 357 00:21:43,710 --> 00:21:49,880 Lahko pišete na te naslove. Lahko uporabite * delovanje in "tja" za vsakega od teh naslovov. 358 00:21:49,880 --> 00:21:54,320 To je neke vrste tega backdoor mehanizma, vendar je zelo pogosta za spreminjanje vrednosti spremenljivk 359 00:21:54,320 --> 00:21:58,020 v več kot samo 1 mesto, v tem primeru 2. 360 00:21:58,020 --> 00:22:04,590 No, opazil sem iskal == do1, in nato vrne n če to ne v resnici, ocenjuje, da res. 361 00:22:04,590 --> 00:22:09,340 Torej, kaj se dogaja? No, tehnično, vse resnično želimo, da se zgodi v GetInt je to. 362 00:22:09,340 --> 00:22:12,340 Želimo, da razčleniti, če se tako izrazim, želimo prebrati niz 363 00:22:12,340 --> 00:22:16,210 "1 2 3", in, če je videti, kot da je številka tam, 364 00:22:16,210 --> 00:22:21,360 kaj govoriš sscanf storiti, je dal to številko, 1 2 3, v tem spremenljivko n zame. 365 00:22:21,360 --> 00:22:26,060 Zakaj potem vam moram, da je to dobro? 366 00:22:26,060 --> 00:22:33,750 Kakšna je vloga tudi rekel, sscanf, lahko dobite tudi znak tukaj. 367 00:22:33,750 --> 00:22:36,890 [Student povedano, nerazumljiv] >> Ne - decimalna vejica lahko delo. 368 00:22:36,890 --> 00:22:40,650 Naj presodilo, da je za trenutek pomislil. Kaj še? 369 00:22:40,650 --> 00:22:42,570 [Študent, nerazumljiv] >> Torej, dobra misel, bi lahko postal NULL značaja. 370 00:22:42,570 --> 00:22:44,970 Pravzaprav ni v tem primeru. Ja? [Študent, nerazumljiv] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Ali mi posploševati še dlje. 372 00:22:47,100 --> 00:22:49,670 Znak% c je samo za napake preverjanje. 373 00:22:49,670 --> 00:22:52,510 Ne želimo, da bi znak za številko, 374 00:22:52,510 --> 00:22:54,980 ampak kaj mi to omogoča, da storiti, je naslednje: 375 00:22:54,980 --> 00:23:01,270 Izkazalo se je, da sscanf, poleg shranjevanje vrednosti v n in C, v tem primeru tukaj, 376 00:23:01,270 --> 00:23:08,170 kar je prav tako je vrne število spremenljivk je dal noter vrednosti 377 00:23:08,170 --> 00:23:13,330 Torej, če ste le vtipkati 1 2 3, potem pa samo% d bo tekmo 378 00:23:13,330 --> 00:23:18,830 in šele gets n shranjen v vrednosti podobnega 1 2 3 in nič ne dobi dal na c; 379 00:23:18,830 --> 00:23:20,870 c ostaja smeti vrednost, če se tako izrazim. 380 00:23:20,870 --> 00:23:23,550 Garbage zato, ker nikoli ni bil inicializiran kot neko vrednost. 381 00:23:23,550 --> 00:23:29,390 Torej, v tem primeru sscanf vrne 1, ker sem poseljena enega od teh kazalcev, 382 00:23:29,390 --> 00:23:33,650 v tem primeru je super. Imam int, zato sem se sprostiti linijo sprostiti pomnilnik 383 00:23:33,650 --> 00:23:37,150 da GetString dejansko dodeljena, in potem se vrnem n. 384 00:23:37,150 --> 00:23:42,210 V nasprotnem primeru, če ste se kdaj spraševali, če ta izjava Ponovno prihaja, prihaja od tukaj. 385 00:23:42,210 --> 00:23:45,770 Če pa, nasprotno, sem vnesite 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 Samo nekaj naključno zaporedje besedila, sscanf bo videti, 387 00:23:48,640 --> 00:23:51,500 Ooh, število, ooh, število, ooh, število, ooh - f. 388 00:23:51,500 --> 00:23:54,190 In to se dogaja, da je dal 1 2 3 leta n. 389 00:23:54,190 --> 00:23:59,970 To bo dal fv c, in se nato vrne 2. 390 00:23:59,970 --> 00:24:02,980 Torej imamo, samo z osnovno definicijo vedenja scanf je, 391 00:24:02,980 --> 00:24:06,170 zelo preprost način - no, na prvi pogled zapleteno, ampak na koncu dneva, 392 00:24:06,170 --> 00:24:11,460 dokaj preprost mehanizem rekel, da je int, in če je tako, je to edina stvar, ki sem našel? 393 00:24:11,460 --> 00:24:14,950 In prazen prostor tukaj je namerno. Če ste prebrali dokumentacijo za sscanf, 394 00:24:14,950 --> 00:24:18,690 vam pove, da če so kos belega prostora na začetku ali na koncu, 395 00:24:18,690 --> 00:24:24,990 sscanf bo tudi omogočila uporabniku, iz katerega koli razloga, da hit preslednico 1 2 3, in da bo zakonito. 396 00:24:24,990 --> 00:24:28,310 To ne bo nadrl uporabnika samo zato, ker so hit preslednico na začetku ali na koncu, 397 00:24:28,310 --> 00:24:32,160 ki je samo malo bolj uporabniku prijazen. 398 00:24:32,160 --> 00:24:34,160 >> Vsa vprašanja, nato pa GetInts? Ja? 399 00:24:34,160 --> 00:24:36,820 [Student vprašanje, nerazumljiv] 400 00:24:36,820 --> 00:24:40,740 >> Dobro vprašanje. Kaj pa, če si jo vnesli v char, kot f in pritisnite tipko Enter 401 00:24:40,740 --> 00:24:47,830 ne da bi kdaj tipkanje 1 2 3; kaj misliš vedenje te vrstice kode bi se potem lahko? 402 00:24:47,830 --> 00:24:50,500 Tako lahko sscanf zajema tudi to, ker v tem primeru, 403 00:24:50,500 --> 00:24:56,280 to ne bo zapolniti n ali c, da se bo namesto tega vrne 0. 404 00:24:56,280 --> 00:25:01,540 V tem primeru sem tudi, da lov scenarij, ker je pričakovana vrednost je 1 želim. 405 00:25:01,540 --> 00:25:07,310 Želim samo 1, in samo 1 stvar je treba zapolniti. Dobro vprašanje. Drugo? 406 00:25:07,310 --> 00:25:09,610 >> V redu, zato naj se ne gredo skozi vse funkcije v tukaj, 407 00:25:09,610 --> 00:25:11,820 ampak tisti, ki se zdi, da je morda preostale obresti 408 00:25:11,820 --> 00:25:14,530 je GetString, ker se je izkazalo, da GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong vseh punt veliko funkcionalnosti za GetString. 410 00:25:19,490 --> 00:25:22,860 Torej si oglejte, kako se je izvajal tukaj. 411 00:25:22,860 --> 00:25:27,040 Tole izgleda malo zapleteni, vendar se uporablja enake osnove 412 00:25:27,040 --> 00:25:29,680 da smo začeli govoriti o zadnjem tednu. Torej, v GetString, 413 00:25:29,680 --> 00:25:32,670 ki ne prevzema nobene trditve, kot na praznino sem gor, 414 00:25:32,670 --> 00:25:37,110 in vrne niz, tako da sem o razglasitvi niz imenovano buffer. 415 00:25:37,110 --> 00:25:39,670 Res ne vem, kaj se dogaja, da se uporabljajo za še, ampak bomo videli. 416 00:25:39,670 --> 00:25:42,950 Izgleda zmogljivosti je privzeto, 0, niso povsem prepričani, kam to pelje. 417 00:25:42,950 --> 00:25:44,920 Ne vem, kaj se dogaja n, ki se uporabljajo za še. 418 00:25:44,920 --> 00:25:47,860 Ampak zdaj je že malo bolj zanimivo, da je v skladu 243, 419 00:25:47,860 --> 00:25:51,760 izjavljamo z int c, to je neke vrste neumna podrobnosti. 420 00:25:51,760 --> 00:25:58,080 Char je 8 bitov, 8 bitov lahko shranite, koliko različnih vrednosti? 421 00:25:58,080 --> 00:26:03,310 256. Problem je, če hočeš imeti 256 različnih znakov ASCII, 422 00:26:03,310 --> 00:26:06,210 ki so, če menite, nazaj, in to ni nekaj, kar na pamet. 423 00:26:06,210 --> 00:26:09,100 Ampak, če mislite, da nazaj v ta velik ASCII tabeli smo imeli pred tedni, 424 00:26:09,100 --> 00:26:13,780 je bilo v tem primeru, 128 ali 256 ASCII znakov. 425 00:26:13,780 --> 00:26:16,220 Uporabili smo vse vzorce 0 in 1 se dogaja. 426 00:26:16,220 --> 00:26:19,410 To je problem, če želite, da bi bili sposobni odkriti napako. 427 00:26:19,410 --> 00:26:23,290 Ker če že uporabljate za vaše vrednosti 256 znakov 428 00:26:23,290 --> 00:26:26,390 nisi zares načrtovati vnaprej, ker imate zdaj nikakor ne pravim, 429 00:26:26,390 --> 00:26:29,750 "To ni zakonit znakov, to pa je nekaj napačno sporočilo." 430 00:26:29,750 --> 00:26:32,430 Torej, kaj počne, je svet, ki jih uporabljajo drugi največji vrednosti, 431 00:26:32,430 --> 00:26:35,790 nekaj podobnega notr, tako da boste imeli noro število bitov, 432 00:26:35,790 --> 00:26:39,610 32 za 4000000000 možnih vrednosti, tako da lahko preprosto na koncu z uporabo, 433 00:26:39,610 --> 00:26:44,800 v bistvu, 257 izmed njih, 1 od katerih ima nekaj posebnega pomena kot napako. 434 00:26:44,800 --> 00:26:49,190 >> Torej, poglejmo, kako to deluje. V skladu 246, imam veliko while zanko 435 00:26:49,190 --> 00:26:54,530 da kliče fgetc, f pomeni datoteko, getc, nato pa stdin. 436 00:26:54,530 --> 00:26:59,030 Izkazalo se je, da je to le še bolj natančen način rekel "beri vhod s tipkovnice." 437 00:26:59,030 --> 00:27:02,730 Standardni vhod pomeni, tipkovnica, standardni izhod pomeni zaslon, 438 00:27:02,730 --> 00:27:06,920 in standardna napaka, ki jih bomo videli v pset 4, pomeni zaslon, 439 00:27:06,920 --> 00:27:09,670 ampak poseben del zaslona, ​​tako da to ni združevali 440 00:27:09,670 --> 00:27:13,760 z dejansko močjo, ki jo namerava natisniti, a več o tem v prihodnosti. 441 00:27:13,760 --> 00:27:19,430 Torej fgetc pomeni le prebral en znak na tipkovnici, in jo shranite kje? 442 00:27:19,430 --> 00:27:24,000 Shranite jo v C, in nato preverite, tako da sem samo z nekaj matematične veznike tukaj 443 00:27:24,000 --> 00:27:28,430 preverite, da ni enako \ n, tako da je uporabnik zadeti nastopiti. 444 00:27:28,430 --> 00:27:31,510 Želimo ustaviti na tej točki, konec zanke, in smo tudi želeli preveriti 445 00:27:31,510 --> 00:27:36,170 Za posebno konstanten, EOF, ki je, če veš, ali ugibati - kaj to stati? 446 00:27:36,170 --> 00:27:39,860 Konec datoteke. Torej, to je nekako nesmiselno, ker če sem tipkanje na tipkovnici, 447 00:27:39,860 --> 00:27:41,900 pa je res ni vpleten v to sliko, 448 00:27:41,900 --> 00:27:44,330 ampak to je samo nekako splošen izraz pomeni 449 00:27:44,330 --> 00:27:50,320 da nič ne prihaja od prstov The Human je. EOF. Konec datoteke. 450 00:27:50,320 --> 00:27:52,600 Kot prahi, če ste že kdaj udaril nadzornega d na tipkovnici, 451 00:27:52,600 --> 00:27:54,680 ne da bi imeli še, da ste zadeli nadzora c. 452 00:27:54,680 --> 00:27:57,920 Toda nadzor d pošlje to posebno stalno imenovano EOF. 453 00:27:57,920 --> 00:28:03,100 >> Torej, zdaj imamo samo nekaj dinamično dodeljevanje pomnilnika. 454 00:28:03,100 --> 00:28:06,460 Torej, če n + 1> zmogljivosti, zdaj bom razložil n. 455 00:28:06,460 --> 00:28:09,380 n je samo, koliko bajtov je trenutno v varovalnem, 456 00:28:09,380 --> 00:28:11,970 niz, ki ga trenutno gradnjo od uporabnika. 457 00:28:11,970 --> 00:28:16,240 Če imate več znakov v vašem pufru, kot ga imajo zmogljivosti v pufru, 458 00:28:16,240 --> 00:28:20,760 intuitivno, kaj moramo storiti, je, potem nameniti več zmogljivosti. 459 00:28:20,760 --> 00:28:24,490 Grem prelistati čez nekaj aritmetične tukaj 460 00:28:24,490 --> 00:28:26,900 in se osredotočiti samo na to funkcijo tukaj. 461 00:28:26,900 --> 00:28:29,170 Veš, kaj je malloc ali vsaj splošno znano. 462 00:28:29,170 --> 00:28:32,380 Ugani, kaj realloc ne. [Student odgovor, nerazumljiv] 463 00:28:32,380 --> 00:28:35,690 >> Ja. In to ni povsem dodate pomnilnik, ampak prerazporeja spomin na naslednji način: 464 00:28:35,690 --> 00:28:40,530 Če je še dovolj prostora ob koncu niza, da bi vam več tega pomnilnika 465 00:28:40,530 --> 00:28:43,370 kot je bilo prvotno vam, potem boste dobili, da dodatnega pomnilnika. 466 00:28:43,370 --> 00:28:46,640 Torej si lahko samo polaganje strune znake back to back to back to back. 467 00:28:46,640 --> 00:28:49,290 Ampak, če to ne drži, saj ste čakali predolgo 468 00:28:49,290 --> 00:28:51,700 in nekaj naključno dobili plopped v spomin, toda tam zunaj 469 00:28:51,700 --> 00:28:56,480 spomin sem, da je v redu. Realloc bo naredil vse težko delo za vas, 470 00:28:56,480 --> 00:28:58,810 premakniti niz, ki ste jih prebral v tem daleč od tukaj, 471 00:28:58,810 --> 00:29:02,550 dal dol, in nato dal nekaj več vzletno-pristajalne steze na tej točki. 472 00:29:02,550 --> 00:29:05,610 Torej, zamahnil z roko, naj povem, da to, kar počne GetString 473 00:29:05,610 --> 00:29:09,540 se začenja z malo pomnilnika, morda 1 en znak, 474 00:29:09,540 --> 00:29:12,300 in če uporabnik vnese v 2 znakov, GetString konča 475 00:29:12,300 --> 00:29:15,210 realloc kliče in pravi: "Oh, 1 znak ni bilo dovolj. 476 00:29:15,210 --> 00:29:18,480 Daj mi 2 znakov. " Potem, če ste prebrali logiki zanke, 477 00:29:18,480 --> 00:29:21,070 to bo rekel: 'Oh, si ga vnesli v 3 znake. 478 00:29:21,070 --> 00:29:25,690 Daj mi zdaj ne pa 2 4 znake, potem mi 8, potem mi 16 in 32 ". 479 00:29:25,690 --> 00:29:28,180 Dejstvo, da sem podvoji zmogljivost vsakič 480 00:29:28,180 --> 00:29:30,320 pomeni, da se buffer ne bo povečevala. 481 00:29:30,320 --> 00:29:35,870 To se dogaja, da raste izredno hitro, in kaj bi lahko bila prednost tega? 482 00:29:35,870 --> 00:29:38,540 Zakaj sem podvojitev medpomnilnik, čeprav uporabnik 483 00:29:38,540 --> 00:29:41,450 Morda potrebujete le 1 dodatno znak iz tipkovnice? 484 00:29:41,450 --> 00:29:44,830 [Student odgovor, nerazumljiv]. >> Kaj je to? 485 00:29:44,830 --> 00:29:46,750 Točno tako. Saj ni treba, da raste tako pogosto. 486 00:29:46,750 --> 00:29:48,870 In to je le neke vrste - Ti si varovanju vaše stave tukaj. 487 00:29:48,870 --> 00:29:54,150 Ideja je, da ne želite, da pokličete realloc veliko, saj kaže, da je počasen. 488 00:29:54,150 --> 00:29:56,840 Vsakič, ko zaprosi za operacijski sistem za spomin, saj boste kmalu videli 489 00:29:56,840 --> 00:30:00,620 v prihodnjo problem, pa kaže, da traja nekaj časa. 490 00:30:00,620 --> 00:30:04,980 Torej čim bolj zmanjšati tako veliko časa, tudi če ste zapravljaš nekaj prostora, kaže, da je dobra stvar. 491 00:30:04,980 --> 00:30:07,250 >> Ampak, če bomo prebrali v zadnjem delu GetString tukaj 492 00:30:07,250 --> 00:30:10,880 in spet, razumevanje vsakega posameznega linijo tu ni tako pomembno danes. 493 00:30:10,880 --> 00:30:14,830 Toda opazil, da je na koncu poziva malloc še enkrat, in razdeli 494 00:30:14,830 --> 00:30:16,980 točno tako, kot mnoge bajte, kot jo potrebuje za niz 495 00:30:16,980 --> 00:30:21,620 in nato odvrže s pozivom brezplačno, pretirano velik medpomnilnik, 496 00:30:21,620 --> 00:30:23,510 če je dobil celo podvojila prevečkrat. 497 00:30:23,510 --> 00:30:25,970 Skratka, to je, kako GetString je delal ves ta čas. 498 00:30:25,970 --> 00:30:30,100 Vse to pa je prebral en znak naenkrat spet in spet in spet 499 00:30:30,100 --> 00:30:37,930 in vsakič, ko ga potrebuje dodaten pomnilnik, se sprašuje operacijski sistem, ki mu jih kliče realloc. 500 00:30:37,930 --> 00:30:41,660 Kakšno vprašanje? V redu. 501 00:30:41,660 --> 00:30:45,220 >> Napad. Zdaj, ko razumemo napotke ali vsaj 502 00:30:45,220 --> 00:30:47,560 so vse bolj seznanjeni s kazalci, 503 00:30:47,560 --> 00:30:50,020 kaj menijo, kako je cel svet začne na propad 504 00:30:50,020 --> 00:30:53,160 če se ne znajdete brani pred kontradiktornem uporabnikov, 505 00:30:53,160 --> 00:30:55,180 ljudje, ki poskušajo vdreti v sistem. 506 00:30:55,180 --> 00:31:00,260 Ljudje, ki se trudijo za krajo programske opreme, ki jih izogiba nekaj registracijsko kodo 507 00:31:00,260 --> 00:31:02,150 ki bi jih sicer morali vnesti noter 508 00:31:02,150 --> 00:31:04,860 Oglejte si ta primer tukaj, ki je samo C kodo 509 00:31:04,860 --> 00:31:07,920 , ki ima funkcijo glavnega na dnu, da pokliče funkcijo foo, 510 00:31:07,920 --> 00:31:12,100 in kaj se gre, da foo? [Študent] en argument. 511 00:31:12,100 --> 00:31:15,660 Enotni >> argument. Torej, argv [1], ki pomeni prvo besedo uporabnik natipkan 512 00:31:15,660 --> 00:31:19,150 v ukazni vrstici za a.out ali kakorkoli se imenuje program. 513 00:31:19,150 --> 00:31:24,920 Torej foo, na vrhu, se v char *, char * ampak je samo, kaj? 514 00:31:24,920 --> 00:31:28,860 String. Nič novega tukaj, in da se niz je samovoljno imenuje bar. 515 00:31:28,860 --> 00:31:36,090 V skladu s tem tukaj, char c [12], v nekakšno pol-tehnične angleščine, kaj je ta linija dela? 516 00:31:36,090 --> 00:31:40,640 Array -? Znaki. Daj mi niz 12 znakov. 517 00:31:40,640 --> 00:31:44,970 Torej bi temu lahko rekli buffer. To je strokovno imenujemo c, vendar varovalni pri programiranju 518 00:31:44,970 --> 00:31:47,890 pomeni le kup prostora, ki ga lahko dajo nekaj stvari noter 519 00:31:47,890 --> 00:31:49,940 >> Potem končno, memcpy, smo se ni uporabljal pred. 520 00:31:49,940 --> 00:31:52,380 Vendar pa si verjetno lahko uganiti, kaj počne. To kopije pomnilnika. 521 00:31:52,380 --> 00:31:58,790 Kaj počne? No, očitno kopira bar, vložek, v c, 522 00:31:58,790 --> 00:32:03,420 vendar le do dolžine traku. 523 00:32:03,420 --> 00:32:07,440 Ampak tam je napaka tukaj. 524 00:32:07,440 --> 00:32:14,500 Ok, tako tehnično moramo res strlen (bar) x sizeof (char), to je pravilno. 525 00:32:14,500 --> 00:32:17,920 Vendar pa v najslabšem primeru v tej zadevi, predpostavimo, da je that - tako, v redu. 526 00:32:17,920 --> 00:32:23,760 Potem je tu še 2 bugs. Torej, sizeof (char), vse v redu, naredimo to malo širše. 527 00:32:23,760 --> 00:32:28,860 Torej, zdaj je še napako, ki je kaj? 528 00:32:28,860 --> 00:32:31,630 [Student odgovor, nerazumljiv] >> Preverite za kaj? Ok, tako da bi morali biti preverjanje 529 00:32:31,630 --> 00:32:35,010 Za NULL, ker slabe stvari se dogajajo, ko kazalec NULL, 530 00:32:35,010 --> 00:32:38,490 Ker boste morda na koncu dogaja tam, in ga ne bi nikoli šli na NULL 531 00:32:38,490 --> 00:32:40,890 da ga Dereferenciranje z * operaterja. 532 00:32:40,890 --> 00:32:45,250 Torej, to je dobro in kaj še počnemo? Logično pa je napaka tu. 533 00:32:45,250 --> 00:32:47,650 [Student odgovor, nerazumljiv] 534 00:32:47,650 --> 00:32:51,340 Zato preverite, če >> argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Ok, tako da je 3 napake v tem programu tukaj. 536 00:32:54,130 --> 00:33:00,080 Mi ne preverja, če je uporabnik dejansko vnesli v ničemer v argv [1], dobro. 537 00:33:00,080 --> 00:33:02,240 Torej, kaj je 3. napako? Ja? 538 00:33:02,240 --> 00:33:04,420 [Student odgovor, nerazumljiv] >> Dobro. 539 00:33:04,420 --> 00:33:09,590 Zato smo preverili en scenarij. Mi implicitno preveriti ne kopirajte več pomnilnika 540 00:33:09,590 --> 00:33:12,800 kot bi presegati dolžine bara. 541 00:33:12,800 --> 00:33:15,720 Torej, če je uporabnik niz vnesli, je 10 znakov, 542 00:33:15,720 --> 00:33:18,260 To je rekel, "samo kopirate 10 znakov." 543 00:33:18,260 --> 00:33:21,140 In to je v redu, kaj pa če si jo vnesli v besedo na poziv 544 00:33:21,140 --> 00:33:29,360 kot 20 znakov besedo, to je, ki pravijo, kopiranja 20 znakov iz bara v kaj? 545 00:33:29,360 --> 00:33:32,840 c, sicer znan kot naš buffer, kar pomeni, da si napisal podatke 546 00:33:32,840 --> 00:33:35,950 do 8 bajtov lokacijah, ki ni v vaši lasti, 547 00:33:35,950 --> 00:33:38,320 in ne njihov lastnik v smislu, da jih nikoli ne dodelijo. 548 00:33:38,320 --> 00:33:41,190 Torej, to je tisto, kar je splošno znano kot napad buffer overflow, 549 00:33:41,190 --> 00:33:46,650 ali medpomnilnika napad in da je napad v smislu, da če uporabnik 550 00:33:46,650 --> 00:33:50,650 ali program, ki kliče svojo funkcijo, to počne zlonamerno, 551 00:33:50,650 --> 00:33:53,780 kaj se dejansko zgodi potem je lahko precej slabo. 552 00:33:53,780 --> 00:33:55,690 >> Oglejmo si te slike tukaj. 553 00:33:55,690 --> 00:33:59,070 Ta slika predstavlja svoj kup pomnilnika. 554 00:33:59,070 --> 00:34:01,050 In spomnim, da vsakič, ko pokličete funkcijo, 555 00:34:01,050 --> 00:34:04,520 boste dobili tale okvir na sklad, nato drugo in nato drugo in nato drugo. 556 00:34:04,520 --> 00:34:07,250 In tako daleč, da smo nekako odvzete to stran kot pravokotnike 557 00:34:07,250 --> 00:34:09,380 ali je na krovu ali na zaslonu tukaj. 558 00:34:09,380 --> 00:34:12,219 Ampak, če povečate na eno od teh motivov 559 00:34:12,219 --> 00:34:16,460 Ko pokličete funkcijo foo, se je izkazalo, da to še ni vse na kupu 560 00:34:16,460 --> 00:34:18,739 znotraj tega okvirja in da pravokotnik 561 00:34:18,739 --> 00:34:23,370 kot samo x in y ter a in b, tako kot nismo govorili o zamenjavi. 562 00:34:23,370 --> 00:34:25,949 Izkazalo se je, da so nekateri nižji ravni podrobnosti, 563 00:34:25,949 --> 00:34:27,780 med njimi vrnitev naslov. 564 00:34:27,780 --> 00:34:33,020 Tako se izkaže, ko je glavna zahteva foo, glavni obvestiti foo 565 00:34:33,020 --> 00:34:36,760 Kaj je glavni naslov v pomnilniku računalnika. 566 00:34:36,760 --> 00:34:40,659 Ker drugače se takoj foo storiti izvršitve, kot v tem primeru tukaj, 567 00:34:40,659 --> 00:34:43,790 ko pridete na to tesno kodraste brace na koncu foo, 568 00:34:43,790 --> 00:34:48,860 kako za vraga ne ve, kje je foo nadzora programa naj bi šel? 569 00:34:48,860 --> 00:34:52,460 Izkaže se, da je odgovor na to vprašanje je v tem rdečega pravokotnika tukaj. 570 00:34:52,460 --> 00:34:56,130 To predstavlja kazalec, in to je do računalnika za shranjevanje, začasno, 571 00:34:56,130 --> 00:35:00,250 na tako imenovani dimnik je glavni naslov, tako da kakor hitro foo storiti izvršitve, 572 00:35:00,250 --> 00:35:04,110 računalnik ve, kje in kaj postavka v glavnem za vrnitev. 573 00:35:04,110 --> 00:35:06,900 Shranjeni okvir kazalec se nanaša prav na to. 574 00:35:06,900 --> 00:35:09,620 Char * bar tu pomeni kaj? 575 00:35:09,620 --> 00:35:14,740 No, zdaj je to modra segmentnih je okvir, bla je, kaj je bar? 576 00:35:14,740 --> 00:35:18,300 Ok, bar je samo argument funkcije foo. 577 00:35:18,300 --> 00:35:20,720 >> Torej, zdaj smo spet na znano sliko. 578 00:35:20,720 --> 00:35:22,960 Obstaja več stvari in več motenj na zaslonu 579 00:35:22,960 --> 00:35:27,490 vendar je ta svetlo modra odsek je tisto, kar smo se opira na tablo za nekaj podobnega zamenjave. 580 00:35:27,490 --> 00:35:31,890 To je okvir za foo in edina stvar v njem sedaj nahaja bar, 581 00:35:31,890 --> 00:35:34,630 ki je ta parameter. 582 00:35:34,630 --> 00:35:39,840 Vendar pa je treba, kaj se v plasteh, v skladu s tem kodeksom tukaj? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Torej moramo tudi videti 12 kvadratov spomina, 584 00:35:44,280 --> 00:35:46,260 dodeljena spremenljivki, imenovano c. 585 00:35:46,260 --> 00:35:48,340 In res mi je, da na zaslonu. 586 00:35:48,340 --> 00:35:51,650 Samem vrhu je c [0], nato pa avtor tega diagrama 587 00:35:51,650 --> 00:35:55,130 ni motilo pripravo vseh trgih, vendar so v resnici obstaja 12 588 00:35:55,130 --> 00:36:00,120 ker če pogledaš na spodnji desni, c [11], če šteješ od 0, je 12 takih bajtov. 589 00:36:00,120 --> 00:36:06,190 Ampak tukaj je problem: V katero smer je C raste? 590 00:36:06,190 --> 00:36:10,390 Nekako zgoraj navzdol, kajne? Če se začne na vrhu in raste do dna, 591 00:36:10,390 --> 00:36:13,480 ne izgleda kot smo odšli sami veliko vzletno-pristajalne steze tu sploh. 592 00:36:13,480 --> 00:36:15,320 Mi smo nekako sebe naslikal v kotu, 593 00:36:15,320 --> 00:36:20,210 in c [11] je prav proti baru, ki je vse do pred dimnika okvirja kazalcem 594 00:36:20,210 --> 00:36:23,800 , ki je vse do pred povratnim naslovom, da ni več prostora. 595 00:36:23,800 --> 00:36:26,100 Torej, kaj je bila posledica, potem, če si zamočil, 596 00:36:26,100 --> 00:36:30,460 in poskusite branje 20 bajtov v 12-Bajt? 597 00:36:30,460 --> 00:36:33,460 Kadar so ti dodatni 8 bajtov šli? 598 00:36:33,460 --> 00:36:36,370 Znotraj vsega drugega, nekaj kar je zelo pomembno. 599 00:36:36,370 --> 00:36:40,480 In najbolj pomembna stvar, lahko je rdeča škatla tam, vaš naslov. 600 00:36:40,480 --> 00:36:44,720 Ker predvidevam, da ste pomotoma ali adversarially 601 00:36:44,720 --> 00:36:48,040 prepisati tiste 4 bajte, da kazalec naslov, 602 00:36:48,040 --> 00:36:53,190 ne samo s smetmi, vendar z nekaterimi, ki se zgodi, da predstavljajo dejanskega naslova v spominu? 603 00:36:53,190 --> 00:36:55,930 Kaj je implicaiton, logično? 604 00:36:55,930 --> 00:36:59,080 [Študentski odgovori, nerazumljiv] >> Točno tako. Ko se vrne foo 605 00:36:59,080 --> 00:37:03,560 in zadetki, ki brace kodrasti, program bo nadaljevanje ne bo vrnil na main, 606 00:37:03,560 --> 00:37:08,320 da se bo vrnil na kateri koli naslov v tem rdečem polju. 607 00:37:08,320 --> 00:37:11,560 >> Zdaj, v primeru izognilo programske opreme registracije 608 00:37:11,560 --> 00:37:14,400 kaj je naslov, ki se je vrnil, da je funkcija 609 00:37:14,400 --> 00:37:18,820 da dobi običajno imenujemo ko boste plačali za programsko opremo in vnesejo svojo registracijsko kodo? 610 00:37:18,820 --> 00:37:23,160 Lahko bi razvrstiti trik računalnik v ne bo tukaj, ampak namesto tega dogaja tukaj. 611 00:37:23,160 --> 00:37:27,950 Ali pa, če si res pameten, lahko nasprotnik dejansko vnesite na tipkovnici, 612 00:37:27,950 --> 00:37:32,500 na primer, ni dejansko besedo, ne pa 20 znakov, ampak predvidevam on ali ona 613 00:37:32,500 --> 00:37:36,200 vrste v nekaterih znakov, ki predstavljajo kodo? 614 00:37:36,200 --> 00:37:38,860 In to ne bo C kodo, da bo v znake 615 00:37:38,860 --> 00:37:42,920 ki predstavljajo šifre, binarne stroje 0 in 1 je. 616 00:37:42,920 --> 00:37:46,740 Recimo, da si dovolj pameten, da bi to dosegli, bi nekako prilepite v GetString poziv 617 00:37:46,740 --> 00:37:49,460 nekaj, kar je v bistvu sestavljen kodo 618 00:37:49,460 --> 00:37:56,900 in zadnja 4 bajte prepisati, da povratni naslov, naslov in kaj ne, da vložek ne? 619 00:37:56,900 --> 00:38:01,860 V njej so zbrani v tej rdeči pravokotnik naslov prvega bajt pufra. 620 00:38:01,860 --> 00:38:04,270 Torej moraš biti zelo pameten, in to je veliko poskusov in napak 621 00:38:04,270 --> 00:38:08,500 za slabe ljudi tam zunaj, ampak, če lahko ugotovimo, kako velik je ta blažilec, 622 00:38:08,500 --> 00:38:12,170 tako, da je v zadnjih nekaj bajtov na vhodu, ki jih posredujete programa 623 00:38:12,170 --> 00:38:15,970 zgodi, da se enakovredno naslovu začetku vašega pufer, 624 00:38:15,970 --> 00:38:22,270 lahko to storijo. Če rečemo, normalno, zdravo in \ 0, to je tisto, kar konča v pufru. 625 00:38:22,270 --> 00:38:27,860 Ampak, če smo bolj pameten in mi zapolnil to rezervo s tem, kar bomo generično klic napad kodo, 626 00:38:27,860 --> 00:38:31,920 ,,,: Napad, napad, napad, napad, če je to nekaj, kar počne nekaj slabega. 627 00:38:31,920 --> 00:38:35,190 No, kaj se zgodi, če si res pameten, lahko naredite to: 628 00:38:35,190 --> 00:38:41,740 V rdečem polju tu je zaporedje številk: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Obvestilo, da se ujema s številko, ki je tu gor. 630 00:38:44,890 --> 00:38:47,280 To je v obratnem vrstnem redu, a več o tem kdaj drugič. 631 00:38:47,280 --> 00:38:51,430 Obvestilo, da je to vaš naslov je bil namerno spremenjen 632 00:38:51,430 --> 00:38:54,970 na enak naslov tukaj, ne naslov glavnega. 633 00:38:54,970 --> 00:39:00,170 Torej, če je slab, je zelo pameten, on ali ona se dogaja, da so v tem napadu kodo 634 00:39:00,170 --> 00:39:02,890 nekaj podobnega, "Izbrišite vse datoteke uporabnika." 635 00:39:02,890 --> 00:39:06,320 Ali "Kopiraj gesla, 'ali' Ustvari svoj uporabniški račun, da bom lahko prijavi v." 636 00:39:06,320 --> 00:39:10,130 Karkoli, in to je tako nevarnost in moč C. 637 00:39:10,130 --> 00:39:12,900 Ker imate dostop do pomnilnika preko kazalcev 638 00:39:12,900 --> 00:39:15,950 in lahko zato napišete karkoli želite v spomin računalnika. 639 00:39:15,950 --> 00:39:19,290 Lahko naredite računalnik storiti vse, kar hočeš samo s 640 00:39:19,290 --> 00:39:22,780 potem pa preskakujejo v svojem pomnilnika. 641 00:39:22,780 --> 00:39:27,230 In tako je tudi danes, tako da veliko programov in toliko spletnih strani, ki so ogrožena 642 00:39:27,230 --> 00:39:29,730 omejijo na ljudi, ki izkoriščajo to. 643 00:39:29,730 --> 00:39:32,510 In morda to zdi super prefinjeno napada, 644 00:39:32,510 --> 00:39:34,220 vendar ne vedno začne na tak način. 645 00:39:34,220 --> 00:39:36,770 >> Dejstvo je, da tisto, kar slabi ljudje navadno storiti, je, 646 00:39:36,770 --> 00:39:41,470 ali je to program v ukazni vrstici ali program, GUI, ali spletne strani, 647 00:39:41,470 --> 00:39:43,290 je pravkar začel zagotavljati neumnosti. 648 00:39:43,290 --> 00:39:46,940 Vnesete v res velikem besedo v iskalno polje ter zadeti nastopiti, 649 00:39:46,940 --> 00:39:49,030 in počakate, da vidim, če je na spletni strani zruši. 650 00:39:49,030 --> 00:39:53,270 Ali pa čakam, da vidim, če je program kaže nekaj o napaki. 651 00:39:53,270 --> 00:39:55,480 Ker, če boste dobili srečo, kot je slab človek, 652 00:39:55,480 --> 00:39:59,610 in si zagotoviti nekaj norega vhod, ki se zruši program, 653 00:39:59,610 --> 00:40:02,280 to pomeni, da programer ni predvidel svoje slabo vedenje 654 00:40:02,280 --> 00:40:05,420 kar pomeni, da lahko verjetno, z dovolj truda, 655 00:40:05,420 --> 00:40:09,870 dovolj poskusov in napak, ugotoviti, kako plače natančnejši napad. 656 00:40:09,870 --> 00:40:15,900 Torej toliko del varnosti ni samo preprečevanje te napade v celoti, vendar jih zazna 657 00:40:15,900 --> 00:40:20,250 in dejansko si ogleduje dnevnike in videli, kaj so ljudje nori vhodi vnesli v vašo spletno stran. 658 00:40:20,250 --> 00:40:26,040 Kaj iskalni pojmi so ljudje vnesli v vašo spletno stran, v upanju, poplavljenih nekaj buffer? 659 00:40:26,040 --> 00:40:28,900 In to vse izvira na preprostih osnove, kar je matrika, 660 00:40:28,900 --> 00:40:32,510 in kaj to pomeni za dodeljevanje in uporabo spomin? 661 00:40:32,510 --> 00:40:34,920 In povezano z Tudi to je to. 662 00:40:34,920 --> 00:40:37,520 >> Torej, kaj je samo pogled v notranjosti trdega diska še enkrat. 663 00:40:37,520 --> 00:40:40,190 Torej spomnite iz teden ali dva nazaj, ko povlečete datoteke 664 00:40:40,190 --> 00:40:45,470 da lahko koš ali smeti, kaj se zgodi? 665 00:40:45,470 --> 00:40:47,850 [Študent] Nič. >> Ja, popolnoma nič. Sčasoma, če naletite nizka 666 00:40:47,850 --> 00:40:51,370 prostora na disku, bo Windows ali Mac OS začetek brisanje datotek za vas. 667 00:40:51,370 --> 00:40:53,670 Ampak, če vlečete nekaj notri, potem pa sploh ni varno. 668 00:40:53,670 --> 00:40:56,550 Vse vaše član roomate, prijatelja ali družinskega storiti, je dvojni klik, in voila. 669 00:40:56,550 --> 00:40:59,720 Tam je vse skicirana datoteke, ki jih poskušali izbrisati. 670 00:40:59,720 --> 00:41:02,840 Torej, večina od nas vsaj vedeli, da imate na desni klik ali nadzor klik 671 00:41:02,840 --> 00:41:05,320 in prazne smeti, ali nekaj takega. 672 00:41:05,320 --> 00:41:07,900 Toda tudi takrat, da ni čisto narediti trik. 673 00:41:07,900 --> 00:41:11,340 Ker to, kar se zgodi, ko imate datoteko na trdem disku 674 00:41:11,340 --> 00:41:14,590 , ki predstavlja nekaj Wordov dokument ali nekaj JPEG? 675 00:41:14,590 --> 00:41:18,820 In to predstavlja vaš trdi disk, in recimo, da to pomeni, da je tukaj IVer datoteko 676 00:41:18,820 --> 00:41:21,640 in je bila sestavljena iz cel kup 0 in 1 je. 677 00:41:21,640 --> 00:41:25,470 Kaj se zgodi, če ne boste le povlecite datoteko v koš ali koš, 678 00:41:25,470 --> 00:41:30,390 ampak jo izpraznite? 679 00:41:30,390 --> 00:41:32,820 Nekako nič. To ni popolnoma nič zdaj. 680 00:41:32,820 --> 00:41:37,630 Zdaj je samo nič, ker je malo nekaj zgodi v obliki te tabele. 681 00:41:37,630 --> 00:41:41,170 Torej je neke vrste podatkovne baze ali tabele znotraj pomnilnika računalnika 682 00:41:41,170 --> 00:41:44,470 da je v bistvu 1 stolpec datotek imen, 683 00:41:44,470 --> 00:41:50,550 in 1 stolpec za lokacijo datoteke, kjer bi to bilo mesto 123, samo naključno število. 684 00:41:50,550 --> 00:41:58,270 Tako bi imeli nekaj podobnega x.jpg in mesto, 123. 685 00:41:58,270 --> 00:42:02,870 In kaj se zgodi potem, ko izpraznite koš? 686 00:42:02,870 --> 00:42:06,720 Ta izgine. Toda kaj ne izgine, je 0 in 1 je. 687 00:42:06,720 --> 00:42:09,690 >> Torej kaj, potem je povezava z pset 4? 688 00:42:09,690 --> 00:42:13,460 No, z pset 4, samo zato, ker smo pomotoma izbrisanih 689 00:42:13,460 --> 00:42:15,890 compact flash kartico, ki je imel vse te fotografije, 690 00:42:15,890 --> 00:42:18,710 ali pa samo zato, ker je zaradi smole postal poškodovana, 691 00:42:18,710 --> 00:42:21,170 ne pomeni, da je 0 in 1 je niso še vedno tam. 692 00:42:21,170 --> 00:42:23,920 Morda so nekateri od njih izgubljena zaradi dobil nekaj pokvarjenega 693 00:42:23,920 --> 00:42:26,530 v smislu, da so nekateri 0 je postal 1 in 1 je postal 0 letih. 694 00:42:26,530 --> 00:42:30,460 Slabe stvari se lahko zgodi zaradi Otroški voziček programske opreme ali napako strojne opreme. 695 00:42:30,460 --> 00:42:33,510 Toda mnogi od teh bitov, morda celo 100% od njih so še vedno tam, 696 00:42:33,510 --> 00:42:38,330 to je samo, da je računalnik ali fotoaparat ne ve, kje JPEG 1 vpis 697 00:42:38,330 --> 00:42:41,660 in če JPEG 2 vpis v register, če pa je programer, 698 00:42:41,660 --> 00:42:45,800 Veš, z malo zdrava pamet, če ti JPEG ali so kako izgledajo, 699 00:42:45,800 --> 00:42:49,570 lahko analizirate 0 in 1 je in rekel: "Oh. JPEG. Oh, JPEG. " 700 00:42:49,570 --> 00:42:52,830 Lahko napišete program z bistvu le za ali while zanko 701 00:42:52,830 --> 00:42:56,100 da povrne vsak izmed teh datotek. 702 00:42:56,100 --> 00:42:59,360 Torej lekcija pa je, da začnete "varno" brisanje datotek 703 00:42:59,360 --> 00:43:01,720 če želite, da bi se temu izognili v celoti. Ja? 704 00:43:01,720 --> 00:43:06,940 [Student vprašanje, nerazumljiv] 705 00:43:06,940 --> 00:43:11,150 Ste >> več pomnilnika, kot si prej - 706 00:43:11,150 --> 00:43:14,790 Oh! Dobro vprašanje. Torej, zakaj potem, ko praznjenjem koša, 707 00:43:14,790 --> 00:43:18,300 se računalnik vam povem, da imate več prostora, kot si prej? 708 00:43:18,300 --> 00:43:22,450 Na kratko, ker laže. Bolj tehnično, imate več prostora. 709 00:43:22,450 --> 00:43:26,720 Ker zdaj si rekel, lahko dajo druge stvari, kjer je datoteka nekoč bil, 710 00:43:26,720 --> 00:43:28,930 vendar to ne pomeni bitov odhajam 711 00:43:28,930 --> 00:43:33,070 in da ne pomeni bitov se spremenila vse 0 je, na primer, za svojo zaščito. 712 00:43:33,070 --> 00:43:37,520 V nasprotju s tem, če si "varen" brisanje datotek, ali fizično uničiti napravo 713 00:43:37,520 --> 00:43:40,810 je to res edini način, včasih okoli tega. 714 00:43:40,810 --> 00:43:45,300 Torej, zakaj ne gremo na ta pol strašno note, mi pa vas bomo videli v ponedeljek. 715 00:43:45,300 --> 00:43:52,810 CS50.TV