[Powered by Google Translate] [SAVAITĖ 5]
[David J. Malan, Harvardo universitetas]
[Tai CS50.] [CS50.TV]
[Moteris] Jis guli apie tai, kas, aš nežinau.
[Vyras] Taigi, ką mes žinome?
[Moteris] Tai ne 9:15, Ray Santoya buvo bankomatų.
[Vyras] Taigi klausimas yra, ką jis daro 9:16?
[Moteris] 9 mm Fotografavimo ne kažką.
Galbūt jis pamatė, kad Snaiperis.
[Vyras] Arba jis dirbo su juo.
[Moteris] palaukti. Grįžti.
[Vyras] Ką matote?
[♫ suspenseful muzika ♫]
[Moteris] Pareikšti savo veidą. Visą ekraną.
[Man] Jo akiniai. >> Atspindys.
[♫ suspenseful muzika ♫]
[Vyras] Štai beisbolo komandos Nuevita. Štai jų logotipas.
[Moteris] Ir jis kalba, kas dėvi, kad striukė.
>> [David Malan] Taigi, tai yra CS50 savaitė 5 ir šiandien mes sugadinti jums šiek tiek televizijos ir filmų.
Taigi, jei jūs žiūrite šou patiko šį vieną čia,
ir policininkai sako: "Ar galite išvalyti, kad iki?" arba "Stiprinti"
yra ne realiame pasaulyje pagerinti.
Tiesą sakant, tai, ką jūs tikrai gausite šiek tiek kažką panašaus į tai.
Aš iškedentas vieną iš darbuotojų nuotraukas iš puslapio.
Tai yra programa, vadinama Photoshop. Tai yra 1 iš 2 Bowdens
1 iš 3 Bowdens Tiesą sakant, šiandien, nes mes turime ponią Bowden čia taip pat, su Rob ir Povilo.
Bet čia yra Rob ekrane, ir jei mes padidinti tą žibėti, jis visada turėjo savo akis,
tai, ką jūs iš tikrųjų pamatyti, kad tai, ką matote, yra tai, ką jūs gaunate.
Tai yra "patobulinta", todėl "CSI" yra šiek tiek negerai.
Yra vienas kitas klipas, jei mes galime pasirinkti "CSI" tik šiek tiek ilgiau.
Tai vienas yra gražus frazė nuo šiol ištarti, jei norite
gerą techninį su savo draugais, kai tikrai, jūs sakote, nieko.
>> [Vyras] savaites aš tiria Cabby Killer žmogžudysčių
su tam tikru liguistu.
[Moteris # 1] Tai yra realiu laiku.
[Moteris # 2] aš sukursiu grafinė sąsaja, naudojant Visual Basic, pamatyti, jei aš galiu sekti IP adresą.
>> [Malan] Audio out of sync atidėtos, sukurti GUI sąsają, naudojant Visual Basic
sekti IP adresą, yra visiška nesąmonė.
Šiomis dienomis jums nebus naudoti Visual Basic,
nėra reikia GUI, ir IP adresas buvo techniškai tikslūs terminas.
Todėl nuolat akis iš šių, ir vienas iš mano mėgstamiausių:
Tai vienas šiek tiek daugiau paslaptingų, nes jūs turite žinoti, kitą kalbą.
Yra vadinamas Objective-C kalba, kuri yra C. supersets
, O tai reiškia, kad tai C Plus keletą papildomų funkcijų, tarp jų Objektinis programavimas.
Ir tai yra kalba, kad "Apple" išpopuliarino iOS programavimo.
Ir taip čia visiškai iš kito rodo klipas, iš "numeriai
, kad, jei jūs iš tikrųjų atidžiai jūsų programinės įrangos TiVo ir pauzė reikiamu metu,
pamatysite, kad tai, ką jie žiūri į tai ne visai tai yra aprašyta.
Ir leiskite man pabandyti kitą garso jungtis čia ir pamatyti, jei mes negalime
išlaikyti šį kartą sinchronizuoti garso.
Aš duosiu jums "numerius."
>> [Man # 1] 32-bitų IPv4 adresas.
[Man # 2] IP, tai interneto. >> Privatų tinklą. Tai Anita privatus tinklas.
[Malan] Gerai. Tai Objective-C, ir tai kai vaikas spalvinimo programą,
, kaip jūs galite galbūt numanyti iš kintamojo ten pavadinimas.
Taip, kad tada buvo "numeris." Taigi, šiandien ir šią savaitę mes pristatome
šiek tiek ekspertizės ir problemų, todėl pasaulyje.
Šiandien bus sutrumpintas paskaita, nes ten yra ypatingas įvykis čia
po to, kad mes priimsime žvilgtelėti ir erzinti ir mokiniai bei jų tvai panašūs šiandien
kai kurių dalykų, kurie, dėl horizonto.
Tarp jų, kaip nuo pirmadienio, jūs turite keletą klasiokų.
EDX, Harvardo ir MIT nauja internetinė iniciatyva atviro kursų
ir daugiau, pradeda Harvardo universiteto miesteliu pirmadienį.
, O tai reiškia, atėjo pirmadienis, turėsite nuo paskutinio skaičiaus,
86.000 papildomų klasiokai bus kartu su CS50 paskaitų
ir specialieji profiliai ir Walkthroughs ir problemų rinkiniai.
Ir pagal šią programą, jūs tapsite nariai steigiamajame klasės
CS50 ir dabar CS50x.
>> Pagal šią programą, dabar suprantame, kad ten bus kai upsides taip pat.
Pasiruošti už tai, dėl didelio studentų skaičiaus,
pakanka pasakyti, kad nors mes turime 108 TFS ir CAS,
ne visai geriausias studentas / mokytojų santykis, kai mes Hit 80.000 kitus studentus.
Taigi mes neketiname būti klasifikavimo tiek daug problema nustato rankiniu būdu.
Taigi pristatė šią savaitę problemą, bus CS50 Registracijos
, kuris bus per prietaiso komandų eilutės įrankis
kad jūs gaunate, kai jūs ją atnaujinti vėliau Šį savaitgalį,
ir galėsite paleisti komandą, patikrinkite, ar 50,
savo pset ir jūs gausite sulaukti atsiliepimų, ar programa yra
teisingas, ar neteisingas pagal įvairaus dizaino specifikacijas, kurias mes teikiame.
Taigi, daugiau apie tai ir problemą, specifikacijos ir
bus naudojamas CS50x klasiokai tai taip pat.
>> Taigi problema rinkinys 4 yra visa informacija apie ekspertizės.
Ir šis gabalas buvo įkvėptas kai kurių realaus gyvenimo dalykų,
, pagal kurią, kai man buvo aukštosios mokyklos, aš internuoti tam tikrą laiką
Middlesex County apygardos prokuratūra daro ekspertizės darbą
su jų švino kriminalistikos tyrėjas, ir ką tai sudarė
, manau, kad minėta kelios savaitės praeitį, yra masė valstybinės policijos ar kiti
ateis, jie užsnūsti dalykų, pavyzdžiui, standžiųjų diskų ir kompaktinių diskų ir diskelių
ir kaip, o tada ekspertizės biure tikslas buvo išsiaiškinti, ar
ten buvo ar nebuvo įrodymų, kad tam tikros rūšies.
Tai buvo Specialiųjų tyrimų skyrius, todėl buvo baltos apykaklės nusikalstamumu,
buvo daugiau rūpesčių rūšiuoti nusikaltimų,
nieko įtraukiant kažkokį skaitmeninės žiniasklaidos, paaiškėja, kad ne, kad daugelis žmonių,
parašyti laišką, sakydamas: "Aš tai padariau".
Taigi gana dažnai šie Teismai ieško ne riesti visi, kad daug vaisių,
bet kartais žmonės rašyti tokius pranešimus.
Todėl kartais pastangos buvo apdovanoti.
>> Bet vadovauti šio teismo ekspertizės pset, mes nustatyti 4 pset bitų grafika.
Taigi, jūs tikriausiai imtis šių dalykų savaime suprantamu dalyku, JPEG, GIF ir kaip šių dienų,
bet jei jūs manote apie tai, vaizdas, panašiai kaip Rob veidą,
gali būti modeliuojama kaip taškų seka, arba pikseliai.
Dabar, Rob veidą, yra įvairiausių spalvų,
ir mes pradėjome matyti atskirus taškus, otherwide žinomas kaip pikselių,
Kai mes pradėjome, norėdami ją padidinti.
Bet jei mes supaprastinti pasaulį šiek tiek, ir tiesiog pasakyti, kad tai čia is Rob
juoda ir balta, gerai, atstovauti juoda ir balta, mes galime tik naudoti dvejetainis.
Ir jei mes ketiname naudoti dvejetainis, 1 arba 0, mes galime išreikšti tą patį vaizdą
Rob besišypsantį veidą su šiuo bitų modelis: 11000011 atstovauja
balta, balta, juoda, juoda, juoda, juoda, balta balta.
Ir todėl didžiulis šuolis, tada pradėti kalbėti apie spalvinga fotografijų.
Dalykų, kad galėtumėte pamatyti "Facebook" arba pasiimti su skaitmeninio fotoaparato,
bet, žinoma, kai jis ateina į spalvų, jums reikia daugiau bitų.
Ir gana paplitusi fotografijų pasaulyje yra naudoti ne 1-bitų spalvos,
, nes tai rodo, bet 24-bitų spalvos, kur jūs iš tikrųjų gauti milijonus spalvų.
Taigi, tuo atveju, kai mes Mastelis Rob akis,
, kuris buvo bet milijonų skirtingų spalvinga galimybių.
>> Taigi, mes jums pristatyti šią problemą, 4, taip pat į rankos
kuri bus šiandien 03:30 vietoj įprastos 2:30 dėl penktadienio paskaitos čia.
Bet video bus internete, kaip įprasta, rytoj.
Mes taip pat supažindinti jus į kitą failo formatą.
Todėl tai sąmoningai siekiama atrodyti bauginanti iš pirmo,
bet tai tik kai C struct dokumentacija.
Pasirodo, kad "Microsoft", prieš keletą metų, padėjo populiarinti šį formatą,
vadinamas bitmap failo formatas, BMP, ir tai buvo super paprasta,
spalvinga grafinis failo formatas, kuris buvo naudojamas gana ilgą laiką
, o kartais ir dar tapetai ant darbo stalų.
Jei manote, kad atgal į "Windows XP" ir kalvomis ir mėlynu dangumi,
kad paprastai BMP, ar rastrinis vaizdas, ir rastrai
yra įdomus mums, nes jie turi šiek tiek daugiau sudėtingumą.
Tai ne visai taip paprasta, kaip šis tinklelis 0 ir 1;
Vietoj to, turite dalykų, pavyzdžiui, ne antraštės failo pradžioje.
Taigi, kitaip tariant, viduje bmp failą yra visa krūva 0 ir 1,
bet yra šiek tiek papildomos 0 ir 1 ten.
Ir paaiškėja, kad tai, ką mes tikriausiai savaime suprantamu dalyku už metus,
failų formatus, pavyzdžiui, doc arba. xls arba. mp3. Mp4,
kokia failų formatus, kad esate susipažinę su.
Na, ką jis dar reiškia būti failo formatas?
, Nes bent dienos pabaigoje, visi iš šių failų, mes naudojame tik 0 ir 1
, o gal tie 0 ir 1 atstovauti a, b, c, per ASCII arba iš panašių dirbinių,
tačiau per dienos pabaigoje, tai tik 0 ir 1.
>> Todėl žmonės tiesiog kartais nusprendžia sukurti naują failo formatą
kur jie standartizuoti bitų modeliai bus iš tikrųjų reiškia.
Ir šiuo atveju čia, žmonės, kurie sukūrė bitmap failo formatą
rastrinio formato failą labai iš pirmo baito sakė, kad, kaip žymimas kompensuoti 0, ten,
ten bus kai cryptically pavadintas kintamasis vadinamas bfType
, kuris tiesiog reiškia bitmap failo tipą, kokio tipo rastrinio formato failą tai.
Galite daryti išvadą, ko gero, iš antrosios eilės, kad kompensuoti 2, 2 baitų skaičius,
0 ir 1, kad yra kas modelis?
Kažką dydis, ir jis eina iš ten.
4 problemą, jums bus vaikščioti per kai kurias iš šių dalykų.
>> Nebus baigti rūpintis apie juos visus, bet pastebėsite, kad jis pradeda gauti įdomu
aplink linijos arba 54 BYTE, rgbtBlue, žalia ir raudona.
Jeigu jūs kada nors girdėję akronimą RGB, raudona žalia mėlyna, tai yra nuoroda į tai.
Nes paaiškėja, jūs galite dažyti visas vaivorykštės spalvas
su šiek tiek raudonos ir mėlynos ir žalios spalvos derinys.
Ir, tiesą sakant, į kambarį tėvai gali priminti kai iš pirmųjų projektorių.
Šių dienų, jūs tiesiog pamatyti 1 ryškios šviesos išeina iš lęšio.
Bet atgal per dieną, jums turėjo raudoną objektyvas, mėlyną objektyvas, ir Green lens
ir jie kartu siekiama ekrane ir sudarė spalvingą vaizdą.
Ir gana dažnai vidurinės mokyklos ir aukštųjų mokyklų turės tuos lęšius
vis taip šiek tiek Marley, todėl jūs tarsi matyti dviejų ir trijų vaizdų,
bet tai buvo idėja. Jūs turėjote raudona ir žalia ir mėlyna šviesa, tapyba nuotrauką.
Ir tas pats principas naudojamas kompiuteriuose.
>> Taigi tarp iššūkių, tada jums nustatyti problemos 4
bus keletas dalykų, vienas, kad iš tikrųjų dydį vaizdą.
Siekiant atsižvelgti į 0 ir 1 modelis,
išsiaiškinti, kuris gabaliukus 0 ir 1 - kas statinio, kaip tai,
ir tada išsiaiškinti, kaip atkartoti vaizdo taškai: REDs, bliuzo, Žalieji
viduje taip, kad, kai vaizdas atrodo taip iš pradžių, gali atrodyti taip, o ne po to.
Tarp kitų iššūkių, taip pat bus, kad jums bus įteiktas
faktinės bylos teismo vaizdas iš skaitmeninio fotoaparato
ir kad kamera once upon a time, buvo visa krūva nuotraukų.
Problema ta, kad mes netyčia ištrinti arba buvo sugadinta kažkaip vaizdas.
Blogi dalykai nutinka su skaitmeninėmis kameromis, tad greitai nukopijuoti visus 0 ir 1
išjungti, kad už jus kortelę, išsaugoti juos visus 1 didelį failą, ir tada mes perduoti juos jums
problema (4) nustatyti, kad galite rašyti C programą, su kuria susigrąžinti
tų JPEG idealiai.
Ir paaiškėja, kad JPEG, nors jie šiek tiek sudėtingos failo formatu,
jie yra daug sudėtingesnis nei šis besišypsantį veidą.
It turns out, kad kiekvienas JPEG prasideda nuo tų pačių modelių 0 ir 1.
Taigi, naudojant while cikle arba linijos ar panašios,
galite pakartoti per visus 0 ir 1 šiame teismo ekspertizės vaizdo
ir kiekvieną kartą, kai pamatysite specialų modelį, kuris apibrėžtas problemą, specifikacijas,
galite manyti, "O, čia yra su labai didele tikimybe,
JPEG pradžia ", o kuo greičiau Jums susirasti tas pats modelis,
vėliau kai baitų ar kilobaitų ir megabaitų skaičius,
galite manyti, "Ooh! Čia yra antroji JPEG nuotrauka, aš paėmė po pirmosios.
Leiskite man nustoti skaityti, kad pirmą failą, pradėkite rašyti šį naują. "
Ir iš savo programos 4 pset produkcija bus ne daugiau kaip 50 JPEG.
Ir jei tai ne 50 JPEG, turite šiek tiek kilpa.
Jei turite begalinį skaičių JPEG, turite begalinis ciklas.
, Taip pat, kad bus gana dažnas atvejis.
Štai ką dėl horizonto.
>> Viktorina 0, už mus. Suprantu, per mano elektroninio pašto adresą, kad visada yra žmonės
kurie abu laimingi, tarsi neutralus, ir liūdna, aplink viktorina 0 laikas.
Ir prašome pasiekti, kad mane, galvos TFS, Zamyla, savo TF
CAS arba, kad jūs žinote, jei norite aptarti, kaip viskas vyko.
>> Taigi, norint įtikinti, kad tėvai į kambarį,
kas yra CS50 biblioteka? Geras darbas.
Kas yra CS50 biblioteka? Taip? [Studentų atsakymai, neįskaitomai]
>> Gerai, gerai. Todėl prewritten rinkinys kodo, kad mes, darbuotojai, rašė,
mes pateikiame jums pateikti keletą bendrų funkcijų.
Daiktai, kaip man eilutę; man int, visų funkcijų, kurios yra išvardyti čia.
Nuo dabar, mes pradedame iš tiesų imtis šias mokymo ratus.
Taigi, mes ketiname pradėti atimti iš jūsų "string",
kuris, išėmimą iš apyvartos, buvo tik sinonimas, ką faktinis duomenų tipas? char *.
Taigi tėvams, kad tikriausiai buvo - kad gerai, kad char * mes pradėti rodyti
ekrane daugiau, kaip mes pašalinti "STRING" iš mūsų žodyno,
bent jau kai kalbama, kad iš tikrųjų rašyti kodą.
Be to, mes sustabdysime naudojant kai kurias iš šių funkcijų, kiek,
, nes mūsų programos gauti daugiau sudėtingas
, o ne tik rašyti programas, kad sėdi ten su greitai mirksi,
laukia, kad vartotojas galėtų tipo kažkas in
Jūs gausite savo sąnaudas iš kitur.
Pavyzdžiui, jūs gausite juos iš bitų serijos dėl vietos standžiajame diske.
Jūs, o ne gauti juos ateityje iš tinklo ryšį, kai svetainė kažkur.
Todėl galime žievelės atgal Šis pirmą kartą sluoksniu ir atsigriebti CS50 prietaisą
ir šį failą, vadinamas CS50.h, jūs buvote aštrus savaites.
>> Bet galime iš tikrųjų pamatyti, kas yra viduje.
Taigi mėlynai failo viršuje yra tik visa krūva pastabų,
Informacija apie garantiją ir licencijavimas. Tai yra tarsi bendros paradigmos
programinės įrangos, nes programinės įrangos daug šių dienų yra tai, kas vadinama "atviro šaltinio"
, o tai reiškia, kad kažkas parašyta kodą
ir padarė ją laisvai prieinama, o ne tik paleisti ir naudoti,
bet iš tikrųjų skaityti ir pakeisti ir integruoti į savo darbą.
Taip, kad tai, ką jūs naudojate, atviro kodo programinę įrangą,
, nors ir labai maža.
Jei aš slinkti žemyn praeityje komentarų, nors mes pradėsime pamatyti kai kuriuos žinomus dalykus.
Taigi pastebėti čia viršuje, kad CS50.h faile yra visa krūva header files.
Dabar, dauguma jų mes dar nematėte anksčiau, bet vienas yra
pažįstamas, kuris iš jų mes matėme, nors ir trumpai, iki šiol?
Taip, standartinės bibliotekos. Stdlib.h malloc,
taigi, kai mes pradėjome kalbėti apie dinaminio atminties paskirstymo,
kuriuos mes grįžti kitą savaitę, taip pat, mes pradėjome įskaitant šio failo.
It turns out, kad bool, true ir false nėra iš tikrųjų egzistuoja C, per se,
, jei norite įtraukti šį failą čia.
Taigi, mes, savaites, buvo įskaitant standartinę bool.h
taip, kad jūs galite naudoti bool, true arba false. sąvoką
Be to, jums reikės rūšiuoti Fake It ir naudoti int
ir tiesiog savavališkai manyti, kad 0 yra klaidingas ir 1 yra tiesa.
>> Dabar, jei mes slinkti žemyn toliau, čia yra mūsų apibrėžimas eilutę.
It turns out, kaip mes jau sakiau anksčiau, kad kur tai * yra tikrai ne klausimas.
Jūs netgi galite turėti erdvę, visi aplink.
Mes, šį semestrą, buvo skatinti, nes tai aiškiai pasakyti, kad * turi daryti su tipo.
Bet suprasti, kaip bendra, jei ne šiek tiek labiau paplitęs, yra jį ten
bet funkciniu požiūriu tai tas pats dalykas.
O dabar, jei mes skaitome toliau, tegul Pasakykite, atrodo, GetInt,
, nes mes naudojamas, kad ko gero, prieš ką nors šį semestrą.
Ir čia yra GetInt. Tai, ką?
Tai yra prototipas. Taip dažnai, mes turime įdėti prototipų ne mūsų viršūnes c failai,
bet taip pat galite įdėti prototipus Header files, h failus,
patiko šį vieną čia, kad kai rašote kai kurias funkcijas
, kad jūs norite, kad kiti žmonės galės naudoti, kuri yra būtent tuo atveju, su CS50 bibliotekoje,
jūs ne tik įgyvendinti savo funkcijas kažką panašaus CS50.c
jūs taip pat įdėti prototipus ne dėl šios bylos viršuje, tačiau antraštės failo viršuje
tada, kad failo antraštės yra tai, ką draugai ir kolegos,
su aštriais savo kodą.
Taigi visą šį laiką buvote įskaitant visus iš šių prototipų
efektyviai failo viršuje, bet tai aštrus mechanizmą
, kad iš esmės šį failą į savo kopijas ir pastos.
Dabar, čia yra keletas gana išsamūs dokumentai.
>> Mes beveik savaime suprantamu dalyku kad GetInt gauna int,
tačiau paaiškėja, yra kai kampiniai atvejų, tiesa?
Ką daryti, jei vartotojas įveda kelias pernelyg didelis skaičius, kad?
Quintillion, kad tiesiog negali tilpti int?
Koks numatomas elgesys? Na, geriausia, tai nuspėjamas.
Taigi šiuo atveju, jei jūs iš tikrųjų skaityti baudos spausdinti,
pamatysite, kad jei linija negali būti perskaityti, tai grąžina INT_MAX.
Mes niekada kalbėjo apie tai, bet remiantis jos kapitalizacijoje,
kas tai yra, tikriausiai?
Tai pastovi, todėl tai kai speciali konstanta, tikriausiai,
'S UP didesnis failo šių header files,
ir INT_MAX tikriausiai yra kažkas panašaus, maždaug, 2 milijardų.
Idėja yra ta, kad, nes mes turime kažkaip reiškia, kad kažkas negerai,
mes, taip, ar 4 mlrd. skaičius mūsų žinioje,
neigiamas 2 mlrd iki 2 milijardų, duoti ar priimti.
Na, kas yra bendra programavimo jūs pavogti tik vieną iš šių numerių.
Gal 0, o gal 2 mlrd., O gal neigiamas 2 mlrd.
Taigi jūs prarandate vieną iš savo galimų reikšmių, kad būtų galima įsipareigoti pasaulyje
, kad jei kas nors negerai, aš grįšiu tai super neįkainojamos vertės.
Bet nenorite vartotojo įvedę kažkas yra neaiškūs, pavyzdžiui, "2, 3, 4 ..."
tikrai didelis skaičius, kur apibendrinti, o ne kaip konstanta.
Ir tikrai, jei jums buvo analinis pastaruosius keletą savaičių,
kada jūs vadinate GetInt, turėtumėte buvo patikrinti jei sąlyga.
Ar vartotojo tipą INT_MAX, arba, tiksliau,
padarė GetInt grįžti INT_MAX? Nes jei jis tai padarė,
kad iš tikrųjų reiškia, kad jie nebuvo įveskite jį kažkas nutiko šiuo atveju.
Taigi, tai yra tai, kas paprastai žinomas kaip vertės "Sentinel", kuris tiesiog reiškia specialiuosius.
>> Na, tegul dabar kreiptis į C failus.
C failas egzistuoja prietaiso tam tikrą laiką,
ir, tiesą sakant, kad prietaisas turi tai išankstinė sukompiliuota jums
į tą daiktą, mes vadinamas "objekto kodas"
bet jis tiesiog nėra klausimas jums, kur jis yra, nes sistema žino,
šiuo atveju, kur ji yra, prietaisas.
Bet tegul slinkti žemyn dabar GetInt, ir pamatyti, kaip GetInt dirbo visą šį laiką.
Taigi čia mes turime panašias pastabas anksčiau.
Leiskite man priartinti tik kodo dalis,
ir tai, ką mes turime GetInt tokia.
Ji nežino įvestį ir grąžina int, while (true), todėl mes turime sąmoningai begalinis ciklas
, bet, matyt, mes išeiti tai kažkaip, ar grįžti iš per šį laikotarpį.
Taigi pažiūrėkime, kaip tai veikia. Na, mes, atrodo, kad naudojant GetString
šioje pirmoje eilutėje viduje kilpa, 166.
Šiuo metu tai yra gera praktika, nes, kokiomis aplinkybėmis
gali GetString grąžinti šį specialų raktažodžių, NULL?
Jei kažkas negerai. Kas galėtų suklysti, kai skambinate kažką panašaus GetString?
Taip? [Studento atsakymas, nesuprantamas] >> Taip. Taigi gal malloc nepavyksta.
Kažkur po gaubtu GetString skambina malloc
skiria atmintį, kuri leidžia kompiuterių parduotuvėje
visus simbolius, kad vartotojas įveda klaviatūra.
Ir tarkime, vartotojas gavo visai daug laisvo laiko
ir atspausdinti daugiau nei 2 mlrd simbolių, pavyzdžiui,.
Daugiau simbolių, nei kompiuterio, net RAM.
Na, GetString turi būti galėtų reikšti, kad jums,
net jei tai yra super, super neįprasta kampe atveju.
Jis turi kažkaip būti galėtų dirbti, ir taip GetString,
jei mes einame atgal ir perskaityti jo dokumentus, iš tikrųjų, grįžti NULL.
Dabar, jei GetString nepavyksta grąžinant NULL, GetInt žlugti
grįžti INT_MAX, tiesiog kaip Sentinel.
Tai tik žmogaus konvencijas. Vienintelis būdas turėtumėte žinoti, yra tuo atveju,
skaityti dokumentus.
Taigi leiskite slinkite žemyn, kur int yra iš tikrųjų GotInt.
>> Taigi, jei aš slinkti žemyn šiek tiek toliau, atitinka 170 turime virš šių eilučių komentarą.
Taigi, mes pareiškiame, 172, int n, char c, ir tada šios naujos funkcijos
kai kurie iš jūsų szarpnęły visoje prieš, bet sscanf.
Tai reiškia styginių nuskaitymo f.
Kitaip tariant, duok eilutę ir bus nuskaityti informacijos vienetų interesų.
Taigi, ką tai reiškia? Na, tarkime, kad aš tipo, tiesiog 1 2 3 prie klaviatūros,
ir tada paspauskite Enter. Kas yra duomenų tipas 1 2 3 sugrįžę GetString?
Tai akivaizdžiai eilutę, tiesa? Aš turiu eilutę, todėl 1 2 3 yra tikrai "1 2 3"
\ 0 "jo pabaigoje. Tai ne int.
Kad ne skaičius. Atrodo, kad skaičius, bet iš tikrųjų tai ne.
Taigi, ką GetInt daryti? Ji turi nuskaityti, kad eilutę, iš kairės į dešinę,
1 2 3 \ 0, ir kažkaip konvertuoti jį į faktinį sveikojo skaičiaus.
Dabar galite išsiaiškinti, kaip tai padaryti.
Jei manote, kad atgal į pset 2, jūs tikriausiai gavo šiek tiek patogiai
su Cezaris ar Vigenere taip galite pakartoti per eilutę,
galite konvertuoti simbolių int su pick. Tai visai daug darbo.
Kodėl gi ne skambinti kaip sscanf funkcija, kad visa tai už jus?
Taigi sscanf tikisi argumentas, šiuo atveju vadinama linija, kuri yra eilutė.
Jūs tada nurodykite, į kabutes, labai panašus į printf,
ko jūs tikitės pamatyti šios eilutės?
Ką aš sakau čia, tikiuosi, į dešimtainį skaičių, o gal ir simbolį.
Ir mes pamatyti, kodėl tai yra vos akimirką.
Pasirodo, kad šį formatą dabar primena daiktų
mes pradėjome kalbėti apie šiek tiek daugiau nei prieš savaitę.
>> Kas yra ir nanotechnologijų ir c daro mums čia? [Studentų atsakymai, neįskaitomai]
>> Taip. Tai, kad suteikėte man n ir adresas c adresą.
Dabar, kodėl tai svarbu? Na, žinote, kad su funkcijų C
jūs visada galite grįžti reikšmę arba jokios vertės.
Galite grįžti Žiniasklaida, eilutę, apyvartinės lėšos, char, neatsižvelgiant į.
Arba galite grįžti negaliojančiu, bet jūs galite grįžti tik 1 dalykas maksimaliai.
Bet čia mes norime sscanf gal man grįžti Žiniasklaida, dešimtainis skaičius,
ir taip pat char, ir aš paaiškinti, kodėl char per akimirką.
Taigi jums efektyviai norite f, kad grįžti 2 dalykų, kad tiesiog neįmanoma C.
, Todėl galite dirbti aplink, einančios per 2 adresus,
nes kuo greičiau vertus funkcija 2 adresus, ką gali, kad funkcija su jais daryti?
Gali rašyti šiais adresais. Galite naudoti * operaciją ir "ten" į kiekvieną iš šių adresų.
Tai tarsi šio backdoor mechanizmą, tačiau labai dažnai keičiasi kintamųjų reikšmes
daugiau nei 1 vietos, šiuo atveju 2.
Dabar, atkreipkite dėmesį, aš patikrinti == to1, ir tada grįžti n jeigu tai, iš tiesų, įvertinti, tiesa.
Taigi, kas vyksta? Na, techniškai, visi mes tikrai norime, kad taip atsitiktų, GetInt tai.
Mes norime, kad apdoroti, taip sakant, norime skaityti eilutę
"1 2 3", o jei jis atrodo, kaip ten numeris yra,
tai, ką mes sakau sscanf tai padaryti, yra įdėti, kad, 1 2 3 man į šį kintamąjį rodiklį n.
Kodėl, tuomet, aš tai, kaip gerai?
Kas yra taip pat sako, sscanf, jūs taip pat gali gauti simbolį čia vaidmuo.
[Studentų sakant, nesuprantamas] >> Ne - dešimtainis taškas galėtų dirbti.
Leiskite nuspręsti, kad akimirką pagalvojo. Ką dar?
[Studentas, nesuprantamas] >> Taigi, gera mintis, tai gali būti NULL charakteris.
Tai tikrai ne šiuo atveju. Taip? [Studentų, nesuprantamas]
>> >> ASCII. Arba, leiskite man apibendrinti dar labiau.
% C yra tik Klaidų tikrinimas.
Mes nenorime, kad po skaičiaus pobūdis,
bet ką tai leidžia man padaryti taip:
Pasirodo, kad sscanf, be to, n ir C saugoti vertybes, šiame pavyzdyje čia,
ką jis taip pat tai grąžina kintamųjų skaičius įdėti vertybes in
Taigi, jei turite tik įvesti 1 2 3, tada tik% d, kad atitiktų
ir tik n pasireiškia saugomi kaip 1 2 3 ir nieko gauna įdėti į C;
c reikšmė lieka šiukšlių, taip sakant.
Šiukšlių, nes ji niekada nebuvo inicializuoti kokią vertę.
Taigi, tuo atveju, sscanf grąžina 1, nes aš apgyvendintos vieną iš šių rodykles,
tokiu atveju, nuostabu. Turiu int, todėl aš išlaisvinti liniją atlaisvinti atminties
, kad GetString faktiškai skirta, ir tada aš grįžti n.
Kitur, jei jūs kada nors susimąstėte, kur, kad pabandyti dar kartą pareiškimas nuskambėjo, ateina iš čia.
Jei, priešingai, aš tipo 1 2 3 foo
tik keletas atsitiktinai teksto seka, sscanf vyksta pamatyti,
ooh, skaičių, ooh, skaičių, ooh, skaičių, ooh - f.
Ir tai vyksta įdėti 1 2 3 n.
Ji ketina įdėti c f, ir tada grįžkite 2.
Taigi, mes turime, tik naudojant pagrindinį apibrėžimą scanf elgesį,
labai paprastas būdas - gerai, sudėtinga iš pirmo žvilgsnio, bet ne dienos pabaigoje,
gana paprastas mechanizmas pasakyti, ar yra int, ir jei taip, tai, kad vienintelis dalykas, kad aš rasiu?
Ir čia yra tarpas tyčinis. Jei jūs skaitote kad sscanf dokumentus,
jis jums pasakys, kad jei yra tuščios vietos gabalo pradžioje arba pabaigoje,
sscanf taip pat leidžia vartotojui, neatsižvelgiant į priežastis, kad pasiektų tarpo 1 2 3, ir kad bus teisėtas.
Tai bus ne klykauti ne tik todėl, kad jie nukentėjo tarpo pradžioje arba pabaigoje vartotojo,
kuris yra tik šiek tiek patogesnis.
>> Bet kokių klausimų, tada ant GetInts? Taip?
[Studento klausimas, nesuprantamas]
>> Geras klausimas. Ką daryti, jei jūs tiesiog atspausdinti char, kaip f ir paspauskite įvesti
be galimybės kada nors rašyti 1 2 3 ką jūs manote elgesys šio kodo eilutę, tada būtų?
Taigi sscanf gali apimti, kad per daug, nes tuo atveju,
jis nesiruošia užpildyti N arba C; ji ketina vietoj return 0.
Tokiu atveju, aš taip pat gaudyti, kad scenarijų,, nes laukiama vertė aš noriu yra 1.
Aš tik noriu 1, ir tik 1 dalykas, kurį reikia užpildyti. Geras klausimas. Kiti?
>> Viskas gerai, todėl galime ne eiti per visus čia funkcijų,
bet vienas, kad atrodo, kad, ko gero, likusių susidomėjimu
yra GetString nes paaiškėja, kad GetFloat, GetInt
GetDouble, GetLongLong visus išmušti kamuolį iš rankų, daug jų funkcionalumą GetString.
Todėl galime imtis, kaip jis yra įgyvendinamas išvaizdą.
Tai vienas atrodo šiek tiek sudėtinga, bet ji naudoja tuos pačius pagrindus
, kad mes pradėjome kalbėti apie praeitą savaitę. Taigi GetString
kuris trunka jokio argumento, kaip už tuštumos čia,
ir grąžina eilutę, kad aš esu skelbiantis eilutę vadinamas buferis.
Aš ne tikrai žinote, kas tai bus naudojamas dar, bet mes žr.
Pajėgumų atrodo kaip yra pagal nutylėjimą, 0, ne visai tikras, kur tai vyksta.
Nežinote, ką n bus naudojamas dar.
Bet dabar ji gauti šiek tiek įdomesnis, todėl 243 eilutėje,
mes pareiškiame, int c, tai yra tarsi kvailas išsamiai.
Char yra 8 bitų, ir 8 bitai gali laikyti kiek skirtingas reikšmes?
256. Problema yra, jei norite turėti 256 skirtingų ASCII simbolių,
yra, jei jūs manote, atgal, ir tai nėra kažkas, įsiminti.
Bet jeigu jūs manote, kad didelis ASCII diagramos mes turėjome savaites,
ten buvo, šiuo atveju, 128 arba 256 ASCII simbolių.
Mes naudojome nuo 0 modelius ir 1'S UP.
Tai problema, jei norite, kad būtų galima aptikti klaidą.
Nes jei jūs jau naudojate 256 simbolių reikšmes,
ne jūs planuojate į priekį, nes dabar jūs neturite sakydamas kelią,
"Tai nėra teisėtas simbolis, tai yra, kai klaidingas pranešimas".
Taigi, ką pasaulis daro, jie naudoja kitą didžiausią vertę,
int kažkas panašaus, kad jūs turite crazy bitų skaičius,
32 už 4 milijardų galimų reikšmių, taip, kad jūs galite tiesiog baigti naudojant,
iš esmės, 257 iš jų, iš kurių 1 turi tam tikrą ypatingą reikšmę kaip klaida.
>> Taigi pažiūrėkime, kaip tai veikia. 246 atitinka, turiu tai didelis while cikle
ragina fgetc f reikšmė failas, getc, ir tada stdin.
Pasirodo, tai tik tikslesnis būdas pasakyti "Skaityti įvesties iš klaviatūros".
Standartinis įvesties tai klaviatūra, standartinį išvedimo ekraną,
ir standartinė paklaida, kurią mes matysite pset 4 - ekraną,
bet specialų ekrano dalį taip, kad ji ne supainiojo
faktinės produkcijos, kad jums skirtas spausdinti, bet daugiau apie tai ateityje.
Taigi fgetc tik perskaityti vieną simbolį iš klaviatūros, ir laikyti jį ten, kur?
Laikykite jį į C, o tada patikrinkite, todėl aš tiesiog naudojant kai kuriuos boolean jungtukai,
patikrinkite, ar jis nėra lygus \ n, todėl vartotojas paspauskite Enter.
Mes norime sustabdyti tuo momentu, kilpos pabaigos, ir mes taip pat norite patikrinti
speciali konstanta, EOF, jei žinote, ar atspėti - kas tai stovėti?
Failo pabaigos. Taigi tai yra rūšies absurdiškas, nes jei aš rašyti į klaviatūrą,
ten tikrai ne failas, dalyvauti šiame,
bet tai tik rūšiuoti reiškia bendrinis terminas, naudojamas
kad nieko ateina iš žmogaus pirštų. EOF. Failo pabaigos.
Kaip panaikinti, jei jūs kada nors nukentėjo valdymas D savo klaviatūroje,
nereiškia, kad jūs dar, jūs nukentėjo valdymo C.
O kontrolė d siunčia šį specialų nuolatinį, pavadintą EOF.
>> Taigi, dabar mes tiesiog turime tam tikrą dinaminį atminties paskirstymas.
Taigi, jei n + 1> talpa, dabar aš paaiškinti n.
n, kiek baitų yra buferyje,
eilutė, kad jūs šiuo metu iš vartotojo.
Jei turite daugiau simbolių savo buferio nei turite pajėgumus buferyje,
intuityviai, tai, ką mes turime daryti tada skirti daugiau pajėgumų.
Aš ruošiuosi nugriebti kai aritmetinio čia
ir sutelkti dėmesį tik šią funkciją.
Jūs žinote, ką malloc yra, ar bent jau paprastai susipažinę.
Spėti, kas realloc daro. [Studentų atsakymas, nesuprantamas]
>> Taip. Ir tai ne visai pridedant atminties, ji perskirsto atmintį taip:
Jei dar yra kambarys eilutės pabaigoje, kad suteiktų jums daugiau, kad atmintis
nei ji iš pradžių suteikia jums, tada jums gauti, kad papildomos atminties.
Taigi galite tiesiog pradėti eilutes simbolių atgal atgal atgal atgal.
Bet jei tai ne tas atvejis, nes jūs pernelyg ilgai laukė,
ir kažkas atsitiktinai gavo plopped į atmintį, bet ten papildomai
atminties žemai čia, kad viskas gerai. Realloc ketina padaryti viską, didelių svorių iškėlimą už jus,
perkelti eilutę, jūs perskaitėte, kad iki šiol čia,
padėkite jį ten, ir tada duoti jums šiek tiek daugiau taką šiuo klausimu.
Taigi su rankos banga, leiskite man pasakyti, kad tai, ką GetString daro
ji pradeda su nedideliu buferio, gal 1 vieną simbolį,
ir, jei vartotojas įveda į 2 simbolių, GetString baigiasi
paskambinus realloc ir sako: "Ooh, 1 pobūdis buvo nepakankamai.
Duok man 2 simboliai. " Tada, jei jūs skaityti per kilpą logika,
ji ketina pasakyti "Ooh, 3 simbolių įvedėte vartotojo.
Duok man dabar ne 2, bet 4 ženklai, tada duok man 8, tada duok man 16 ir 32. "
Tai, kad aš kiekvieną kartą padvigubinti Gebėjimų
reiškia, kad buferis nesiruošia auga lėtai.
Jis ketina super greitai auga, ir kas gali būti, kad privalumas?
Kodėl aš dvigubai buferio dydį, net jei vartotojas
gali tiesiog reikia 1 papildomų simbolių iš klaviatūros?
[Studento atsakymas, nesuprantamas]. >> Kas tai?
Tiksliai. Jūs neturite auginti jį taip dažnai.
Ir tai tik rūšies - Tu apsidraudimo savo statymus čia.
Remiamasi idėja, kad jums nereikia skambinti realloc daug, nes jis linkęs būti lėtas.
Bet kuriuo metu galite paklausti operacinės sistemos atminties, kaip jūs netrukus pamatysite,
problemos ateityje rinkinį, jis yra linkęs šiek tiek laiko.
Taip sumažinti, kad, kiek laiko, net jei jūs eikvoti šiek tiek erdvės, yra linkęs būti geras dalykas.
>> Bet jei mes skaityti per baigiamoji dalis GetString čia,
ir vėl, suprasti kiekvieną eilutę čia nėra taip svarbu šiandien.
Bet pastebėsite, kad ji galiausiai ragina malloc vėl, ir ji išskirsto
tiksliai taip, kaip daug baitų kaip jai reikia eilutę
ir tada išmeta paskambinus nemokamai, pernelyg didelis buferis,
jei ji iš tikrųjų gavo dvigubai per daug kartų.
Trumpai tariant, tai, kaip GetString dirbo visą šį laiką.
Visi jame skaityti vieną simbolį vienu metu vėl ir vėl ir vėl
ir kiekvieną kartą, ji reikia šiek tiek papildomos atminties, jis klausia, operacinę sistemą paskambinus realloc.
Turite klausimų? Gerai.
>> Ataka. Dabar, kai mes suprantame patarimų, ar bent jau
vis labiau susipažinę su rodyklės,
pažiūrėkime, kaip visas pasaulis pradeda žlugti
jei jūs neturite pakankamai ginti nuo rungimosi vartotojams,
žmonių, kurie bando nulaužti į savo sistemą.
Žmonių, kurie bando pavogti jūsų registracijos kodą apeiti tam tikrą programinę įrangą
kad jie gali kitaip įvesti in
Paimkite pažvelgti į šį pavyzdį, kuri yra tik C kodas
, kad turi pagrindinę funkciją apačioje, kad skambučiai funkcija foo
ir nuo ko jis artimųjų foo? [Studentų] Vienintelis argumentas.
>> Vieną argumentą. Taigi argv [1], kuris reiškia pirmąjį žodį, vartotojas turi įvesti
į komandų eilutę po a.out ar kas programa vadinama.
Taigi foo, viršuje, mano char *, bet char * yra tai, ką?
Eilutę. Nieko naujo čia, kad seka yra savavališkai yra vadinamas baras.
Šioje eilutėje čia, char c [12], tarsi pusiau techninės anglų, kas ši eilutė daro?
Masyvas? Simbolių. Duok man 12 simbolių masyvas.
Taigi galėtume pavadinti tai buferis. Techniškai vadinama c, bet programavimo buferis
tiesiog reiškia, kad vietos krūva, kad jūs galite įdėti kai kurių dalykų in
>> Tada galiausiai, memcpy, mes ne naudoti prieš.
, Bet jūs greičiausiai gali atspėti, ką ji daro. Kopijuoja atmintį.
Ką jis daro? Na, tai, matyt, kopijuoja baras, jo indėlis į c,
bet tik iki juostos ilgis.
Bet ten klaida čia.
Gerai, kad techniškai turėtume tikrai strlen (bar) x sizeof (char), tai teisinga.
Bet blogiausiu atveju čia, galime manyti, kad that - taip, gerai.
Tada ten 2 klaidas. Taigi, sizeof (char), gerai, padarykime tai šiek tiek platesnis.
Taigi, dabar dar yra klaida, o tai, ką?
[Studentų atsakymas, nesuprantamas] >> išsiregistravimo už ką? Gerai, kad mes turime būti patikrinti
, nes blogų dalykų atsitikti, kai jūsų rodyklė NULL, NULL
, Nes jums gali galų gale vyksta ten, ir jūs niekada neturėtų būti NULL
su * operatoriumi dereferencing.
Taigi, kad gerai, ir ką mes darome? Logiškai trūkumas čia.
[Studentų atsakymas, nesuprantamas]
>> Taigi patikrinti, ar argc ≥ 2?
Gerai, kad yra 3 klaidas šioje programoje.
Mes ne tikrinti, ar vartotojas iš tikrųjų įvedėte nieko į argv [1], geros.
Taigi, kas yra trečiasis klaidą? Taip?
[Studento atsakymas, nesuprantamas] >> Gerai.
Taigi, mes patikrinome vieną scenarijų. Mes netiesiogiai patikrinti negalima kopijuoti daugiau atminties
nei viršytų juostos ilgis.
Taigi, jei eilutė vartotojas turi įvesti 10 simbolių,
tai sako, "tik kopija 10 simbolių.
Ir tai gerai, bet ką daryti, jei vartotojas turi įvesti žodį komandinėje eilutėje
kaip 20 simbolių žodį, tai yra, sakydamas kopijavimo 20 simbolių iš baro į tai, ką?
c, kitaip žinoma kaip mūsų buferio, kuris reiškia, kad jūs tiesiog parašė duomenis
8 baitų vietose, kad jūs neturite savo,
ir jūs neturite juos ta prasme, kad jūs niekada paskyrusios.
Taigi, tai yra tai, kas paprastai žinomas kaip buferio perpildymo atakos,
arba buferio ataka, ir ši ataka ta prasme, kad jei vartotojas
ar programa, kuri skambina savo funkciją tai daro piktavališkai,
, kas iš tikrųjų vyksta, šalia gali būti gana blogai.
>> Paimkime į šį vaizdą čia.
Ši nuotrauka yra jūsų atminties krūvą.
Bei primena, kad kiekvieną kartą, kai skambinate funkciją,
gausite šį mažą rėmelį kamino ir tada kitą ir tada kitą, ir tada kitą.
Ir iki šiol mes tiesiog rūšies išgaunamo tai toli kaip stačiakampių
arba ten ant lentos arba ekrane čia.
Bet jei mes padidinti šių stačiakampių
kai skambinate funkcijos foo, paaiškėja, kad yra daugiau kamino
viduje šio kadro ir tame stačiakampyje
kaip tik x ir y ir a ir b punktai, kaip mes kalbame apie apsikeitimo sandorio.
Paaiškėja, kad yra keletas žemesnio lygio informacija,
tarp jų atgalinį adresą.
Taigi paaiškėja, kai pagrindinis ragina foo, pagrindinis turi informuoti foo
pagrindinis adresas yra kompiuterio atmintyje.
Nes kitaip, kuo greičiau foo vykdymas, kaip šiuo atveju čia
kai jūs pasieksite šį glaudų garbanotas petnešomis iš foo pabaigoje,
kaip gi Foo žinoti, kur kontrolės programos turėtų eiti?
It turns out, kad atsakymas į šį klausimą yra to raudono stačiakampio čia.
Tai rodo, kad žymeklis, ir tai priklauso nuo kompiuterio, laikinai saugoti,
vadinamosios kamino pagrindinis adresas yra padaryta taip, kad kuo greičiau foo vykdyti
kompiuteris žino, kur ir ką linija pagrindinis grįžti į.
Išsaugotos rėmas rodyklė panašiai.
Char * baras čia yra kas?
Na, dabar šis mėlynas segmentas čia Foo Korpusas, kas yra baras?
Gerai, kad juosta yra tik foo funkcijos argumentas.
>> Taigi dabar mes atgal į pažįstamą vaizdą.
Yra daugiau daiktų ir daugiau ramiai ekrane
bet tai šviesiai mėlyna segmentas yra tai, ką mes jau lentos apsikeitimo sandorio kažką panašaus.
Kad yra foo rėmas ir vienintelis dalykas, dabar yra baras,
kuris yra šis parametras.
Bet ką dar turėtų būti kamino, pagal šio kodekso čia?
Char [12]. Taigi mes taip pat turėtumėte pamatyti 12 kvadratų atminties,
skirta kintamojo pavadinimu c.
Ir iš tiesų, mes turime, kad ekrane.
Pačiame viršuje yra [0], tada šioje diagramoje autorius
nesivargino piešimo kvadratų, bet iš tiesų yra 12 nėra
nes jei peržvelgsite apačioje, dešinėje pusėje, c [11], jei skaičiuoti nuo 0, yra 12 tokie baitai.
Bet štai problema: kuria kryptimi c auga?
Rūšiuoti viršaus į apačią, į dešinę? Jei jis prasideda viršuje ir auga į apačią,
atrodo ne taip, kaip mes palikome sau daug kilimo ir tūpimo tako, čia ne visiems.
Mes rūšies dažytos save į kampą,
ir kad c [11] yra teisus prieš bare, kuris yra nuo kamino rėmo rodyklė,
kuris yra teisus prieš atgalinį adresą, nes daugiau nebėra.
Taigi, ką būtų galima numanyti, tada, jei susukti,
ir bandote skaityti 20 baitų į 12-baitų buferio?
Kur šie 8 papildomi baitai ketinate eiti?
Viduje visa kita, kai kurie iš jų yra super svarbu.
Ir svarbiausias dalykas, galbūt, yra raudonas langelis, atgalinis adresas.
Nes tarkime, kad jūs netyčia arba adversarially
perrašyti tuos 4 baitai, kad rodyklė adresas,
ne tik šiukšlių, bet su numeriu, kad atsitinka taip, kad atspindėtų faktinį adresą atmintyje?
Kas implicaiton, logiškai?
[Studentų atsakymai, neįskaitomai] >> Taip. Kai foo grąžina
hitai, kad garbanotas petnešomis, programa ketina tęsti Norėdami grįžti į pagrindinį
jis ketina grįžti į kokia adresas yra to raudono lange.
>> Apeiti programinės įrangos registracijos,
kas yra adresas, grąžinamas į funkcija
kad paprastai iškviečiamas, kai jūs sumokėjo už programinę įrangą ir įvestas registracijos kodą?
Jūs galite rūšiuoti apgauti kompiuterio į nesiruošia čia, bet vietoj to, vyksta čia.
Arba, jei esate tikrai protingas, priešininkas iš tikrųjų galite įvesti ne klaviatūra,
pavyzdžiui, o ne tikrasis žodis, ne 20 simbolių, bet tarkime, kad jis ar ji
kai kurių ženklų, kad atstovauja kodą tipai?
Ir jis nesiruošia būti C kodas, tai bus simboliai
kurios atstovauja dvejetainiai mašinos kodus, 0 ir 1.
Tačiau tarkime, jie yra pakankamai protingas, kad tai padaryti, kažkaip įklijuoti į GetString greitai
kažkas, kad iš esmės yra sudariusi kodą,
ir paskutinius 4 baitai perrašyti atgalinį adresą, ir koks adresas, kad įvesties daryti?
Ji saugo šitoje stačiakampio pirmojo baito adresas buferio.
Taigi, jūs turite būti tikrai protingas, ir tai yra daug bandymų ir klaidų
blogų žmonių iš ten, bet jei galite išsiaiškinti, kaip didelis buferis yra,
toks, kad per pastaruosius keletą įvesties baitų, kurią jūs pateikiate programos
atsitikti, kad atitinka savo buferio pradžios adresą,
jūs galite tai padaryti. Paprastai, jei mes sakome, labas, ir \ 0, kad tai, ką galų gale į buferį.
Bet jei mes daugiau protingas, ir mes užpildome, kad buferis su tuo, ką mes bendrine skambinti atakos kodą,
A, A, A, A: Išpuolis, ataka, puolimas, ataka, kai tai tik kažkas, kad daro kažką blogo.
Na, kas atsitinka, jei esate tikrai protingas, galite tai padaryti:
, Raudoname laukelyje čia skaitmenų seka: 80, CO, 35, 08.
Atkreipkite dėmesį, kad, kuris atitinka skaičių, kuris čia.
Tai atvirkštine eilės tvarka, bet daugiau, kad kitu metu.
Atkreipkite dėmesį, kad tai atgalinis adresas buvo tyčia pakeistas
lygus adresą čia, o ne pagrindinio adreso.
Taigi, jei blogiukas yra super protingas, jis ar ji ketina įtraukti, kad ataka kodą
kažkas panašaus į "Ištrinti visus vartotojo failus."
Arba "Kopijuoti slaptažodžius," arba "Sukurti vartotojo abonementą, kad galiu prisijungti į.
Ką nors ne visi, ir tai yra pavojus ir C. galia
Nes per rodykles jūs turite prieigą prie atminties
Todėl galite rašyti viską, ką nori į kompiuterio atmintį.
Jūs galite padaryti kompiuterį daryti viską, ką nori, tiesiog
ją šokinėti per savo atminties.
Ir taip, šios dienos, tiek daug programų, ir tiek daug svetainių, kurios kyla pavojus,
skliautais žmonėms pasinaudoti šia.
Ir tai gali atrodyti kaip super sudėtingų ataka,
bet ji ne visada pradėti, kad taip.
>> Realybė yra tai, ką blogi žmonės paprastai padaryti,
ar tai komandinės eilutės programa arba GUI programa ar svetainė,
jūs tiesiog pradėti teikti nesąmonė.
Jūs tipo tikrai didelis žodį į paieškos laukelį ir paspauskite "Enter",
ir laukti, kad pamatytumėte, jei žiniatinklis sugenda.
Arba galite laukti, kad pamatytumėte, jei programa pasireiškia kai klaidos pranešimą.
Nes jei jums pasisekė, nes blogas vaikinas,
ir jūs nors crazy galia sugenda programą,
tai reiškia, kad programuotojas nesitikėjo savo blogą elgesį
o tai reiškia, jums greičiausiai gali pakankamai pastangų,
pakankamai bandymų ir klaidų, išsiaiškinti, kaip darbo užmokesčio tiksliau ataką.
Taigi, kaip daug saugumo dalis yra ne tik išvengti šių išpuolių apskritai, tačiau jų aptikti
ir iš tikrųjų žiūri rąstų ir pamatyti, ką Crazy įėjimai žmonių įvedėte į savo svetainę.
Kokios paieškos frazės įvedėte į savo svetainę, kad žmonės tikisi šiek tiek buferis perpildyta?
Ir visa tai suvesta į paprastų pagrindų, kas yra masyvas,
ir ką jis reiškia, skirstyti ir naudoti atminties?
Ir su juo susijęs, taip pat yra.
>> Todėl galime tik iš pirmo žvilgsnio viduje kietąjį diską dar kartą.
Taigi, jūs prisimenate, kad prieš savaitę ar dvi, kad, kai jūs vilkite failus
jūsų šiukšlinę ar šiukšliadėžės, kas atsitiks?
[Studentų] Nieko. >> Taip, visiškai nieko. Galų gale, jei jums paleisti maža
diske, "Windows" arba "Mac OS pradės jums ištrinti failus.
Bet jei jūs vilkite kažką ten, tada tai ne visi saugus.
Visi jūsų roomate, draugas ar šeimos narys turi daryti dukart spustelėkite, ir voila.
Yra visos apytikrės failų, kurie bandė jį pašalinti.
Taigi, dauguma iš mūsų bent žinoti, kad jūs turite paspausti dešiniuoju pelės klavišu arba kontroliuoti spustelėkite
ir tuščias šiukšlinę, ar kažkas panašaus.
Bet net ir tada, kad tai ne visai padarys triuką.
Nes tai, kas atsitinka, kai jūs turite failą kietajame diske
, kuris atstovauja kai "Word" dokumentą arba kai JPEG?
Ir tai yra kietajame diske, ir tarkim, tai rakštis čia atstovauja šį failą,
ir tai sudaro visa krūva 0 ir 1.
Kas atsitinka, kai jūs ne tik vilkite failą krepšys ar recycle bin,
bet ir ištuštinti?
Rūšiuoti nieko. Tai nėra absoliučiai nieko dabar.
Dabar tiesiog nieko, nes šiek tiek kažkas atsitinka šios lentelės forma.
Taigi yra kai kurie iš duomenų bazės arba stalo rūšies viduje kompiuterio atmintyje
, kad iš esmės turi 1 stulpelį failų vardai,
ir 1 skiltyje failo vietą, kur tai gali būti vieta 123, tik atsitiktinių skaičių.
Taigi, mes galime turėti kažką panašaus X.jpg, vieta ir 123.
Ir kas atsitinka, tada, kai jūs išvalyti šiukšlių?
Kad nueina. Bet kas, neišnyksta yra 0 ir 1.
>> Taigi, kas, tada, ryšys su pset 4?
Na, 4 pset tik todėl, kad mes netyčia ištrinti
compact flash kortelė, kuri turėjo visų šių nuotraukų,
ar tik todėl, kad nepasisekimas tapo sugadintas,
nereiškia, kad 0 ir 1 yra vis dar nėra.
Gal keli iš jų yra prarastas, nes kažkas gavo sugadintas
tapo ta prasme, kad kai 0 tapo 1 ir 1 0 aisiais.
Blogi dalykai gali atsitikti dėl Buggy programinės įrangos ar trūkumais techninės įrangos.
Bet daugelis iš tų bitų, o gal net 100% iš jų yra vis dar ten,
tai tik, kad kompiuteris ar fotoaparatas nežino, kur JPEG 1 Pradėtas
ir kur JPEG 2 pradėjo, bet jei jūs, programuotojas,
žinoti, su šiek tiek išminties, kur tie JPEG yra ar kaip jie atrodo,
galite analizuoti 0 ir 1 ir sako: "Ooh. JPEG. Ooh, JPEG.
Jūs galite rašyti programą iš esmės tik už arba while cikle
, kuris atgauna kiekvieną iš šių failų.
Taigi pamoka, reikia pradėti "saugiai" ištrinti savo failus
jei norite, siekiant to išvengti visiškai. Taip?
[Studento klausimas, nesuprantamas]
>> Ar daugiau atminties, nei jūs veikėte anksčiau -
Oh! Geras klausimas. Tad kodėl, tada, kai ištuštinti šiukšlinę,
Ar jūsų kompiuteris jums pasakyti, kad jūs turite daugiau laisvos vietos nei jūs veikėte anksčiau?
Trumpai tariant, nes jis guli. Daugiau techniškai, jūs turite daugiau vietos.
Nes dabar jūs sakėte, jūs galite įdėti kitų dalykų, kur kažkada buvo, kad byla,
bet tai nereiškia, kad bitai išvykstate,
ir tai nereiškia, kad bitai pasikeitė visi 0, pavyzdžiui, dėl jūsų saugumo.
Priešingai, jei "patikimai" ištrinti failus, arba fiziškai sunaikinti prietaisą,
kad tikrai yra vienintelis būdas, kartais aplink, kad.
Tad kodėl gi ne mes palikti tą pusiau baisu pastaboje, ir mes matome, pirmadienį.
CS50.TV