[Powered by Google Translate] [SEMAJNO 5]
[Davido J. Malan, Harvard University]
[Jen CS50.] [CS50.TV]
[Virino] Li mensogas; pri kio, mi ne scias.
[Viro] Do kion ni scias?
[Virino] Tio, je 9:15, Ray Santoya estis ĉe la ATM.
[Viro] Do la demando estas, kio li faras je 9:16?
[Virino] Pafado la 9 mm ĉe io.
Eble li vidis la francotirador.
[Viro] Aŭ li laboris kun li.
[Virino] Atendu. Reiru unu.
[Viro] Kion vi vidas?
[♫ Suspenseful muziko ♫]
[Virino] Alportu sian vizagxon supren. Plena ekrano.
[Viro] Lia okulvitroj. >> Jen reflekto.
[♫ Suspenseful muziko ♫]
[Viro] Tio estas la Nuevita la basbalo teamo. Tio estas ilia logo.
[Virino] Kaj li parolas al kiu ajn estas vestita ke jako.
>> [Davido Malan] Do, ĉi tiu estas CS50 semajno 5, kaj hodiaŭ ni ruinigi iom de televido kaj kino por vi.
Do kiam ajn vi rigardas show kiel ĉi tiu tie,
kaj la policanoj diri "Ĉu vi povas purigi ke ĝis?" aŭ "Enhance,"
ne estas plibonigi en la reala mondo.
Fakte, kion vi vere get estas iom io tiamaniere.
Mi tiris supren unu el la personaro fotoj de la paĝo.
Tiu estas programo nomata Photoshop. Ĉi tiu estas 1 el 2 Bowdens,
1 el 3 Bowdens reale, hodiaŭ, ĉar ni havas sinjorino Bowden tie tiel, kun Rob kaj Paul.
Sed ĉi tie estas Rob en la ekrano, kaj se ni zoom en sur tiu ekbrilo li ĉiam havis en sia okulo,
kion vi efektive vidas estas tio kio vi vidas estas kion vi ricevos.
Tiu estas "plibonigitaj," do "CSI" havas iom malbone.
Estas unu alia klipo, se ni povas repreni sur "CSI" malmulta tempo.
Ĉi tiu estas bela frazo paroli nun se vi volas
soni teknika kun viaj amikoj kiam, vere, vi diris absolute nenion.
>> [Viro] Dum semajnoj mi estis esploranta la Cabby Killer murdoj
kun iu mórbida fascino.
[Virino # 1] Tio estas en reala tempo.
[Virino # 2] Mi krei GUI interfaco uzante Visual Basic, vidi se mi povas spuri IP-adreso.
>> [Malan] Do audio el sync flanken, kreante GUI interfaco uzante Visual Basic
spuri IP-adreso estas kompleta sensencaĵo.
Ĉi tiuj tagoj vi ne uzus Visual Basic,
ne necesas por la GUI, kaj IP-adreso estis teknike preciza termino.
Observu do okulon el ĉi tiuj, kaj unu el miaj preferitaj:
Ĉi tiu estas iom pli arcano, ĉar vi bezonas scii alian lingvon.
Jen lingvo nomita Objective-C, kiu estas superaro de C.
Kiu signifas ke estas C plus iuj aldonaj funkcioj, inter ili objekteman programadon.
Kaj jen estas la lingvo kiu Apple popularigis por iOS programado.
Kaj tial jen klipo de malsama show aro, el "Nombroj"
ke se vi efektive aspektas tre sur via TiVo kaj paŭzo ĉe la dekstra momento,
vi vidos, ke kion ili rigardas ne sufiĉe kio estas priskribita.
Kaj lasu min provi malsaman audio konektilon tie kaj vidi se ni ne povas
teni la audio sinkronigita ĉi tiu tempo.
Mi donas al vi "Nombroj".
>> [Viro # 1] Ĝi estas 32-bita IPv4 adreso.
[Viro # 2] IP, tio estas la interreto. >> Privata reto. Estas Anita privata reto.
[Malan] Okay. Ĉi tiu estas Objective-C, kaj ĝi estas por iu knabo la kolorigo programo,
kiel vi povas eble konkludi de la nomo de la variablo tie.
Tiel ke, tiam, estis "Nombroj". Do hodiaŭ kaj ĉi-semajne ni prezentas
iom de la mondo de forensics kaj la kunteksto en la problemoj sekve.
Hodiaŭ estos mallongigita prelego ĉar ekzistas speciala okazaĵo ĉi tien
poste, do ni devos preni travidi, kaj tease ambaŭ studentoj kaj gepatroj egale hodiaŭ
kun iuj el la aĵoj kiuj estas sur la horizonto.
Inter ili, ekde lundo, vi havos kelkajn pli samklasanoj.
EdX, Harvard kaj MITS nova linio iniciato por malfermitaj courseware
kaj pli, ĵetas sur Harvard kampuso lundon.
Kio signifas veni lundon vi havos - ekde lasta grafo,
86.000 pliaj samklasanoj estos post kune kun CS50 la prelegoj
kaj sekcioj kaj walkthroughs kaj problemo aroj.
Kaj kiel parto de tiu, vi fariĝos membroj de la inaŭgura klaso de
CS50 kaj nun CS50x.
>> Kiel parto de tio, nun, rimarkas ke estos iuj upsides tiel.
Varbi por tio, por la amasa kvanto de lernantoj,
sufiĉas diri ke kvankam ni havas 108 TFs kaj CAS,
Ne tute bona studento / instruisto rilatumo iam ni batis 80.000 aliaj studentoj.
Do ni ne estos grading tiom da problemo aroj permane.
Do enkondukis ĉi tiun semajnon en la problemo aro estos CS50 Jaque,
kiu iras al esti komandlinio utileco en la aparaton
ke vi ricevos kiam vi ĝisdatigas ĝin poste ĉi semajnfino,
kaj vi povos kuri komando, kontrolu 50,
en via propra pset, kaj vi ricevos iom da sugestoj pri tio, ĉu via programo estas
ĝentila aŭ malĝusta laŭ diversaj dezajno especificaciones ke ni havigis.
Do pli en tiu kaj la problemo aro specifo kaj
la CS50x samklasanoj estos uzante ĉi tiel.
>> Do problemo aro 4 estas ĉion pri forensics.
Kaj ĉi tiu peco estis inspirita de iu reala vivo stuff,
per kiam mi estis en postdiploma lernejo, mi internigita por tempo kun
la Middlesex County la prokuroro Oficejo faras jura laboro
kun lia ĉefa jura esploristo, kaj kion tiu sumiĝis
estas, mi kredas ke mi menciis kelkajn semajno pasinta, estas la Meso ŝtato polico aŭ aliaj
would envenis, ili delasus ekstere aĵojn kiel malmolaj diskoj kaj KD kaj disketoj
kaj similaj, kaj tiam la celo de la forensics oficejo estis konstati ĉu
estis aŭ ne estis pruvo de iu tipo.
Ĉi tiu estis la Specialaj Esploroj Unueco, tiel estis blanka kolumo krimo,
estis pli tumulti ia krimoj,
ion engaĝante ia ciferecaj komunikiloj; rezultas ke ne, ke multaj homoj
skribi retmesaĝon dirante "Mi faris tion."
Do tre ofte tiuj forensics serĉoj ne deturnis tiun tutan multe da frukto;
Sed kelkfoje homoj skribus tiajn retpoŝtojn.
Do kelkfoje la penadoj estis rekompencita.
>> Sed por konduki ĝis ĉi jura pset, ni estos enkonduki en pset 4 iom de grafikaĵoj.
Do vi probable prenos ĉi tiujn aĵojn por koncedis, JPEG-oj, gifs kaj similaj tiuj tagoj,
sed se vi vere pensas pri ĝi, bildo, multe kiel Rob vizaĝon,
povus esti modelita kiel vico de punktoj, aŭ rastrumeroj.
Nun, en la kazo de Rob vizaĝon, estas ĉiaj koloroj,
kaj ni komencis vidi la individuo dots, otherwide konata kiel rastrumeroj,
iam ni komencis zoom in
Sed se ni simpligi la mondo iom, kaj ĝuste diri ke ĉi tie estas Rob
en nigra kaj blanka, nu, por reprezenti nigraj kaj blankaj ni povas simple uzi duuma.
Kaj se ni tuj uzi duuma, 1 aŭ 0, oni povas esprimi ĉi sama bildo
de Rob la ridetanta vizaĝo kun ĉi ŝablono de bitoj: 11000011 reprezentas
blanka, blanka, nigra, nigra, nigra, nigra, blanka blankaj.
Kaj tiel ĝi ne estas grandega salto do komenci paroli pri pitoreskaj fotoj.
Tion, kion vi vidus en Facebook aŭ preni kun cifereca fotilo,
sed, certe, kiam temas pri koloroj, vi bezonas pli bitoj.
Kaj sufiĉe komuna en la mondo de fotoj estas uzi ne 1-bita koloro,
kiel ĉi tio sugestas, sed 24-bita koloro, kie vi reale preni milionojn da koloroj.
Do kiel en la kazo kiam ni zoomed en sur Rob de kudrilo,
kiu estis ajna nombro da malsamaj bunta ebloj.
>> Do ni enkonduki tion en problemo aro 4 tiel kiel en la walkthrough,
kiu estos hodiaux je 3:30 anstataŭ la kutima 2:30 pro la vendreda prelego tie.
Sed la video estos interrete, kiel kutime, morgaŭ.
Ni ankaŭ enkonduki vin al alia formato de dosiero.
Do tiu estas intence signifis por serĉi intimidante unue,
sed ĉi tiu estas nur iuj dokumentado por C struct.
Rezultas ke Microsoft, jaroj, helpis popularigi ĉi tiu formato,
nomata bitmap formato, BMP, kaj tio estis la super-simpla,
bunta grafikaj formato kiu estis uzita por sufiĉe tempo
kaj kelkfoje eĉ por wallpapers sur labortabloj.
Se vi pensas reen al Vindozo XP kaj la montetoj kaj blua ĉielo,
kiu estis tipe BMP, aŭ bitmap bildo, kaj bitmaps
estas amuza por ni ĉar ili havas iom pli komplekseco.
Ne tute tiel simpla kiel tiu krado de 0-aj kaj 1-oj;
anstataŭ, vi havas aferojn kiel header komence de dosiero.
Do alivorte, ene. Bmp dosiero estas tuta amaso de 0-aj kaj 1-oj,
sed ekzistas iuj pliaj 0-aj kaj 1-oj en tie.
Kaj ĝi rezultas ke kion ni probable memkompreneble dum jaroj,
formatoj kiel. doc aŭ. XLS aŭ. mp3 aŭ. mp4,
kion ajn la dosiero formatojn ke vi estas familiara kun.
Nu, kion signifas tio eĉ signifas, esti formato?
Ĉar fine de la tago, ĉiuj ĉi tiuj dosieroj ni uzas havi nur 0 kaj 1 estas la
kaj eble tiujn 0-aj kaj 1-oj reprezentas a, b, c, tra ASCII aŭ similaj,
sed tra la fino de la tago, estas nur 0 kaj 1 estas la.
>> Do homoj nur foje decidas elpensi novan formaton
kie normigi kion ŝablonoj de bitoj efektive volas diri.
Kaj en ĉi tiu kazo tie, la homoj kiuj desegnis la bitmap formato
diris ke je la unua bajto en bitmap dosiero, kiel skribata kompensi 0, tie,
tie tuj estos iuj cryptically nomata variablo nomis bfType,
kiu nur staras por bitmap dosiero tipo; kio tipo de bitmap dosieron ĉi estas.
Vi povas konkludi, eble, de la dua vico ke kompensi 2, bajto numero 2,
havas modelon de 0-aj kaj 1-oj kiu reprezentas kio?
La grandeco de iu, kaj ĝi iras de tie.
Do en problemo aro 4, vi devas piediri tra kelkaj el tiuj aferoj.
>> Ni ne finos zorgado pri cxiuj el ili, sed rimarkas ĝin komencas akiri interesajn
ĉirkaŭ linio aŭ bajto 54, rgbtBlue, Verda kaj ruĝa.
Se vi iam aŭdis la akronimo RGB, ruĝa verda blua, ĉi tiu estas referenco al tiu.
Ĉar ĝi rezultas vi povas pentri ĉiujn kolorojn de la ĉielarko
kun iu kombino de ruĝa kaj blua kaj verda.
Kaj, fakte, la gepatroj en la ĉambron povus memori iuj de la plej fruaj proyectores.
Tiuj tagoj, vi simple vidas 1 brila lumo venas el lenso.
Sed tie en la tago, vi havis la ruĝa lenso, la blua lenso, kaj la verda lenso
kaj ili kune celas la ekrano kaj formis pitoreskan bildon.
Kaj tre ofte mezo lernejoj kaj mezlernejoj havus tiujn lensoj
ĉiam tiel iomete Askew, do vi estis ia vidante duobla aŭ triobla bildoj,
sed tio estis la ideo. Vi havis ruĝan kaj verdan kaj bluan lumon pentrado.
Kaj tiu sama principo estas uzata en komputiloj.
>> Do inter la defioj, do, por vi en problemo starigis 4
tuj estos kelkaj aferoj; unu estas vere regrandigi bildon.
Preni en ŝablono de 0-aj kaj 1-oj,
elŝeligi kion pecoj de 0-aj kaj 1-oj reprezentas kio en strukturo kiel ĉi tiu,
kaj poste kalkuli kiom repliki la rastrumeroj: la ruĝaj, la bluso, la verduloj
interne por ke kiam bildo aspektas kiel ĉi komence, povus aspekti kiel ĉi anstataŭ post tio.
Inter la aliaj defioj, tro, tuj estos ke vi estos transdonita
a jura bildo de reala dosiero el cifereca fotilo
kaj en tiu ĉambro, iam, estis tuta amaso de fotoj.
La problemo estas, ni hazarde viŝitaj aŭ havis la bildon koruptita iel.
Malbona aĵoj okazas kun ciferecaj fotiloj, kaj tiel ni rapide kopiis ĉiujn 0-aj kaj 1-oj
ekstere de tiu karto por vi, savis ilin ĉiujn en 1 granda dosiero kaj poste ni transdonos ilin al vi
en problemo starigis 4 tiel, ke vi povas skribi programon en C kun kiu rekuperi
ĉiuj el tiuj JPEG-oj, ideale.
Kaj ĝi rezultas ke JPEG-oj, kvankam ili estas iom de kompleksa arkivo formato,
ili estas multe pli kompleksa ol tiu ridetanta vizaĝo tie.
Rezultas, ke ĉiu JPEG komenciĝas per la sama ŝablonoj de 0-aj kaj 1-oj.
Do uzante dum buklo aŭ por buklo aŭ similaj,
vi povas persisti dum la tuta 0-aj kaj 1-oj en ĉi jura bildo
kaj ĉiufoje kiam vi vidas la specialajn modelon ke tio difinita en la problemo aro de specifo,
vi povas supozi, "Ho, jen, kun tre alta probablo,
la komenco de JPEG, 'kaj tuj kiam vi trovas la sama mastro,
iu nombro da bajtoj aŭ kilobajtoj aŭ megabajtoj poste,
vi povas supozi, 'Ooh! Jen dua JPEG, la foton mi prenis post la unua.
Lasu min ĉesi legi tiun unuan dosiero, komenci skribi ĉi nova. '
Kaj la rezulto de via programo por pset 4 tuj estos kiel multaj kiel 50 JPEG-oj.
Kaj se ĝi ne estas 50 JPEG-oj, vi havas iom de ciklo.
Se vi havas malfinia nombro de JPEG-oj, vi havas malfinia ciklo.
Por ke ankaux estos sufiĉe komuna afero.
Tio kio estas sur la horizonto.
>> Kvizo 0, malantaŭ ni. Realigi, per mia retpoŝto, kiu nevarie ekzistas homoj
kiu estas ambaŭ feliĉaj, ia neŭtrala, kaj malĝoja ĉirkaŭ kvizo 0 tempo.
Kaj bonvolu alveni al mi, la estro TFs, Zamyla, via propra TF
aŭ unu el la CAS ke vi scias se vi ŝatus diskuti kiel aĵoj iris.
>> Do por impresi la gepatroj tie en la ĉambron,
kio estas la CS50 biblioteko? Bonan laboron.
Kio estas la CS50 biblioteko? Yeah? [Studenta respondoj, nekomprenebla]
>> Konsentite, bona. Do ĝi estas prewritten aro de kodo, ke ni, la dungitaro, skribis,
ni ofertas al vi, por havigi iujn komunajn funcionalidades.
Plenigos like min ĉenon; get mi int, ĉiuj de la funkcioj kiuj estas listigitaj ĉi tie.
Komencante nun, ni komencos vere preni tiujn trejnado radoj malproksime.
Do ni tuj komencos por forpreni de "ĉeno" de vi,
kiu, revokon, estis nur sinonimo por kio reala datumtipo? char *.
Do por gepatroj, ke estis probable - tio estas bona, do char * ni komencos vidi
sur la ekrano des pli kiam ni remove "ĉeno" de nia vortotrezoro,
almenaŭ kiam temas pri fakte skribi kodon.
Simile, ni ĉesas uzi iujn el tiuj funkcioj tiel,
ĉar niaj programoj tuj akiri pli kompleksa
anstataŭ nur skribi programojn kiuj sidas tie kun prompto palpebrumante,
atendante la uzanto tajpas ion in
Vi ricevos vian enigoj de aliloke.
Ekzemple, vi ricevos ilin el serio de bitoj en la loka malmola disko.
Vi anstataŭe preni ilin en la estonteco de retkonekto, iuj afiŝinto ie.
Do ni senŝeligi reen ĉi tavolo por la unua fojo, kaj elsxiros la CS50 aparaton
kaj ĉi tiu dosiero nomata CS50.h, kiu vi estas akra kiel dum semajnoj.
>> Sed ni reale vidi kio estas ene de ĉi.
Do la supro de la dosiero en bluo estas nur aro aro da komentoj,
garantio informoj kaj licencoj. Tio estas speco de komuna paradigmo
en programaro, ĉar multe da programaro tiuj tagoj estas kion nomas "malfermita fonto",
kio signifas, ke iu skribis la kodon
kaj faris ĝin libere disponebla, ne nur kuri kaj uzi,
sed fakte legis kaj ŝanĝi kaj integri en vian propran laboron.
Do jen kio vi uzis, liberajn programarojn,
kvankam en tre malgranda formo.
Se mi rulumu malsupren preter la komentoj, kvankam, ni komencas vidi iujn pli familiara aĵoj.
Do rimarki supre tie, ke la CS50.h dosieron inkludas tuta amaso de header files.
Nun, la plejparto de tiuj ni ne vidis antaŭe, sed unu estas
familiara; kiu el tiuj ni vidis, kvankam mallonge, tiel malproksime?
Yeah, normo bibliotekoj. Stdlib.h havas malloc,
do iam ni komencis paroli pri dinamika memoro atribuo,
kiuj ni revenos al proksima semajno tiel, ni komencis inkluzive tiu dosiero.
Ĝi rezultas ke bool kaj veraj kaj falsaj ne reale ekzistas en C, per,
se vi ne inkluzivas tiun dosieron ĉi tie.
Do ni, dum semajnoj, estis inkluditaj normo bool.h
por ke vi povas uzi la nocio de bool, vera aŭ malvera.
Sen tio, vi devus ordigi de fake ĝin kaj uzi int
kaj nur arbitre supozas ke 0 estas malvera kaj 1 estas vera.
>> Nun, se ni rulumu malsupren plu, jen nia difino de kordoj.
Rezultas, kiel ni diris antaŭe, ke kie ĉi * estas ne vere gravas.
Vi povas eĉ havi spacon cxirkauxe.
Ni, ĉi semestro, ili promocias ĝin kiel tiun por fari certe ke la * devas vidi kun la tipo.
Sed realigi, kiel komuna, se ne iom pli komuna, estas meti ĝin tie
sed funkcie estas la sama afero.
Sed nun, se ni legas malsupren pliaj, ni rigardu diru GetInt,
ĉar ni uzas tion, eble, antaux io ajn alia ĉi semestro.
Kaj jen GetInt. Tio estas kio?
Ĉi tiu estas la prototipo. Tiom ofte, ni metis prototipoj en la suproj de nia. C dosieroj,
sed vi povas ankaŭ meti prototipoj en header files,. h dosieroj,
kiel ĉi tiu tie, tiel ke kiam vi skribas iujn funkciojn
ke vi volas ke aliaj homoj por povi uzi, kiu estas ĝuste la kazo kun la CS50 biblioteko,
vi ne nur apliki vian funkcioj en iu kiel CS50.c,
vi ankaŭ metis la prototipoj ne je la supro de tiu dosiero, sed al la supro de kapdosiero,
tiam tiu kapdosiero estas kio amikoj kaj kolegoj inkludi,
kun akraj inkludi en siajn proprajn kodo.
Do ĉio ĉi momento vi estis inkluditaj ĉiuj tiuj prototipoj
efektive ĉe la supro de via dosiero, sed per vojo de ĉi akra inkluzivas meĥanismo
kiu esence kopioj kaj pastes ĉi dosieron en via propra.
Nun, jen iuj sufiĉe detala dokumentado.
>> Ni preskaux memkompreneble, ke GetInt gets an int,
sed ĝi rezultas ekzistas iu angulo kazoj, ĉu ne?
Kio se la uzanto tajpas en numero kiu estas multe tro granda?
Al quintillion, ke tute ne povas persvadi ene de int?
Kio estas la atendata konduto? Nu, ideale, estas antaŭvidebla.
Do en ĉi tiu kazo, se vi vere legis la fajna impreso,
vi vidos, ke se la linio ne povas legi, ĉi revenas INT_MAX.
Ni neniam parolis pri tio, sed bazita sur ĝia majuskloj,
kio ĝi estas, probable?
Ĝi estas konstanta, do ĝi estas iu speciala konstanta ke tio probable deklaris
en unu el tiuj header files tio pli alten en la dosiero,
kaj INT_MAX estas probable io kiel, krude, 2 miliardoj.
La ideo estas ke ĉar ni bezonas iel signifas, ke io estis malbone,
ni, jes, havi 4 miliardoj ciferoj je nia dispono,
negativa 2 miliardoj plu supren al 2 miliardoj, donu aŭ preni.
Nu, kio estas komuna en programado estas vi ŝtelas nur unu el tiuj numeroj.
Eble 0, eble 2 milionoj, eble negativa 2 miliardoj.
Do vi pasigas unu el viaj eblaj valoroj por ke vi povas fari al la mondo
ke se iu iras malbone, mi revenos ĉi tiu super-granda valoro.
Sed vi ne volas ke la uzanto tajpas ion críptico kiel "2, 3, 4 ..."
de vere grandaj numeron, kie vi ĝeneraligi anstataŭe kiel konstanto.
Do vere, se vi estas anal la lastaj semajnoj,
aùton vi nomas GetInt, vi devus esti kontrolanta per se kondiĉo.
Ĉu la uzanto entajpu INT_MAX, aŭ pli specife,
faris GetInt reveno INT_MAX? Ĉar se ĝi faris,
ke reale signifas ne tajpu ĝin; ion misokazis en ĉi tiu kazo.
Do ĉi tiu estas kion ĝenerale konata kiel "gardostaranto" valoro, kiu ĵus signifas speciala.
>> Nu, ni nun turnu en la. C dosierojn.
La C-dosiero ekzistis en la aparaton dum iu tempo,
kaj, fakte, la aparaton havas ĝin precompiled por vi
en tiu afero ni nomas "celkodo,"
sed ĝuste ne gravas al vi kie estas ĉar la sistemo sciu,
en ĉi tiu kazo, kie ĝi estas, la aparaton.
Sed ni rulumu malsupren nun GetInt, kaj vidi kiel GetInt estis laborante ĉiuj ĉi tempo.
Do jen ni havas similajn komentojn de antaŭe.
Lasu min zomi en nur la kodo parton,
kaj kion ni havas por GetInt estas jeno.
Ĝi prenas neniun eniro kaj ĝi redonas int, dum (vera), do ni havas intenca senfina ciklo
sed, supozeble, ni rompos el cxi tiu iel, aŭ reveni de interne ĉi.
Do ni vidu kiel tio funkcias. Nu, ni ŝajnas esti uzante GetString
en ĉi tiu unua linio ene de la ciklo, 166.
Tio estas nun bona praktiko ĉar sub kiaj cirkonstancoj
povus GetString reveni ĉi speciala ŝlosilvorto, NULL?
Se iu iras malbone. Kio povus erari kiam vi nomas iun kiel GetString?
Yeah? [Studenta respondo, nekomprenebla] >> Jes. Do eble malloc malsukcesas.
Ie sub la kapuĉo GetString alvokas malloc,
kiu allocates memoro, kiu lasas la komputilo vendejo
ĉiuj signoj, ke la uzanto tajpas en la klavaro.
Kaj supozu ke la uzanto devis tuta multan liberan tempon
kaj tajpita pli, ekzemple, ol 2 miliardoj gravuloj.
Pli signoj ol la komputilo eĉ havas RAM.
Nu, GetString devas esti kapabla por signifi ke al vi,
eĉ se tiu estas super, super nekomuna angulo kazo.
Ĝi devas iel povos trakti tion, kaj tiel GetString,
se ni iros tien kaj legis liajn dokumentado, ĝi, fakte, revenu NULL.
Nun se GetString maltrafas per reveni NULL, GetInt tuj malsukcesos
per reveni INT_MAX, ĝuste kiel gardostaranto.
Ĉi tiuj estas nur homaj konvencioj. La sola maniero vi scius ĉi tiu estas la kazo
estas per legi la dokumentadon.
Do ni rulu suben ĝis kie la int estas fakte GotInt.
>> Do se mi rulumu malsupren iom pli, en linio 170 ni havas komenton supre tiuj linioj.
Do ni deklaras, en 172, la int n kaj char c, kaj tiam tiu nova funkcio
kiu iuj el vi stumblis trans antaŭe, sed sscanf.
Tiu signifas ĉenon scan f.
En aliaj vortoj, donu al mi ĉenon kaj mi skani gxin por pecoj de informo de intereso.
Do kion tio signifas? Nu, supozu, ke mi tajpas en, laŭvorte, 1 2 3 ĉe la klavaro,
kaj poste batis eniri. Kio estas la datumtipo de 1 2 3 kiam revenis por GetString?
Estas evidente ĉenon, ĉu ne? Mi havas ĉenon, do 1 2 3 estas vere "1 2 3"
kun la \ 0 je la fino de ĝi. Tio ne estas int.
Tio ne estas nombro. Ĝi aspektas kiel numero sed ĝi ne estas vere.
Do kion signifas GetInt devas fari? Ĝi devas skani ke kordoj maldekstre dekstren,
1 2 3 \ 0, kaj iel konverti ĝin al reala entjero.
Nun, vi povus malkovri kiel fari tion.
Se vi pensas reen al pset 2, vi supozeble ricevis iom komforta
kun Cezaro aŭ Vigenère tiel vi povas persisti dum ĉenon,
vi povas konverti signoj al ints kun fosilo. Tio estas tuta kvanto de laboro.
Kial ne nomi funkcion kiel sscanf kiu faras, ke por vi?
Do sscanf atendas argumenton, en ĉi tiu kazo nomata linio, kiu estas ĉeno.
Vi do precizigi, en citilojn, tre simila al printf,
Kion vi atendis vidi en ĉi tiu ĉeno?
Kion mi diras jen, mi atendas vidi dekuma nombro kaj eble karaktero.
Kaj ni vidos kial ĉi tiu estas la kazo en nur momento.
Ĝi rezultas ke tiu skribmaniero estas nun memoras stuff
ni komencis paroli pri iom pli antaŭ semajno.
>> Kio estas & n kaj ktp faras por ni ĉi tie? [Studenta respondoj, nekomprenebla]
>> Jes. Oni donas al mi la adreson de n kaj adreso de c.
Nun, kial estas tiu grava? Nu, vi scias ke kun funkcioj en C
vi povas ĉiam resendas valoron aŭ ne valoro tute ne.
Vi povas reveni al int, ĉeno, kaleŝego, a char, kiom.
Aŭ vi povas reveni malplena, sed vi nur povas reveni 1 afero maksimume.
Sed ĉi tie ni volas sscanf reveni mi eble oni int, dekuma nombro,
kaj ankaŭ char, kaj mi klarigos kial la signo en momento.
Do vi efektive volas f reveni 2 aĵoj; tio estas nur ne eblas en C.
Do vi povas labori ĉirkaŭ tiu pasante en 2 adresoj,
ĉar tuj kiam vi transdonos funkcio 2 adresoj, kio povas tiu funkcio faras kun ili?
Ĝi povas skribi al tiuj adresoj. Vi povas uzi la * operacio kaj "iru tien" al ĉiu el tiuj adresoj.
Estas iel ĉi backdoor mekanismo, sed tre komuna por ŝanĝi la valorojn de variabloj
en pli ol nur 1 lokon, en ĉi tiu kazo 2.
Nun, rimarki Mi kontrolanta por == to1, kaj poste reveni n se tio, fakte, taksi al vera.
Do kio okazas? Nu, teknike, ĉiuj ni vere volas okazi en GetInt estas ĉi.
Ni volas analizi, por tiel diri, ni deziras legi la kordo
"1 2 3" kaj se ĝi ŝajnas ke estas pluraj tie,
kion ni diras al sscanf fari estas meti tiun numeron, 1 2 3, en ĉi tiu variablo n por mi.
Kial, do, faris mi havas ĉi tiel?
Kio estas la rolo de la ankaŭ dirante sscanf, vi povus ankaŭ preni karaktero tie.
[Studenta parolante, nekomprenebla] >> Ne - dekuma punkto povus funkcii.
Ni tenu kiu pensis dum momento. Kion alian?
[Studento, nekomprenebla] >> Do, bona penso, ĝi povus esti la NULL karaktero.
Ĝi fakte ne estas, en ĉi tiu kazo. Yeah? [Studento, nekomprenebla]
>> >> ASCII. Aŭ, lasu min ĝeneraligi eĉ pli.
La% c tie estas nur por eraro-kontrolanta.
Ni ne volas tie esti karaktero post la numeron,
sed kion tiu permesas al mi fari estas la jenaj:
Ĝi rezultas ke sscanf, krom stoki valorojn en n kaj c, en ĉi tiu ekzemplo tie ĉi,
kio ankaŭ ne estas denove la nombro de variabloj metis valoroj in
Do, se vi nur tajpi en 1 2 3, tiam nur la% d tuj kongruas
kaj nur n gets stokita kun valoro kiel 1 2 3 kaj nenio gets metis en c;
c restas rubo valoron, por tiel diri.
Rubo ĉar ĝi neniam estis inicializado kiel iu valoro.
Do en tiu kazo, sscanf revenas 1, ĉar mi popolita unu el tiuj indikoj,
en kies kazo, granda. Mi havas int, do mi liberigi la linion liberigi ĝis la memoro
ke GetString efektive asignitaj, kaj poste mi revenos n.
Alian, se vi iam scivolis kie tiu reprovi deklaro devenas, venas de dekstre tie.
Se, kontraŭe, mi tajpas en 1 2 3 foo,
nur iuj hazardaj vico de teksto, sscanf tuj vidos,
ooh, numero, ooh, numero, ooh, numero, ooh - f.
Kaj tuj metis la 1 2 3 en n.
Ĝi tuj metis la f en c, kaj tiam revenu 2.
Do ni havas, simple uzante la baza difino de scanf la konduto,
tre simpla maniero - nu, kompleksaj unuavide, sed fine de la tago,
sufiĉe simpla mekanismo de diri, estas tie int, kaj se jes, estas ke la sola afero kiun mi trovis?
Kaj la blanka spaco ĉi tie estas intenca. Se vi legis la dokumentaron por sscanf,
rakontas al vi, ke se vi inkludas pecon de blanka spaco je la komenco aŭ la fino,
sscanf tro permesos al la uzanto, ial ajn bati spacebar 1 2 3, kaj kiu estos prava.
Ĝi ne krias al la uzanto nur ĉar ili batis la spacebar komence aŭ la fino,
kiu estas nur iom pli uzantamika.
>> Demandojn, tiam, sur GetInts? Yeah?
[Studenta demando, nekomprenebla]
>> Bona demando. Kio se vi simple tajpis en char, kiel f, kaj sukceson eniri
sen iam tajpas 1 2 3; kion vi opinias la konduto de ĉi tiu linio de kodo devus tiam esti?
Do sscanf povas kovri tion, ĉar en tiu kazo,
ĝi ne iras por plenigi n aŭ c; ĝi tuj anstataŭ reveni 0.
En tiu kazo, mi ankaŭ kaptante ke scenaro, ĉar la atendata valoro mi volas estas 1.
Mi nur volas 1, kaj nur 1 afero plenigxu. Bona demando. Aliaj?
>> Bone, do ni ne estas iri tra ĉiuj funkcioj en ĉi tie,
sed kiu ŝajnas esti, eble, de cetera intereso
estas GetString ĉar ĝi rezultas ke GetFloat, GetInt,
GetDouble, GetLongLong ĉiuj liberigas multajn siajn funkciojn al GetString.
Do ni rigardu kiel li estas implementado tie.
Ĉi tiu aspektas iom kompleksaj sed uzas la saman fundamentojn
ke ni komencis paroli pri pasintsemajne. Do en GetString,
kiu prenas neniun argumenton kiel por la malplena tien,
kaj denove ĉenon, do mi deklaras ĉeno nomata buffer.
Mi ne vere scias kion tio okazas al esti uzita por ankoraŭ, sed ni vidos.
Looks like kapablo estas, implicite, 0; ne tute certas kie ĉi iras.
Ne certas kion n tuj uzi por ankoraŭ.
Sed nun ĝi estas ricevas iom pli interesa, do en linio 243,
ni deklaru int c, ĉi tiu estas speco de stulta detalo.
A char estas 8 bitoj, kaj 8 bitoj povas stoki kiom malsamaj valoroj?
256. La problemo estas, se vi volas havi 256 malsamaj karakteroj ASCII,
kio estas, se vi opinias dorso, kaj ĉi ne estas io por enmemorigi.
Sed se vi pensas al tiu granda ASCII abako ni havis semajnoj,
tie estis, en tiu kazo, 128 aŭ 256 ASCII signojn.
Ni uzis ĉiujn la mastroj de 0-aj kaj 1 OKAZAS.
Tio estas problemo se oni volas povi detekti eraron.
Ĉar se vi jam uzis 256 valoroj por via karakteroj,
vi ne vere planas antaŭe, ĉar nun vi ne havas maniero diri,
"Ĉi tiu ne estas legit karaktero; ĉi estas kelkaj eraraj mesaĝo."
Do kio estas la mondo faras estas, ili uzas la venonta plej granda valoro,
io kiel int por ke vi havas freneza nombro de bitoj,
32 por 4 miliardoj eblaj valoroj, tiel ke vi povas simple fini uzante,
esence, 257 el ili, 1 el kiuj havas iun specialan signifon kiel eraro.
>> Do ni vidu kiel tio funkcias. En linio 246, mi havas ĉi granda dum buklo
kiu vokas fgetc; f signifo dosiero, getc, kaj tiam stdin.
Rezultas ĉi estas nur la plej preciza maniero diri "legi enigo de la klavaro."
Norma enigo per klavaro, cxefeligo signifas ekrano,
kaj normo eraro, kiun ni vidas en pset 4, signifas la ekrano,
sed speciala parto de la ekrano, por ke ĝi ne conflated
kun reala eligo ke vi intencis presi, sed pli en kiuj en la estonteco.
Do fgetc simple signifas legis unu signo de la klavaro, kaj stoki ĝin kie?
Stoki ĝin en c, kaj tiam kontrolu, do mi simple uzante iu bulea konjunkcioj tie,
kontroli ke ne egala \ n, tiel la uzanto batis eniri.
Ni volas halti ĉe tiu punkto, fino de la ciklo, kaj ni ankaŭ volas kontroli
por la speciala konstanta, EOF, kiu se vi konas aŭ diveni - kio faras ĝi staras por?
Fino de dosiero. Do ĉi tiu estas speco de sensenca, ĉar se mi tajpas en la klavaro,
tie estas vere neniu dosiero implikita en ĉi tiu,
sed ĉi tiu estas nur ordigi de la ĝenerala termino uzata por signifi
ke nenio alia venas el la homa la fingroj. EOF. Fino de dosiero.
Kiel flanken, se vi iam batis kontrolo d je via klavaro,
ne por ke vi havus ankoraux; vi batis kontrolo c.
Sed kontrolo d sendas ĉi speciala konstanta nomita EOF.
>> Do nun ni nur havas iom dinamika memoro atribuo.
Do se n + 1> kapablo, nun mi klarigos n.
n estas ĝuste kiom da bajtoj estas nuntempe en la buffer,
la kordo, ke vi nuntempe konstruas el la uzanto.
Se vi havas pli karakteroj en via buffer ol vi havas kapablon en la buffer,
intuicie, kion ni bezonas por fari do estas atribui pli kapablo.
Mi tuj skim super iu de la aritmetika tie
kaj enfokusigi nur en tiu funkcio ĉi tie.
Vi scias, kio malloc estas, aŭ almenaŭ ĝenerale konata.
Prenu guess kion realloc faras. [Studenta respondo, nekomprenebla]
>> Jes. Kaj ĝi estas ne tute aldonante memoro; ĝi reallocates memoro kiel sekvas:
Se tie estas ankoraŭ ĉambron ĉe la fino de la ŝnuro por doni al vi pli de tiu memoro
ol origine donas al vi, tiam vi ricevos tiu plia memoro.
Do vi povas simple meti la ĉenojn gravuloj malantaŭo al malantaŭo al malantaŭo al malantaŭo.
Sed se tio ne estas la kazo, ĉar vi atendis tro longe
kaj iu hazarda atingis plopped en memoro tie, sed ekzistas ekstra
memoro cxi tie, ke estas bone. Realloc tuj faros la tuta peza ŝarĝo por vi,
movi la kordo vi legis en la tiel malproksime de ĉi tie,
metis ĝin tie, kaj tiam donas al vi iom pli ponteto en tiu punkto.
Do kun ondo de la mano, mi diru ke kion GetString faras
Estas ĝi estas startanta kun malgranda buffer, eble 1 sola karaktero,
kaj se la uzanto tajpas en 2 karakteroj, GetString finas
nomante realloc kaj diras, 'Ooh, 1 karaktero ne sufiĉis.
Donu al mi 2 signojn. ' Tiam, se vi legis tra la logiko de la ciklo,
ĝi tuj diros, 'Ooh, la uzanto tajpas en 3 signoj.
Donu al mi nun ne 2 sed 4 karakteroj, tiam donu al mi 8, tiam donu al mi 16 kaj 32. "
La fakto, ke mi duobligante la kapablo ĉiufoje
signifas ke la bufro ne tuj kreski malrapide.
Ĝi tuj kreski super rapida, kaj kio povus esti la avantaĝo de tiu?
Kial mi dubli la grandecon de la bufro, kvankam la uzanto
Eble nur bezonas 1 aldona karaktero de la klavaro?
[Studenta respondo, nekomprenebla]. >> Kio estas tio?
Ekzakte. Vi ne devas kreski kiel ofte.
Kaj tiu estas nur speco de - you're hedging vian vetas tie.
La ideo estas ke vi ne volas nomi realloc multe, ĉar ĝi emas esti malrapida.
Ajn vi petos la mastruma sistemo por memoro, kiel vi baldaŭ vidos
en futura problemo aro, ĝi emas preni iom da tempo.
Do ŝparajn tiu kvanto de tempo, eĉ se vi malŝparas iu spaco, emas esti bona afero.
>> Sed se ni legas tra la fina parto de GetString tie,
kaj denove, komprenante ĉiun linion ĉi tie ne estas tiel grava hodiaŭ.
Sed rimarki ke ĝi eventuale nomas malloc denove, kaj ĝi allocates
precize kiel multaj bitokoj kiel ĝi bezonas por la kordo
kaj poste ĵetas for nomante libera, la troe granda buffer,
se ja got duobliĝis tro da fojoj.
Unuvorte, tiu estas kiel GetString estis laborante ĉiuj ĉi tempo.
Ĉiuj faras estas legi unu signo samtempe denove kaj denove kaj denove
kaj ĉiufoje ĝi bezonas plian memoron, ĝi petas la mastruma sistemo por ĝin nomi realloc.
Demandojn? Bone.
>> Atako. Nun ke ni komprenas punteros, aŭ almenaŭ
estas pli familiara kun indikoj,
ni pripensu, kiel la tuta mondo komenciĝas en collapse
se vi ne sufiĉe protekti kontraŭ adversarial uzantoj,
homoj kiuj klopodas pirati en vian sistemon.
Homoj kiuj provas ŝteli vian programaron per circumventing iuj registriĝo kodo
ke ili povu alie devas tajpi in
Rigardu ĉi tiu ekzemplo tie ĉi, kiu estas nur C-kodo
kiu havas funkcion ĉefa en la fundo, kiu nomas funkcio foo,
kaj kio ĝi pasas al foo? [Studenta] Sola argumento.
>> Single argumento. Do argv [1], kio signifas la unuan vorton de la uzanto tajpas
en la komanda linio post a.out aŭ kion ajn la programo estas nomata.
Do foo, sur la supro, prenas en char *, sed char * estas simple kion?
Linio. Estas nenio nova tie ĉi, kaj tiu linio estas arbitre nomi trinkejo.
En ĉi tiu linio tie, char c [12], en speco de duon-teknika angla, kio ĉi tiu linio faras?
Tabelo de -? Karakteroj. Donu al mi aron de 12 signoj.
Do ni povus nomi tiun buffer. Ĝi estas teknike nomitaj c, sed oni buffer en programado
nur signifas aron da spaco kiun vi povas meti iujn aĵojn in
>> Tiam laste, memcpy, ni ne uzas antaŭe.
Sed vi povas verŝajne diveni kion ĝi faras. Ĝi kopias memoro.
Kion ĝi faras? Nu, ŝajne kopias trinkejo, lia eniro, en c,
sed nur ĝis la longo de trinkejo.
Sed estas cimo tie.
Konsentite, tiel teknike ni vere faras strlen (stango) x sizeof (char), tio estas ĝusta.
Sed en la plej malbona kazo tie, ni supozu, ke that's - tiel, bone.
Tiam ekzistas 2 cimojn. Do sizeof (char), gravas, ni faros tiun iom pli larĝa.
Do nun ekzistas ankoraŭ cimon, kiu estas kiu?
[Studenta respondo, nekomprenebla] >> Kontroli kion? Konsentite, do ni devas kontroli
por NULL, ĉar malbonaj aĵoj okazas kiam via puntero estas NULL,
Ĉar vi povus fini tuj tie, kaj vi ne devus iam esti tuj nula
per dereferencing ĝin per la * operatoro.
Do tio estas bona, kaj kion ajn ni faras? Logike tie estas difekto tie ankaŭ.
[Studenta respondo, nekomprenebla]
>> Do kontrolu se argc ≥ 2?
Konsentite, do estas 3 erarojn en ĉi tiu programo tie.
Ni ne kontrolas, se la uzanto reale tajpitaj en nenio en argv [1], bona.
Do kio estas la tria cimo? Yeah?
[Studenta respondo, nekomprenebla] >> Bona.
Do ni kontrolis unu scenejo. Ni implice kontrolis ne kopii pli memoro
ol estus superi la longo de trinkejo.
Do se la ŝnuro al la uzanto tajpas en estas 10 signojn longa,
ĉi diras, 'Nur kopii 10 signojn.'
Kaj tio estas bone, sed kio se la uzanto tajpas en vorto ĉe la prompto
kiel 20 karaktero vorton; ĉi tio estas, dirante kopion 20 signojn el trinkejo en kio?
c, alie konata kiel nia buffer, kiu signifas simple skribis datumoj
al 8 bajto lokojn kiujn vi ne posedas,
kaj vi ne posedas ilin en la senco ke vi neniam destinis ilin.
Do ĉi tiu estas kion ĝenerale konata kiel la buffer overflow atako,
aŭ buffer invadita atako, kaj ĝi estas atako en la senco ke se la uzanto
aŭ la programo ke tio nomante vian funkcio faras ĉi malice,
kio efektive okazas sekva povus esti sufiĉe malbona.
>> Ni rigardu tiun bildon tie.
Tiu pentraĵo reprezentas vian pilo de memoro.
Kaj memoru, ke ĉiufoje kiam vi vokas funkcio,
vi ricevas tiun iom kadro sur la pilo kaj poste alia kaj poste alia kaj poste alia.
Kaj ĝis nun ni nur speco de abstraída tiuj for kiel rektanguloj
ĉu tie sur la tabulo aŭ en la ekrano tie.
Sed se ni zomi en unu el tiuj rektanguloj,
kiam vi nomas funkcio foo, rezultas ke estas pli sur la stako
ene de tiu kadro kaj ke rektangulo
ol nur x kaj y kaj a kaj b, kiel ni faris parolas interŝanĝa.
Rezultas, ke estas kelkaj suba nivelo detaloj,
inter ili revenos adreso.
Do rezultas kiam ĉefa nomas foo, ĉefa devas informi foo
kio ĉefa La adreso estas en la komputilo memoro.
Ĉar alie, kiam foo estas farita ekzekuti, kiel en ĉi tiu kazo ĉi tie,
kiam vi atingos ĉi tiu apude frizita streĉa fine de foo,
kiel la heck ne foo scias kie kontrolo de la programo supozas iri?
Rezultas ke la respondo al tiu demando estas en tiu ruĝa rektangulo ĉi tie.
Ĉi tio reprezentas pointer, kaj lin tuŝas al la komputilo por stoki, provizore,
en la tiel nomata stako la adreson de ĉefa tiel ke apenaŭ foo estas farita ekzekuti,
la komputilo scias kie kaj kio linio en ĉefa reiri al.
Savita kadro puntero raportu simile al ĉi tio.
Char * trinkejo tie reprezentas kio?
Nu, nun ĉi blua segmento jen foo la kadro, kio estas trinkejo?
Okay, do trinkejo estas nur la argumento al la foo funkcio.
>> Do nun ni estas ree en la konata pentraĵo.
Estas pli aĵoj kaj pli distroj en la ekrano
sed tiu lumo blua segmento estas kion ni estis desegni sur la chalkboard por iu kiel interŝanĝa.
Tio estas la kadro por foo kaj la sola afero en ĝi nun estas trinkejo,
kio estas ĉi tiu parametro.
Sed kio alia devus esti en la pilo, laŭ tiu kodo tie?
Char c [12]. Do ni devus vidi ankaŭ 12 kvadratoj de memoro,
asignitaj al variablo nomata c.
Kaj efektive ni ja havas ke sur la ekrano.
La plejsupro tie estas c [0], kaj tiam la aŭtoro de ĉi tiu diagramo
ne tedis desegnante ĉiuj kvadratoj sed estas ja 12 tie
ĉar se vi rigardas la fundo pravas, c [11], se vi rakontos de 0, estas la 12 tiaj bajtoj.
Sed jen la problemo: En kiu direkto estas c kreskanta?
Ia supro malsupren, ĉu ne? Se ĝi komenciĝas ĉe la supro kaj kreskas al la fundo,
ne aspektas kiel ni lasis nin multe ponteto tie tute ne.
Ni speco de pentris mem en angulon,
kaj ke c [11] estas rekte kontraŭ stango, kiu estas dekstre kontraux pilo kadro pointer,
kiu estas dekstre kontraux la reveno adreso; ne estas pli ĉambro.
Do kio estas la implikaĵo, tiam, se vi ŝraŭbo supren,
kaj vi provos legi 20 bitokoj en 12-bajton buffer?
Kie estas tiuj 8 pliaj bitokoj tuj iros?
Ene ĉio alia, iuj el kiuj estas super grava.
Kaj la plej grava afero, potenciale, estas la ruĝa skatolo tie, reveno adreso.
Ĉar supozas ke vi estas ĉu hazarde aŭ adversarially
anstatauxigas tiuj 4 bajtoj, kiuj puntero adreson,
ne nur kun rubo, sed kun numero kiu okazas reprezenti veran adreson en memoro?
Kio estas la implicaiton, logike?
[Studenta respondoj, nekomprenebla] >> Ekzakte. Kiam foo revenas
kaj hits kiu frizita streĉa, la programo tuj procedi ne reveni al ĉefa,
ĝi estas tuj revenos ajn adreso estas en tiu ruĝa skatolo.
>> Nun, en la kazo de circumventing programaro registriĝo,
kio estas la adreso ke tio esti denove estas la funkcio
kiu kutime prenas nomata vi pagis por la programaro kaj inputted vian enskribo-kodon?
Vi povus ordigi de lertaĵo la komputilo en ne tuj ĉi tie, sed anstataŭe, irante ĉi tien.
Aŭ, se vi estas vere lerta, kontraŭulo povas reale tajpi en la klavaro,
ekzemple, ne reala vorto, ne 20 signojn, sed supozas ke li aŭ ŝi
tipoj en iuj karakteroj kiuj reprezentas kodo?
Kaj ĝi ne tuj estos C kodon, ĝi tuj estos la karakteroj
kiuj reprezentas duuma maŝino kodoj, 0-aj kaj 1-oj.
Sed supozu ke ili estas sufiĉe lerta por fari tion, por iel almeti en la GetString prompto
iu kiu esence kompilita kodo,
kaj la lastaj 4 bitokoj anstatauxigas ke reveno adreson, kaj kion adreso ne ke enigo fari?
Stokas en ĉi ruĝa rektangulo la adreso de la unua bitoko de la buffer.
Do vi devas esti vere lerta, kaj ĉi tiu estas tre provo kaj eraro
por malbonaj homoj tie ekstere, sed se vi povas kalkuli kiom granda ĉi buffer estas,
tia, ke la lastaj bajtoj en la enigo kiun vi provizis al la programo
okazi al esti ekvivalento al la adreso de la komenco de via buffer,
vi povas fari ĉi tion. Se ni diras, kutime, saluton, kaj \ 0, tio estas kio finas en la buffer.
Sed se ni estas pli saĝa, kaj ni plenigos ke buffer kun kio ni genéricamente nomas atako kodo,
A, A, A, A: Attack, atako, atako, atako, kie ĉi tiu estas nur iu kiu faras ion malbonan.
Nu, kio okazas se vi estas vere lerta, vi povus fari tion:
En la ruĝaj skatolo tie estas vico de nombroj: 80, CO, 35, 08.
Rimarku ke, kiu kongruas kun la numero kiu estas ĉe tie.
Ĝi estas en inversa ordo, sed pli en tiu iu alia fojo.
Rimarku ke tiu redono adreso estis intence ŝanĝita
egali la adreso ĉi tien, ne la adreson de main.
Do se la malbona ulo is super inteligenta, li aŭ ŝi tuj inkluzivi en tiu atako kodo
iu kiel, 'Forigu ĉiujn uzanto-dosierojn.'
Aŭ 'Kopiu la pasvortoj,' aŭ 'Krei konton ke mi povas ensaluti.'
Ion ajn, kaj jen estas ambaŭ la danĝero kaj la potenco de C.
Ĉar vi havas aliron al la memoro tra punteros
kaj vi povas pro skribi ion vi volas en komputila memoro.
Vi povas fari komputilon fari ion vi volas simple per
esti ĝin salti ĉirkaŭ ene de lia propra memora spaco.
Kaj tiel, ĝis la nuna tago, tiel multaj programoj kaj tiom da retejoj kiuj interkonsentis
boli malsupren al homoj utiligante ĉi.
Kaj ĉi eble ŝajnas kiel super-kompleksa atako,
sed ne ĉiam komenci tiu vojo.
>> La realaĵo estas, ke kio malbona popolo tipe fari estas,
ĉu ĝi estas programo en komanda linio aŭ GUI programo aŭ retejo,
estas vi ĵus ekhavigi sensencaĵo.
Vi tajpas en vere granda vorto en la serĉo kampo kaj sukceson eniri,
kaj vi atendos por vidi, ĉu la retejo frakasas.
Aŭ vi atendos por vidi, ĉu la programo manifestiĝas iun eraron mesaĝo.
Ĉar se vi ricevas bonŝanca, ĉar la malbona ulo,
kaj vi provizis iom freneza enigo kiun frakasas la programo,
kiu signifas la programisto ne anticipis vian malbonan konduton
kio signifas ke vi povas probable, kun sufiĉe peno,
sufiĉa provo kaj eraro, manieron fari pli precizan atakon.
Do tiel parto de sekureco ne estas nur evitante tiujn atakojn en aro, sed detekti ilin
kaj fakte rigardas protokolojn kaj vidante kion freneza enigoj ke homoj tajpita en vian retejon.
Kio serĉo terminoj homoj tajpita en vian retejon kun la espero de superfluas iu bufro?
Kaj jen la tuta abscesoj sur la simpla bazojn de kio estas tabelo,
kaj kion ĝi signifas destini kaj uzi memoron?
Kaj rilate al tio, ankaŭ, estas tio.
>> Do ni nur rigardis interne de malmola disko ankoraŭ denove.
Do vi memoras de unu-du semajnoj antaŭe, ke kiam vi treni dosieroj
al viaj recicla bin aŭ rubo povas, kio okazas?
[Studenta] Nenio. >> Jes, absolute nenion. Eventuale se vi kuros malalta
sur durdisko, Windows aŭ Mac OS komencos forigi dosierojn por vi.
Sed se vi treni ion tie, tiam ĝi ne estas tute sekura.
Ĉiuj viaj roomate, amiko aŭ familiano devas fari estas duobla klaku, kaj voila.
Jen ĉiuj Sketchy dosierojn kiujn vi provis forviŝi.
Do la plimulto de ni almenaŭ scias, ke vi devas dekstre alklaku aŭ kontroli klaku
kaj malplenaj la rubo, aŭ io simila.
Sed eĉ tiam, ke ĝi ne sufiĉe trafus.
Ĉar kio okazas kiam vi havas dosieron en via malmola disko
kiu reprezentas iun vorton dokumenton aŭ iun JPEG?
Kaj ĉi tio reprezentas vian malmolan diskon, kaj diru ĉi Sliver tie reprezentas tiun dosieron,
kaj ĝi estas formita de tuta fasko de 0-aj kaj 1-oj.
Kio okazas kiam vi ne nur treni tiu dosiero al la rubujo aŭ recicla bin,
sed ankaŭ malplenigi ĝin?
Speco de nenio. Ne absolute nenio nun.
Nun estas nur nenio, ĉar iom io okazas en la formo de ĉi tiu tablo.
Do tie estas ia datumbazo aŭ tablo interne de komputilo la memoro
kiu esence havas 1 kolumnon por dosieroj nomoj,
kaj 1 kolumnon por dosiero situo, kie povas esti tiu situo 123, nur hazarda nombro.
Do ni povus havi ion kiel x.jpg, kaj situo 123.
Kaj kio okazas tiam, kiam vi malplenigi vian rubon?
Kiu iras for. Sed kion ne iras estas la 0-aj kaj 1-oj.
>> Do kio do la ligo al pset 4?
Nu, kun pset 4, nur ĉar ni hazarde viŝis
la kompakta flash karton kiu havis ĉiuj el tiuj fotoj,
aŭ simple ĉar per malbona sorto iĝis koruptita,
ne signifas ke la 0-aj kaj 1-oj ne estas ankoraŭ tie.
Eble kelkaj el ili estas perditaj pro io got koruptita
en la senco ke iuj 0 La igis 1-aj kaj 1-oj igis 0-aj jaroj.
Malbonaj aferoj povas okazi pro kalesxo programaro aŭ misa aparataro.
Tamen multaj el tiuj bitoj, eble eĉ 100% de ili estas ankoraŭ tie,
estas nur, ke la komputilo aŭ la ĉambro ne scias kie JPEG 1 Komencis
kaj kie JPEG 2 komenciĝis, sed se vi, la programisto,
scias, kun iom de savvy, kie tiuj JPEG-oj estas aŭ kion ili rigardas kiel,
vi povas analizi la 0-aj kaj 1-aj kaj diru: Ooh. JPEG. Ooh, JPEG.
Vi povas skribi programon kun esence nur por aŭ dum buklo
kiu rekuperas ĉiuj kaj ĉiu el tiuj dosieroj.
Do la lecionon tiam, estas por komenci "sekure" viŝante vian dosieroj
se vi volas eviti tiun aro. Jes?
[Studenta demando, nekomprenebla]
>> Ĉu pli memoro ol vi faris antaŭe -
Ho! Bona demando. Do kial do post malplenigante la rubo,
faras via komputilo diri al vi ke vi havas pli liberan spacon ol vi faris antaux?
En Simple dirata, ĉar ĝi mensogas. Pli teknike, vi ja havas pli da spaco.
Ĉar nun vi diris, vi povas meti aliajn aferojn kie tiu dosiero iam estis,
sed tio ne signifas la bitoj tuj,
kaj tio ne signifas la bitoj estas ŝanĝita ĉiujn 0 La, ekzemple, pro via protekto.
Kontraste, se vi "sekure" viŝi dosierojn, aŭ fizike ekstermi la mekanismo,
ke vere estas la ununura maniero, kelkfoje, ĉirkaŭ tiu.
Do kial ni ne lasos en tiu duon-timigas noto, kaj ni vidos vin lunde.
CS50.TV