[Powered by Google Translate] [LINGGONG 5]
[David J. Malan, Harvard University]
[Ito ay CS50.] [CS50.TV]
[Woman] Siya ang namamalagi; tungkol sa kung ano, hindi ko alam.
[Man] Kaya kung ano ang namin malaman?
[Woman] Na sa 9:15, Ray Santoya ay sa ATM.
[Man] Kaya ang tanong ay, kung ano ang siya sa 9:16?
[Woman] Shooting sa 9 mm sa isang bagay.
Siguro nakita niya ang mamamaril na nakatago.
[Man] O siya ay nagtatrabaho sa kanya.
[Woman] Maghintay. Bumalik isa.
[Man] Ano ang gagawin mong makita?
[♫ Suspenseful musika ♫]
[Woman] Dalhin kanyang mukha. Buong screen.
[Man] Kanyang baso. >> May sumasalamin.
[♫ Suspenseful musika ♫]
[Man] Iyon ay baseball team ang Nuevita. Na ang kanilang logo.
[Woman] At siya pakikipag-usap sa sinumang ang suot na jacket.
>> [David Malan] Kaya, ito ay CS50 linggo 5, at ngayon kami sanhi ng pagkapahamak ng bit ng telebisyon at pelikula para sa iyo.
Kaya sa tuwing ikaw ay nanonood ng isang palabas tulad ng isang ito dito,
at ang mga cops sabihin "Maaari ninyo bang linisin na?" o "Pagandahin,"
walang paghusayin sa tunay na mundo.
Sa katunayan, kung ano mo ba talagang makakuha ng isang maliit na bagay tulad nito.
Nakuha ko na isa ng ang mga larawan ng kawani mula sa pahina.
Ito ay isang programa na tinatawag na Photoshop. Ito ay 1 ng 2 Bowdens,
1 ng 3 Bowdens aktwal na, ngayon, dahil mayroon kaming Mrs Bowden dito pati na rin, may Rob at Paul.
Ngunit dito ay Rob sa screen, at kung namin ang pag-zoom in sa na sinag nagkaroon palagi niya sa kanyang mata,
kung ano ang iyong aktwal na makita na kung ano ang nakikita mo ay kung ano ang makakakuha ka.
Ito ay "pinahusay na," kaya "CSI" mayroon ito ng kaunti mali.
Mayroong isa pang clip, kung maaari naming pumili sa "CSI" lamang ng kaunti na.
Ito ay isang magaling na parirala sa tubos simula ngayon kung gusto mong
tunog teknikal sa iyong mga kaibigan kapag, talagang, ka sinasabi ganap na walang.
>> [Man] Para linggo ko na sinisiyasat ang taksista killer murders
na may isang tiyak na mapanglaw pagkabighani.
[Woman # 1] Ito ay sa real time.
[Woman # 2] ako lilikha ng isang GUI interface gamit ang Visual Basic, tingnan kung Maaari ko bang subaybayan ang isang IP address.
>> [Malan] Kaya audio ang ng sync bukod, paglikha ng isang GUI interface gamit ang Visual Basic
upang subaybayan ang isang IP address ay kumpleto katarantaduhan.
Mga araw na ito ay hindi mo gamitin ang Visual Basic,
walang pangangailangan para sa isang GUI, at IP address ay isang technically tumpak na termino.
Kaya abangan ang para sa mga ito, at isa ng aking mga paborito:
Ang isang ito ng kaunti pa arcane, dahil kailangan mong malaman ng ibang wika.
May isang wika na tinatawag na Layunin-C, na kung saan ay isang superset ng C.
Na nangangahulugan na ito ay C kasama ang ilang mga karagdagang tampok, kasama ng mga ito object-oriented programming.
At ito ay ang wika na Apple ay popularized para sa iOS programming.
At kaya narito ang isang clip mula sa isang iba't ibang mga palabas sa kabuuan, mula sa "Numero,"
na kung ang iyong aktwal na tingnang mabuti sa iyong TiVo at i-pause sa tamang sandali,
makikita mo na kung ano ang kanilang hinahanap sa ay hindi pa kung ano ang inilarawan.
At hayaan mo akong subukan ang isang iba't ibang audio connector dito at makita kung hindi namin maaari
panatilihin ang audio sa sync oras na ito.
Ako magbibigay sa iyo ng "Numero."
>> [Man # 1] Ito ay isang 32-bit na IPv4 address.
[Man # 2] IP, na Internet. >> Pribadong network. Pribadong network ng Anita.
[Malan] Okay. Ito ay Layunin-C, at ito ay para sa kulay programa ilang kid,
tulad ng maaari mong marahil magpakilala mula sa pangalan ng variable doon.
Kaya na, pagkatapos, ay "Numero." Kaya ngayon at sa linggong ito namin ipakilala
kaunti ng ang mga mundo ng mga forensics at konteksto sa mga problema sa samakatuwid.
Ngayon ay isang dinaglat na panayam dahil may isang espesyal na kaganapan sa dito
Pagkatapos, kaya ipapakita namin tumagal ng isang silip, at manunudyo parehong mga mag-aaral at mga magulang magkamukha ngayon
na may ilang ng mga bagay na sa abot-tanaw.
Kasama ng mga ito, bilang ng Lunes, mayroon ka ng ilang higit pang mga kaklase.
EdX, Harvard at MITs bagong online hakbangin para sa open courseware
at higit pa, ay paglunsad sa Harvard ng campus sa Lunes.
Na nangangahulugan ay Lunes ay mayroon ka - bilang ng huling count,
86,000 karagdagang mga kaklase ay sumusunod na kasama CS50 ng aralin
at seksyon at walkthroughs at problema sa set.
At bilang bahagi ng, ikaw ay maging miyembro ng pampasinaya klase ng
CS50 at ngayon CS50x.
>> Bilang bahagi ng, ngayon, mapagtanto na magkakaroon ilang mga upsides bilang.
Upang makakuha ng handa para sa, para sa napakalaking bilang ng mga mag-aaral,
sumapat ito sa sabihin na kahit na mayroon kaming 108 TFs at Cas,
hindi pa ang pinakamahusay na mag-aaral / guro ratio sa sandaling namin pindutin 80,000 iba pang mga mag-aaral.
Kaya hindi namin ay pagpunta sa grading maraming problema nagtatakda nang manu-mano.
Kaya ipinakilala linggo na ito sa hanay ng problema ay CS50 Check,
na kung saan ay isang command line utility sa loob ng appliance
na makakakuha ka ng isang beses mong i-update ang mga ito sa ibang pagkakataon ito weekend,
at magagawa mong upang magpatakbo ng isang command, i-check ang 50,
sa iyong sariling pset, at makikita mo makakuha ng ilang puna sa kung ang iyong programa ay
tama o maling ayon sa iba't-ibang mga pagtutukoy ng disenyo na ibinigay namin.
Kaya higit pa sa na at ang problema detalye ng hanay at
ang mga CS50x kaklase ay gamit na ito pati na rin.
>> Kaya problema set 4 ay ang lahat ng tungkol sa forensics.
At piraso na ito ay inspirasyon sa pamamagitan ng ilang mga real-buhay na mga bagay-bagay,
kung saan kapag ako ay sa graduate paaralan, interned ko para sa isang habang may
sa Middlesex County District Attorney ng Office paggawa ng forensic trabaho
sa kanilang mga lead na forensic imbestigador, at kung ano ito amounted sa
, tingin ko nabanggit ko ang nakaraan ng ilang linggo, ang Mass Estado pulis o iba
gagawin darating sa, sila drop off ang mga bagay tulad ng mga na hard drive at CD at tumbahin disk
at katulad, at pagkatapos ay ang layunin ng opisina ng mga forensics ay upang alamin kung
nagkaroon o ay hindi katibayan ng uri.
Ito sa Espesyal na Yunit ng Pagsisiyasat, kaya ito ay pantanggapan krimen,
ito ay mas troubling uri ng mga krimen,
anumang bagay na kinasasangkutan ng ilang mga uri ng mga digital na media; lumiliko na hindi na maraming tao
sumulat ng email na nagsasabing "ginawa ko ito."
Kaya medyo madalas mga forensics paghahanap ay hindi i-lahat na magkano prutas,
ngunit kung minsan mga tao ay sumulat ng mga naturang email.
Kaya minsan ang mga pagsusumikap ay gagantimpalaan.
>> Ngunit na humantong hanggang sa ito forensic pset, makikita namin nagpapakilala sa pset 4 isang bit ng graphics.
Kaya malamang na gawin ang mga bagay para sa ipinagkaloob, mga JPEG, GIF at ang mga tulad ng mga araw na ito,
ngunit kung sa tingin mo talagang tungkol dito, isang imahe, tulad ng mukha ng Rob,
ma-modelo bilang isang pagkakasunud-sunod ng mga tuldok, o pixels.
Ngayon, sa kaso ng Rob sa mukha, mayroong lahat ng mga uri ng mga kulay,
at nagsimula kaming upang makita ang mga indibidwal na tuldok, otherwide kilala bilang pixel,
sabay-sabay na sinimulan namin upang mag-zoom in.
Ngunit kung pasimplehin namin ang mundo ng kaunti, at sabihin lamang na ito dito ay Rob
sa itim at puti, na rin, upang kumatawan itim at puti namin lamang gamitin ang binary.
At kung kami ay pagpunta sa gamitin ang binary, 1 o 0, maaari naming ipahayag ang parehong imahe
ng nakangiting mukha Rob ang pattern na ito ng bit: 11000011 kumakatawan
puti, puti, itim, itim, itim, itim, puti puti.
At kaya ito ay hindi isang malaking hakbang, at pagkatapos, upang simulan ang pakikipag-usap tungkol sa makulay na litrato.
Mga bagay na nais mong makita sa Facebook o sa isang digital camera,
ngunit, tiyak, pagdating sa kulay, kailangan mo ng higit pang mga bit.
At medyo karaniwang sa mundo ng mga larawan ay gamitin hindi 1-bit na kulay,
bilang na ito ay nagmumungkahi, ngunit 24-bit na kulay, kung saan ang iyong aktwal na makakuha ng mga milyon-milyong mga kulay.
Kaya bilang sa kaso kapag kami naka-zoom in sa Rob mata,
na anumang bilang ng mga milyon-milyong ng iba't ibang makukulay na posibilidad.
>> Kaya naming ipakilala ito sa hanay ng problema 4 pati na rin sa walkthrough,
na ngayon sa 3:30 sa halip ng karaniwang 2:30 dahil sa Biyernes sa panayam dito.
Ngunit ang video ay online, gaya ng dati, bukas.
Din namin ipakilala sa iyo sa isa pang format ng file.
Kaya ito ay sadyang ginawa upang hitsura intimidating sa unang,
ngunit ito ay ilan lang dokumentasyon para sa isang C struct.
Ito lumiliko out na ang Microsoft, taon na ang nakakaraan, nakatulong sa magpabantog ang format na ito,
na tinatawag na ang bitmap file format, BMP, at ito ay isang napaka-simpleng,
makulay na graphical na format ng file na ginamit para sa pa ng ilang oras
at minsan pa rin para sa mga wallpaper sa desktop.
Kung sa tingin mo pabalik sa Windows XP at ang mga rolling burol at asul na kalangitan,
na ay karaniwang isang BMP, o bitmap imahe, at bitmaps
masaya para sa atin dahil mayroon sila ng kaunti pang pagiging kumplikado.
Ito ay hindi lubos na simple bilang ang grid na ito ng 0 at 1 ay;
sa halip, mayroon kang mga bagay tulad ng isang header sa simula ng isang file.
Kaya sa ibang salita, sa loob ng isang file na. Bmp ay isang buong grupo ng 0 at 1 ay,
ngunit may ilang karagdagang 0 at 1 doon.
At ito ay lumiliko out na ang malamang nagsagawa kami para sa ipinagkaloob para sa taon,
format ng file tulad ng. doc o. xls o. mp3 o. mp4,
anuman ang format ng file na hindi ka pamilyar sa.
Well, kung ano ang kahit ibig sabihin ay isang format ng file?
Dahil sa pagtatapos ng araw, ang lahat ng mga file na ito ginagamit namin ay may lamang 0 at 1
at siguro mga 0 at 1 kumakatawan a, b, c, sa pamamagitan ng ASCII o ang tulad ng,
ngunit sa pamamagitan ng pagtatapos ng araw, ito lang 0 at 1 ay.
>> Kaya mga tao lamang paminsan-minsan magpasya upang maglubid ng isang bagong format ng file
kung saan sila alisunod sa pamantayan kung ano ang talagang ibig sabihin ng mga pattern ng bits.
At sa kasong ito dito, ang mga tao na dinisenyo sa bitmap format ng file
sinabi na sa unang byte sa isang bitmap na file, tulad ng naitala sa pamamagitan ng offset 0, doon,
mayroong ilang cryptically na pinangalanang variable na tinatawag na bfType,
kung saan nakatayo lamang para sa bitmap uri ng file; kung anong uri ng bitmap file na ito ay.
Maaari mong magpakilala, marahil, mula sa pangalawang hilera na offset 2, byte numero 2,
may isang pattern ng 0 at 1 na kumakatawan sa kung ano ang?
Ang laki ng isang bagay, at ito ay pupunta sa mula doon.
Kaya sa problema set 4, makikita ka lumakad sa pamamagitan ng ilan sa mga bagay na ito.
>> Hindi namin magtatapos aalaga tungkol sa lahat ng mga ito, ngunit mapansin nagsisimula upang makakuha ng kawili-wiling
sa paligid ng linya o byte 54, rgbtBlue, Green at Red.
Kung sakaling iyong narinig ang acronym RGB, pula berde asul, ito ay isang reference na iyon.
Dahil ito ay lumiliko ang maaari mong ipinta ang lahat ng mga kulay ng bahaghari
may ilang mga kumbinasyon ng mga pula at bughaw at berde.
At, sa katunayan, ang mga magulang sa kuwarto ay maaaring isipin ang ilan sa pinakamaagang Projector.
Mga araw na ito, mo lamang makita ang 1 maliwanag na ilaw paparating ng lens.
Subalit bumalik sa araw, ay ang pulang lens, ang mga asul na lens, at ang berde lens
at kasama nila naglalayong sa screen at nabuo ang isang makulay na larawan.
At medyo madalas gitnang paaralan at mataas na paaralan ay may mga lens
kailanman-kaya-bahagyang nakatagilid, kaya ikaw ay ang uri ng makakita ng mga double o triple larawan,
ngunit ang ideya. Ikaw ay may pula at berde at bughaw na ilaw pagpipinta ng isang larawan.
At ang parehong prinsipyo ay ginagamit sa mga computer.
>> Kaya kabilang sa mga hamon, pagkatapos, para sa iyo sa problema magtakda ng 4
ang ilang mga bagay, ay isa sa aktwal na baguhin ang laki ng isang imahe.
Upang kumuha sa isang pattern ng 0 at 1 ay,
malaman kung aling chunks ng 0 at 1 ay kumakatawan sa kung ano ang sa isang istraktura tulad nito,
at pagkatapos malaman kung paano ginagaya ang mga pixels: pula, blues, sa paglalaro ng golf
sa loob nang sa gayon ay kapag ang isang larawan ay ganito ang hitsura simula, maaaring magmukhang ganito sa halip pagkatapos na.
Kabilang sa iba pang mga hamon,, na makikita mo ay ipinasa
forensic imahe ng isang aktwal na file mula sa isang digital camera
at sa camera na, sa sandaling unang panahon, ay isang buong grupo ng mga larawan.
Ang problema, hindi namin sinasadyang mabura o may larawan Nasira sa paanuman.
Masamang mangyayari sa mga digital camera, at kaya mabilis namin kinopya ang lahat ng 0 at 1
off ng card na iyon para sa iyo, naka-save na ang lahat ng ito sa 1 malaking file, at pagkatapos ay makikita namin ipasa ang mga ito sa iyo
sa problema ang 4 sa gayon na maaari mong magsulat ng isang programa sa C na upang mabawi
lahat ng mga JPEG na, perpektong.
At ito ay lumiliko out na mga JPEG, kahit na nasa medyo ng isang complex na format ng file,
sila magkano ang mas kumplikado kaysa ito nakangiting mukha dito.
Ito lumiliko out na bawat JPEG ay nagsisimula na may parehong pattern ng 0 at 1 ay.
Kaya gamit habang loop o para sa loop o katulad,
maaari mong umulit sa ibabaw ng lahat ng 0 at 1 sa forensic imahe
at sa bawat oras na makita mo ang espesyal na pattern na tinukoy sa detalye ng set ang problema,
maaari mong ipagpalagay, 'Oh, dito ay, na may napakataas na posibilidad,
ang simula ng isang JPEG, 'at sa lalong madaling mahanap ka ng parehong pattern,
ilang bilang ng mga bytes o kilobytes o megabytes sa ibang pagkakataon,
maaari mong ipagpalagay, 'Ooh! Narito ang isang pangalawang JPEG, ang mga larawan na kinuha ko pagkatapos ng unang.
Hayaan akong itigil ang pagbabasa na unang file, simulan ang pagsusulat ang bagong isa. '
At ang output ng iyong programa para pset 4 ay pagpunta sa bilang maraming bilang 50 mga JPEG.
At kung hindi ito 50 mga JPEG, mayroon kang isang bit ng isang loop.
Kung mayroon ka ng isang walang-katapusang bilang ng mga JPEG, mayroon ka ng isang walang-katapusang loop.
Kaya na,, ay lubos na isang karaniwang kaso.
Iyon ay kung ano ang sa abot-tanaw.
>> Pagsusulit 0, sa likod sa amin. Napagtanto, bawat aking email, na walang paltos may mga tao
na parehong masaya, uri ng neutral, at malungkot sa paligid pagsusulit 0 oras.
At mangyaring huwag makipag-ugnay sa akin, ang mga TFs sa ulo, Zamyla, ang iyong sariling tf
o isa ng Cas na alam mo kung nais mong upang talakayin kung paano ang mga bagay nagpunta.
>> Kaya sa mapabilib ang mga magulang dito sa kuwarto,
ano ang CS50 library? Magandang trabaho.
Ano ang CS50 library? Oo? [Estudyante sagot, hindi maintindihan]
>> Okay, mabuti. Kaya ito isang prewritten na hanay ng mga code namin, ang kawani, sumulat si,
na ibinigay namin sa iyo, upang magbigay ng ilang mga karaniwang pag-andar.
Bagay-bagay na bang makakuha ako ng isang string; makakuha ako ng isang int, ang lahat ng mga pagpapaandar na nakalista dito.
Simula ngayon, sisimulan namin talagang gawin ang mga gulong ng pagsasanay.
Kaya kami ay pagpunta sa magsimula sa tumagal ang layo ng "string" mula sa iyo,
kung saan, manariwa sa diwa, ay isang kasingkahulugan lamang para sa kung ano ang aktwal na mga uri ng data? magpasinda *.
Kaya para sa mga magulang, na marahil - na magandang, kaya magpasinda * magpapadala kami magsimulang makita ang
sa screen ang lahat ng higit pa namin alisin ang "string" mula sa aming bokabularyo,
hindi bababa sa pagdating sa aktwal na pagsusulat code.
Gayundin, ititigil namin gamit ang ilan sa mga function ng mas maraming,
dahil ang aming mga programa ay pagpunta upang makakuha ng mas sopistikadong
kaysa magsulat lamang ng mga programa na umupo doon na may isang prompt kumikislap,
naghihintay para sa user i-type ng isang bagay.
Makakakuha ka ng iyong mga input mula sa ibang lugar.
Halimbawa, makakakuha ka ng mga ito mula sa isang serye ng mga bits sa lokal na hard drive.
Sa halip makakuha ng mga ito sa hinaharap mula sa isang koneksyon ng network, ang ilang mga website sa isang lugar.
Kaya sabihin alisan ng balat pabalik ang layer na ito para sa unang pagkakataon, at makuha ang CS50 appliance
at ang file na ito na tinatawag na CS50.h, kung saan mo ang matalim kabilang ang para sa linggo.
>> Ngunit ipaalam sa aktwal na makita kung ano ang sa loob ng mga ito.
Kaya ang tuktok ng file sa asul ay lamang ng buong bungkos ng mga komento,
warranty impormasyon at paglilisensya. Ito ay uri ng karaniwang paradaym
sa software, dahil ng maraming ng software mga araw na ito ay kung ano ang tinatawag na "open source",
na nangangahulugan na may nakasulat na code
at ginawa ito malayang magagamit, hindi lamang upang mapatakbo at upang gamitin,
pero sa totoo ay basahin at baguhin at isama sa iyong sariling.
Kaya na kung ano na ginagamit mo, open source software,
kahit na sa napakaliit na paraan.
Kung mag-scroll ko pababa nakaraan ng mga komento, bagaman, makikita namin simulan upang makita ang ilang mga mas pamilyar na mga bagay.
Kaya mapapansin sa tuktok dito, na ang CS50.h file ay nagsasama ng isang buong grupo ng mga file ng header.
Ngayon, karamihan sa mga ito hindi namin nakita bago, ngunit ang isa ay
pamilyar, kung alin sa mga ito namin nakikita, kahit na sa maikling, kaya sa ngayon?
Oo, standard na mga aklatan. Stdlib.h may malloc,
kaya sabay-sabay na sinimulan namin ang pakikipag-usap tungkol sa dynamic memory paglalaan,
na gagamitin namin bumalik sa susunod na linggo pati na rin, na sinimulan namin kasama ang file na iyon.
Ito lumiliko ang bool at tunay at huwad na hindi aktwal na umiiral sa C, per se,
maliban kung isama mo ang file na ito dito.
Kaya't hindi kami, para sa mga linggo, na kabilang ang standard bool.h
sa gayon ay maaari mong gamitin ang paniwala ng bool, true o false.
Wala ang, gusto mo upang pag-uri-uriin ng mga pekeng ito at gamitin ang isang int
at mang ipinapalagay na ang 0 ay mali at 1 ay totoo.
>> Ngayon, kung namin mag-scroll pababa sa karagdagang, narito ang aming kahulugan ng isang string.
Ito lumiliko out, bilang namin ang sinabi bago, na kung saan ito ay ang * ay hindi talagang mahalaga.
Maaari ka ring magkaroon ng espasyo sa buong.
Namin, ang semestre na ito, ay nagpo-promote ang mga ito bilang ito upang gumawa ng malinaw na ang * ay may sa gawin sa ang uri.
Ngunit Napagtanto, tulad ng karaniwan, kung hindi isang maliit na mas karaniwang, ay ilagay ang mga ito doon
ngunit pagtakbo nito ang parehong bagay.
Ngunit ngayon, kung basahin namin ang karagdagang, sabihin tingnan sa halimbawa, GetInt,
dahil ginamit namin na, marahil, bago ang anumang bagay na ito semestre.
At dito ay GetInt. Ito ay kung ano ang?
Ito ay ang prototype. Kaya madalas, namin ilagay modelo sa tops ng aming c file,
ngunit maaari mo ring ilagay ang mga modelo sa header file,. h file,
tulad ng isang ito dito, kaya na kapag sumulat kang ilang mga function
na nais mong iba pang mga tao magagawang gamitin, na eksakto ang kaso may CS50 library,
hindi lamang ipatupad ang iyong mga function sa isang bagay tulad ng CS50.c,
mo ring ilagay ang modelo hindi sa tuktok ng file na iyon, ngunit sa tuktok ng isang file ng header,
pagkatapos ang file na header ano ang mga kaibigan at kasamahan ang,
may matulis isama sa kanilang sariling mga code.
Kaya lahat oras na ito na kabilang ang lahat ng mga modelo
epektibo sa tuktok ng iyong mga file, ngunit sa pamamagitan ng paraan ng ito matalim ang mekanismo
na mahalagang mga kopya at pastes ang file na ito sa iyong sariling.
Ngayon, narito ang ilang medyo detalyadong dokumentasyon.
>> Namin na medyo mas kinuha para sa ipinagkaloob na GetInt nakakakuha ng isang int,
ngunit ito lumiliko out ang ilang sulok kaso, i-right?
Paano kung ang mga uri ng user sa isang numero na paraan masyadong malaki?
Isang quintillion, na lamang ay hindi maaaring magkasya sa loob ng isang int?
Ano ang inaasahang pag-uugali? Well, may perpektong, predictable.
Kaya sa kasong ito, kung aktwal mong basahin ang fine na naka-print,
makikita mo na kung linya ay hindi maaaring basahin, ito INT_MAX babalik.
Hindi kailanman na-uusapang namin tungkol dito, ngunit batay sa capitalization,
ano ito, marahil?
Ito ay isang pare-pareho, kaya ang ilang espesyal na pare-pareho na marahil ipinahayag
sa isa sa mga file ng header na hanggang mas mataas sa file,
at INT_MAX ay marahil isang bagay tulad ng, halos, 2 bilyong.
Ang ideya sa pagiging na dahil kailangan namin sa paanuman magpahiwatig na may isang bagay nangyaring mali,
namin, oo, 4 bilyong numero sa aming pagtatapon,
negatibong 2 bilyong sa hanggang sa 2 bilyong, bigyan o.
Well, kung ano ang karaniwan sa programming nakawin mo lang ang isa sa mga numero.
Siguro 0, siguro 2 bilyong, maaaring negatibong 2 bilyong.
Kaya ang gagastusin mo ang isa sa iyong mga posibleng halaga upang maaari kang mangako sa mundo
na kung ang isang bagay napupunta mali, ako ay ibalik ito sobrang-malaking halaga.
Ngunit hindi mo nais na ng user ang pag-type ng misteriyoso tulad ng "2, 3, 4 ..."
talagang malaking bilang, kung saan ka ng tuntuning panlahat sa halip bilang isang pare-pareho.
Kaya talaga, kung ikaw ay pagiging anal sa nakalipas na ilang linggo,
anumang oras tumawag ka GetInt, dapat mong na-check na may isang kung kondisyon.
Ba ang uri ng user sa INT_MAX, o higit na partikular,
ginawa GetInt return INT_MAX? Dahil kung ito ay ginawa,
na aktwal na nangangahulugan na hindi nila type ito; may nangyaring mali sa kasong ito.
Kaya ito ay kung ano ang karaniwang kilala bilang isang halaga ng "bantay", kung saan ay nangangahulugan lamang espesyal.
>> Well, sabihin na ngayong i-in sa. File c.
Ang C file ay umiiral sa appliance para sa ilang oras,
at, sa katunayan, appliance ay may itong precompiled para sa iyo
sa na bagay na namin na tinatawag na "code ng bagay,"
ngunit ito lamang ay hindi mahalaga sa iyo kung saan ito ay dahil alam ng system ang,
sa kasong ito, kung saan ito ay, ang appliance.
Ngunit sabihin mag-scroll pababa ngayon upang GetInt, at makita kung paano GetInt ay nagtatrabaho lahat oras na ito.
Kaya dito mayroon kami ng mga katulad na mga komento mula sa bago.
Hayaan akong mag-zoom in sa lamang ang bahagi code,
at kung ano ang mayroon kami para sa GetInt ay ang mga sumusunod.
Ito ay tumatagal ng walang input at ito ay nagbabalik ng isang int, habang (tama), kaya kami ay may isang sinadya na walang-katapusang loop
pero, siguro, makikita namin masira ng ito sa paanuman, o bumalik mula sa loob ng.
Kaya sabihin makita kung paano ito gumagana. Well, mukhang namin na ang paggamit ng GetString
sa unang linya sa loob ng loop, 166.
Ito ay mahusay na kasanayan na ngayon dahil sa ilalim kung ano pangyayari
maaaring GetString ibalik ang espesyal na keyword, null?
Kung ang isang bagay napupunta mali. Ano ang maaaring pumunta mali kapag tumawag ka ng isang bagay tulad ng GetString?
Oo? [Estudyante sagot, hindi maintindihan] >> Oo. Kaya marahil malloc nabigo.
Sa isang lugar sa ilalim ng hood ng GetString ay pagtawag malloc,
na allocates memorya, na kung saan ay nagbibigay-daan sa computer store
lahat ng ang mga character na gumagamit ng mga uri sa keyboard.
At ipagpalagay ang user ay may isang buong maraming libreng oras
at nai-type nang higit pa, halimbawa, kaysa sa 2 bilyong mga character.
Higit pang mga character kaysa sa computer kahit may RAM.
Well, GetString upang magpahiwatig na ang sa iyo,
kahit na ito ay isang napakabilis, sobrang bihira na sulok ng kaso.
Ito ay sa paanuman magagawang upang mahawakan ito, at kaya GetString,
kung namin bumalik at basahin ang mga dokumentasyon, ay, sa katunayan, bumalik null.
Ngayon kung ang GetString nabigo sa pamamagitan ng pagbalik null, GetInt ay pagpunta sa mabibigo
sa pamamagitan ng pagbalik INT_MAX, bilang isang tanod.
Ito ang lang tao convention. Ang tanging paraan na nais mong malaman na ito ay ang kaso
sa pamamagitan ng pagbabasa ang dokumentasyon.
Kaya sabihin mag-scroll pababa sa kung saan ang int ay talagang GotInt.
>> Kaya kung mag-scroll ko ng kaunti pa, sa line 170 namin ng komento sa itaas mga linya.
Kaya ipinapahayag namin, sa 172, isang int n at magpasinda c, at pagkatapos ay ang bagong function na
kung saan ang ilan sa inyo ay stumbled sa buong bago, ngunit sscanf.
Ito ay nakatayo para sa string-scan ng f.
Sa ibang salita, bigyan ako ng string at ko i-scan ang mga ito para sa mga piraso ng impormasyon ng interes.
Kaya kung ano ang na ibig sabihin nito? Well, ipagpalagay na type ko sa, literal, 1 2 3 sa keyboard,
at pagkatapos ay pindutin ang enter. Ano ang data uri ng 1 2 3 kapag ibinalik ng GetString?
Ito ay malinaw naman isang string, i-right? Nakatanggap ako ng string, kaya 1 2 3 talaga "1 2 3"
gamit ang \ 0 sa pagtatapos nito. Na ay hindi isang int.
Iyon ay hindi isang numero. Mukhang isang numero ngunit ito ay hindi tunay na.
Kaya kung ano ang GetInt gawin? Upang i-scan na string kaliwa papuntang kanan,
1 2 3 \ 0, at sa paanuman convert ito sa isang aktwal na integer.
Ngayon, maaari mong malaman kung paano gawin ito.
Kung sa tingin mo pabalik sa pset 2, baka nakuha ng kaunti kumportableng
may Caesar o vigenere upang maaari mong umulit sa loob ng isang string,
maaari mong i-convert ng mga karakter sa mga ints may pick. Na ang isang buong maraming trabaho.
Bakit hindi tumawag sa isang function tulad sscanf na ginagawa na para sa iyo?
Kaya sscanf Inaasahan ng isang argument, sa kasong ito na tinatawag na linya, na isang string.
Pagkatapos mong tukuyin, sa mga panipi, na halos kapareho sa printf,
ano ang gagawin mong asahan na makita sa ang string na ito?
Ano ako sinasabi dito ay, inaasahan ko upang makita ang isang decimal na numero at maaaring isang character.
At kami na makita kung bakit ito ang kaso sa sandali lamang.
Ito lumiliko out na ang pagtatanda na ito ay nakapagpapaalaala na ngayon ng mga bagay-bagay
na sinimulan namin ang pakikipag-usap tungkol sa higit lamang sa isang linggo ang nakalipas.
>> Ano ang & n at & c na ginagawa para sa amin dito? [Estudyante sagot, hindi maintindihan]
>> Oo. Ito ay nagbibigay sa akin ang address ng n at address ng c.
Ngayon, kung bakit ay na mahalaga? Well, alam mo na may mga function sa C
maaari mong laging nagbabalik ng halaga o walang halaga sa lahat.
Maaari mong ibalik ang isang int, isang string, Float, pansamantalang trabaho, anumang.
O maaari kang bumalik walang bisa, ngunit maaari mo lamang ibalik 1 bagay maximally.
Ngunit dito gusto naming sscanf upang bumalik sa akin siguro isang int, decimal na numero,
at ding pansamantalang trabaho, at Ipapaliwanag ko kung bakit pansamantalang trabaho sa isang sandali.
Kaya gusto mabisa mong f bumalik 2 bagay; na lang hindi posible sa C.
Kaya maaari kang gumawa sa paligid na sa pamamagitan ng pagpasa sa 2 na address,
dahil sa lalong madaling ipasa ang isang function 2 address, ano ang function na sa kanila?
Maaari itong sumulat sa mga address na iyon. Maaari mong gamitin ang * pagpapatakbo at "pumunta doon" sa bawat isa sa mga address na iyon.
Ito ay uri ng backdoor mekanismo na ito, ngunit karaniwan para sa pagbabago sa mga halaga ng variable
sa higit pa kaysa sa 1 lugar lamang, sa kasong ito 2.
Ngayon, mapapansin Lalabas na ako para sa == to1, at pagkatapos ay bumabalik n kung iyon ay, sa katunayan, evaluate sa true.
Kaya kung ano ang nangyayari sa? Well, technically, lahat talaga namin nais na mangyayari sa GetInt ito.
Gusto naming upang i-parse, kaya na magsalita, gusto naming basahin ang string
"1 2 3" at kung mukhang may bilang doon,
kung ano ang namin ang nagsasabi sa sscanf gawin ay ilagay na numero, 1 2 3, sa ang variable n para sa akin.
Bakit, pagkatapos, ginawa ko ito pati na rin?
Ano ang papel na ginagampanan ng din sinasabi, sscanf, maaari ka ring makakuha ng isang character dito.
[Nagsasalita ng Mag-aaral, hindi maintindihan] >> Hindi - ng decimal point ay maaaring gumana.
Natin pindutin nang matagal na naisip para sa isang sandali. Ano pa?
[Mag-aaral, hindi maintindihan] >> Kaya, mabuting pag-iisip, maaaring maging null karakter.
Ang aktwal na hindi, sa kasong ito. Oo? [Estudyante, hindi maintindihan]
>> >> ASCII. O, hayaan mo akong magbigay ng tuntuning panlahat kahit karagdagang.
Ang% c may lamang para sa error checking.
Hindi namin nais na character pagkatapos ang numero,
ngunit kung ano ang na ito ay nagbibigay-daan sa akin upang gawin ay ang mga sumusunod:
Ito lumiliko out na sscanf, bukod sa pag-iimbak ng mga halaga sa n at c, sa halimbawang ito dito,
kung ano ito din ay nagbabalik ang bilang ng mga variable ilagay ito ng mga halaga.
Kaya kung nag-type lamang sa 1 2 3, pagkatapos lamang ang% d upang tumugma sa
at lamang n ay makakakuha ng naka-imbak na may halaga tulad ng 1 2 3 at walang maipo ilagay sa c;
c nananatiling halaga ng basura, kaya na magsalita.
Basura dahil hindi ito ay nasimulan dahil ang ilang mga halaga.
Kaya sa kasong iyon, sscanf nagbabalik 1, dahil populated ko isa ng mga payo,
kung saan, mahusay. Mayroon akong isang int, kaya magbakante ko ang linya upang magbakante ang memorya
na GetString aktwal na inilaan, at pagkatapos ay bumalik ako n.
Tao, kung ikaw ba kung saan na subukan muli pahayag ay mula, ay mula dito mismo.
Kung, sa pamamagitan ng kaibahan, ang type ko sa 1 2 3 foo,
ilang mga random na pagkakasunod-sunod ng mga teksto, sscanf upang makita,
ooh, numero, ooh, ang bilang, ooh, ang bilang, ooh - f.
At ito upang ilagay ang 1 2 3 sa n.
Ito ay pagpunta sa ilagay ang f sa c, at pagkatapos ay bumalik 2.
Kaya mayroon kami, lamang gamit ang pangunahing kahulugan ng pag-uugali scanf ng,
isang napaka-simpleng paraan - na rin, complex sa unang tingin, ngunit sa pagtatapos ng araw,
medyo simpleng mekanismo ng pagsabi, mayroong isang int, at kung gayon, ay ang tanging bagay na nakita ko?
At puting espasyo dito ay sinadya. Kung ikaw basahin ang dokumentasyon para sa sscanf,
ito ay nagsasabi sa iyo na kung isasama mo ang isang piraso ng puting espasyo sa simula o sa katapusan,
masyadong ay payagan sscanf user, para sa anumang dahilan, pindutin ang spacebar 1 2 3, at na lehitimong.
Hindi ito sumigaw sa user dahil lamang sila pindutin ang spacebar sa simula o sa katapusan,
na sandali lang mas user-friendly.
>> Anumang mga katanungan, pagkatapos, sa mga GetInts? Oo?
[Estudyante tanong, hindi maintindihan]
>> Magandang katanungan. Ano ang kung ikaw-type sa isang pansamantalang trabaho, tulad ng f, at pindutin ang ipasok
nang hindi mag-type 1 2 3; kung ano sa tingin mo ang pag-uugali ng ang linya ng code pagkatapos?
Kaya maaaring masaklawan ng sscanf na masyadong, dahil sa kasong iyon,
hindi ito upang punan n o c; ito sa halip na bumalik 0.
Kung saan, din ako pansing sitwasyong iyon, dahil ang inaasahang halaga na gusto kong ay 1.
Gusto ko lang 1, at 1 bagay lamang na puno. Magandang tanong. Iba?
>> Lahat ng karapatan, kaya ipaalam sa ay hindi pumunta sa pamamagitan ng lahat ng mga function in dito,
ngunit ang isa na mukhang, marahil, ng natitirang interes
ay GetString dahil ito lumiliko out na GetFloat, GetInt,
GetDouble, GetLongLong lahat ng tumikin ng maraming ng kanilang mga pag-andar sa GetString.
Kaya sabihin kumuha ng isang pagtingin sa kung paano siya ay ipinatupad dito.
Ang hitsura ng kaunti complex ngunit ginagamit nito ang parehong batayan
namin na sinimulan ng pakikipag-usap tungkol sa huling linggo. Kaya sa GetString,
na walang argumento bilang bawat ang walang bisa hanggang dito,
at nagbabalik ng isang string; kaya ako deklarasyon ng isang string na tinatawag na buffer.
Hindi ko talaga alam ano ang pagpunta sa ginagamit para sa pa, ngunit gagamitin namin makita.
Hitsura tulad ng kapasidad, sa pamamagitan ng default, 0; hindi pa sigurado kung saan ito ay pagpunta.
Hindi sigurado kung ano n nangyayari na ginagamit para sa pang.
Ngunit ngayon ito pagkuha ng kaunti pa sa kawili-wili, kaya sa line 243,
idedeklara namin ang isang int c, ito ay uri ng bobo detalye.
Pansamantalang trabaho ay 8 bit, at 8 bits ay maaaring iimbak sa kung gaano karaming iba't ibang mga halaga?
256. Ang problema, kung gusto mong magkaroon ng 256 iba't ibang mga character na ASCII,
kung saan mayroong, kung sa tingin mo bumalik, at ito ay hindi isang bagay na kabisaduhin.
Ngunit kung sa tingin mo na malaki ASCII chart nagkaroon kami linggo ang nakalipas,
mayroong, sa kasong iyon, 128 o 256 mga character na ASCII.
Ginamit namin ang lahat ng mga pattern ng 0 at 1 ang bahala.
Na ang isang problema kung nais mo upang makita ang isang error.
Dahil kung gumagamit ka na ng 256 halaga para sa iyong mga character,
hindi mo talaga magplano magpatuloy, dahil ngayon mayroon kang walang paraan ng pagsabi,
"Ito ay hindi isang legit karakter, ito ay ilang maling mensahe."
Kaya kung ano ang mundo ang ginagawa, ginagamit nila ang susunod na pinakamalaking halaga,
isang bagay tulad ng isang int sa gayon ay mayroon kang mabaliw bilang ng mga bits,
32 para sa 4 bilyong posibleng halaga, sa gayon ay maaari mo lamang magtapos up gamit,
mahalagang, 257 sa kanila, 1 ng kung saan ay may ilang mga espesyal na kahulugan bilang isang error.
>> Kaya sabihin makita kung paano ito gumagana. Sa linya 246, mayroon akong ito malaki habang loop
na pagtawag fgetc; file ng kahulugan ng f, getc, at pagkatapos stdin.
Lumiliko lamang ito sa mas tumpak na paraan ng nagsasabing "basahin ang input mula sa keyboard."
Standard keyboard input paraan, ang ibig sabihin ng standard output screen,
at standard na error, na gagamitin namin makita sa pset 4, ay nangangahulugan na ang screen,
ngunit ang isang espesyal na bahagi ng screen upang hindi ito conflated
na may aktwal na output na nilayon mo upang i-print; ngunit higit pa sa na sa hinaharap.
Kaya fgetc lamang nangangahulugan basahin ang isang character mula sa keyboard, at mag-imbak ang mga ito kung saan?
Iimbak ito sa c, at pagkatapos suriin, kaya lang ako sa paggamit ng ilang boolean conjunctions dito,
suriin na ito ay hindi katumbas ng \ n, kaya ang gumagamit ay pindutin ang enter.
Gusto naming ihinto sa puntong iyon, dulo ng loop, at gusto rin naming mag-check
para sa espesyal na pare-pareho, EOF, na kung alam mo o hulaan - ano ang tumayo para sa?
Pagtatapos ng file. Kaya ito ay uri ng walang saysay, dahil kung nagta-type ako sa keyboard,
may talagang walang file na kasangkot sa,
ngunit ito ay lamang ayusin ng generic na termino na ginagamit sa ibig sabihin
na walang ibang darating mula sa mga daliri ang tao. EOF. Pagtatapos ng file.
Bilang isang bukod, kung sakaling mo na pindutin ang control d sa iyong keyboard,
hindi na mayroon ka pa; mo na pindutin ang control c.
Ngunit ang control d nagpapadala ito ng espesyal na pare-pareho na tinatawag na EOF.
>> Kaya ngayon namin lamang magkaroon ng ilang dynamic na paglalaan ng memorya.
Kaya kung n + 1> kapasidad, ngayon kukunin ko na ipaliwanag n.
n ay lamang kung gaano karaming mga byte ay kasalukuyang sa buffer,
ang string na kasalukuyan mong pagbuo mula sa user.
Kung mayroon kang higit pang mga character sa iyong buffer kaysa sa mayroon kang kapasidad sa buffer,
intuitively, kung ano ang kailangan namin upang gawin pagkatapos ay magtalaga ng karagdagang kapasidad.
Pupunta ako sa sagap sa paglipas ng ilang ng aritmetika dito
at tumutok lamang sa function na ito dito.
Alam mo kung ano ang malloc, o hindi bababa sa pangkalahatan pamilyar.
Kumuha ng hula kung ano ang realloc ginagawa. [Estudyante sagot, hindi maintindihan]
>> Oo. At hindi ito lubos pagdaragdag ng memorya; ito reallocates memory tulad ng sumusunod:
Kung mayroon pa rin room sa dulo ng string upang bigyan ka ng higit pa sa na memorya
kaysa sa orihinal na ito ay nagbibigay sa iyo, pagkatapos ay makakakuha ka na ng karagdagang memorya.
Sa gayon ay maaari mo lamang paglalagay ng ang mga character na string pabalik upang i-back i-back upang i-back.
Ngunit kung hindi iyon ang kaso, dahil naghintay ka masyadong mahaba
at isang bagay random nakuha plopped sa memory doon, ngunit may dagdag na
memory pababa dito, na okay lang. Realloc ay pagpunta sa gawin ang lahat ng mga mabibigat na nakakataas para sa iyo,
ilipat ang string na nabasa mo na sa samakatuwid ay malayo mula dito,
ilagay ito doon, at pagkatapos ay magbibigay sa iyo ng ilang higit pang mga paliparan sa puntong iyon.
Kaya may isang wave ng kamay, sabihin sabihin sa akin na ang GetString ay ginagawa
ito na nagsisimula sa isang maliit na buffer, siguro 1 single character,
at kung ang user ay uri sa 2 character, GetString nagtatapos up
pagtawag realloc at sabi, 'Ooh, 1 na character ay hindi sapat.
Bigyan mo ako 2 character. ' Pagkatapos kung mong basahin sa pamamagitan ng logic ng loop,
ito upang sabihin, 'Ooh, ang mga gumagamit na nai-type sa 3 mga character.
Bigyan mo ako ngayon hindi 2 ngunit 4 na mga character, at pagkatapos ay bigyan ako 8, pagkatapos ninyo ako 16 at 32. '
Ang katotohanan na ako pagdodoble ang kapasidad sa bawat oras
ay nangangahulugan na ang buffer ang hindi pagpunta sa palaguin mabagal.
Ito ay upang mapalago ang napakabilis na, at kung ano ang maaaring ang bentahe ng na?
Bakit ako pagdodoble ang laki ng buffer, kahit na ang user
maaaring kailangan lang 1 dagdag na character mula sa keyboard?
[Estudyante sagot, hindi maintindihan]. >> Ano iyan?
Eksakto. Hindi mo binabalak na palaguin ang mga ito nang madalas.
At ito lamang ang uri ng - you're hedging dito ang iyong mga taya.
Ideya pagiging na hindi mo nais na tawagan realloc ng maraming, dahil ito ay may gawi na maging mabagal ang.
Anumang oras na hinihiling mo sa operating system memory, tulad ng makikita mo sa lalong madaling panahon makita
sa isang hinaharap na hanay ng problema, may kaugaliang upang tumagal ng ilang oras.
Kaya pagliit na halaga ng oras, kahit na kung ikaw ay aksaya ng ilang espasyo, may kaugaliang upang maging isang magandang bagay.
>> Ngunit kung namin basahin sa pamamagitan ng huling bahagi ng GetString dito,
at muli, unawa bawat solong linya dito ay hindi kaya mahalaga ngayon.
Ngunit mapansin na ito kalaunan tawag malloc muli, at allocates
nang eksakto tulad ng maraming mga byte bilang kailangan nito para sa string
at pagkatapos throws ang layo sa pamamagitan ng pagtawag sa libreng, ang labis na malaking buffer,
kung ito ay sa katunayan Nakakuha Dinoble masyadong maraming beses.
Sa maikling, na kung paano GetString ay nagtatrabaho lahat oras na ito.
Lahat ng ito ginagawa ay basahin ang isang character sa isang pagkakataon muli at muli at muli
at sa bawat oras na ito ay nangangailangan ng ilang karagdagang memorya, nagtatanong ang operating system ito sa pamamagitan ng pagtawag sa realloc.
Anumang mga katanungan? Ayos lang.
>> Isang atake. Ngayon na naiintindihan namin payo, o hindi bababa sa
nagiging pamilyar sa mga payo,
sabihin isaalang-alang kung paano ang buong mundo ay nagsimulang upang tiklupin
kung hindi mo pa masyadong ipagtanggol laban adversarial mga gumagamit,
mga taong sinusubukang i-Hack sa iyong system.
Mga tao na sinusubukang nakawin ang iyong software sa pamamagitan ng circumventing ilang pagpaparehistro code
na maaaring sila kung hindi man ay i-type in.
Tingnan sa halimbawang ito dito, na lamang ang C code
na may isang function na pangunahing sa ibaba, na tawag ng isang function foo,
at kung ano ang pagpasa sa foo? [Mag-aaral] Ang isang argumento.
>> Single argumento. Kaya argv [1], na nangangahulugan na ang unang salita ang nai-type ng user
sa linya ng command pagkatapos a.out o anumang programa ay tinatawag na.
Kaya foo, sa tuktok, tumatagal sa isang pansamantalang trabaho *, ngunit magpasinda * kung ano?
String. Wala bagong dito, at mang na tinatawag na ang string na bar.
Ang line dito, magpasinda c [12], sa uri ng semi-teknikal Ingles, ano ang linya na ito ginagawa?
Array ng -? Character. Bigyan mo ako ng isang hanay ng mga 12 character.
Kaya maaari naming tumawag ito ng buffer. Ito ang technically tinatawag c, ngunit isang buffer sa programming
lamang ay nangangahulugan ng grupo ng mga puwang na maaari mong ilagay ang ilang mga bagay-bagay.
>> Pagkatapos bilang wakas, memcpy, hindi kami ginagamit bago.
Ngunit maaari mong malamang na hulaan kung ano ang ginagawa nito. Ito kinokopya sa memory.
Ano ang gagawin? Well, tila ito kinokopya bar, input nito, sa c,
ngunit lamang hanggang sa haba ng bar.
Ngunit mayroong isang bug dito.
Okay, kaya technically dapat naming talagang gawin strlen (bar) x sizeof (pansamantalang trabaho), na tama.
Ngunit sa ang pinakamasama kaso dito, sabihin ipinapalagay na that's - ito, okay.
Pagkatapos may 2 bug. Kaya sizeof (pansamantalang trabaho), lahat ng karapatan, sabihin ito ng kaunti mas malawak na.
Kaya ngayon ay may pa rin ng isang bug, na kung ano ang?
[Estudyante sagot, hindi maintindihan] >> Suriin para sa kung ano? Okay, kaya dapat naming check
null, dahil masamang mangyayari kapag ang iyong pointer ay null,
Dahil maaari mong magtapos pagpunta doon, at hindi ka kailanman dapat na pagpunta sa null
sa pamamagitan ng dereferencing ito sa operator *.
Sa gayon ay mabuti, at ano pa ang namin ang paggawa? Lohikal na may lamat dito masyadong.
[Estudyante sagot, hindi maintindihan]
>> Kaya suriin kung argc ≥ 2?
Okay, kaya may 3 mga bug sa programang ito dito.
Hindi namin check kung ang user ay talagang type sa anuman sa argv [1], ang mahusay.
Kaya kung ano ang sa ikatlong bug? Oo?
[Estudyante sagot, hindi maintindihan] >> Magandang.
Kaya namin naka-check ang isang sitwasyon. Naka-check nang kataon lamang namin huwag kopyahin ang higit pang memory
kaysa ay lumampas sa haba ng bar.
Kaya kung ang string ng gumagamit na nai-type sa 10 character ang haba,
na ito ay nagsasabi, 'Tanging kopyahin 10 character.'
At na okay lang, ngunit kung ano kung ang gumagamit na nai-type sa isang salita sa prompt
tulad ng 20 salita na character; ito, sinasabi ng kopya 20 character mula sa bar sa kung anong?
c, kung hindi man kilala bilang aming buffer, na nangangahulugan ka lang sinulat ni data
8 byte lokasyon na hindi mo pag-aari,
at hindi ito sa iyo sa pakiramdam na hindi ka na kailanman inilalaan sa kanila.
Kaya ito ay kung ano ang karaniwang kilala bilang atake buffer overflow,
o paglampas sa atake buffer, at ito ay atake sa kamalayan na kung ang user
o ang programa na pagtawag sa iyong function na ay ginagawa ito maliciously,
kung ano ang aktwal na ang susunod na mangyayari ay medyo masamang.
>> Natin tingnan ang larawang ito dito.
Ang larawan na ito ay kumakatawan sa iyong stack ng memory.
At isipin ang na sa tuwing tinatawag mo ang isang function,
kang makakuha ng ito maliit na frame sa stack at pagkatapos isa at pagkatapos ay isa pang at pagkatapos ay isa pang.
At sa gayon ay malayo lang namin uri ng malayo mga ito ang layo bilang parihaba
alinman doon sa board o sa screen dito.
Ngunit kung namin mag-zoom in sa isa sa mga parihaba,
kapag tumawag ka ng isang function foo, lumiliko na may higit pa sa stack
sa loob ng na frame at na parihaba
kaysa lamang x at y at isang at b, tulad namin ay pakikipag-usap tungkol makipagpalitan.
Ito lumiliko out na may ilang mga mas mababang antas ng detalye,
kasama ng mga ito bumalik address.
Kaya ito lumiliko out kapag pangunahing tawag foo, ang pangunahing ay upang ipaalam sa foo
kung ano ang pangunahing address sa memory ng computer.
Dahil kung hindi man, sa lalong madaling foo tapos na execute, tulad ng sa kasong ito dito,
sa sandaling naabot mo na ito malapit kulot suhay sa dulo ng foo,
kung paano ang ano ba ang foo malaman kung saan ang kontrol ng programa ay dapat pumunta?
Ito lumiliko out na ang sagot sa tanong na sa na pulang parihaba dito.
Ito ay kumakatawan sa isang pointer, at ito ay hanggang sa ang computer upang mag-imbak, pansamantalang,
sa tinatawag na stack ang address ng pangunahing upang ang sa lalong madaling foo tapos na e-execute,
computer na ang nakakaalam kung saan at kung ano ang linya sa pangunahing upang bumalik sa.
Nai-save na frame pointer nauugnay katulad na ito.
Magpasinda * bar dito ay kumakatawan sa kung ano ang?
Well, ngayon ang asul na segment dito foo ng frame, kung ano ang bar?
Okay, sa gayon bar lamang ang argumento sa pag-andar ng foo.
>> Kaya ngayon hindi namin muli sa pamilyar na larawan.
Mayroong higit pang mga bagay-bagay at higit pa distractions sa screen
ngunit ito mapusyaw na asul na segment ay kung ano ang namin ang pagguhit sa Chalkboard para sa isang bagay tulad makipagpalitan.
Na frame para sa foo at ang tanging bagay sa ito ngayon ay bar,
na ang parameter na ito.
Ngunit ano pa ang dapat sa stack, ayon sa ang code na ito dito?
Magpasinda c [12]. Kaya dapat rin naming makita ang 12 mga parisukat ng memory,
inilalaan sa isang variable na tinatawag c.
At sa katunayan namin na sa screen.
Pinakatuktok may c [0], at pagkatapos ay ang may-akda ng diagram na ito
ay hindi abala ang pagguhit ng lahat ng mga parisukat ngunit may katunayan 12 doon
dahil kung titingnan mo sa kanan sa ibaba, c [11], kung ikaw ay mabibilang mula 0, ang 12 tulad byte.
Ngunit narito ang problema: Sa aling mga direksyon ay c lumalaking?
Uri ng tuktok pababa, i-right? Kung nagsisimula ito sa tuktok at lumalaki sa ibaba,
ay hindi mukhang iniwanan namin sa ating sarili magkano paliparan dito sa lahat.
Namin ang uri ng ipininta sa ating sarili sa isang sulok,
at c [11] ay karapatan up laban sa bar, na karapatan up laban sa stack frame pointer,
na karapatan up laban sa return address; mayroong hindi hihigit room.
Kaya kung ano ang implikasyon sa, pagkatapos, kung magroskas up ka,
at subukan mong pagbabasa 20 bytes sa isang 12-byte buffer?
Kung saan ang mga 8 karagdagang mga byte pagpunta sa pumunta?
Inside lahat ng iba pa, ang ilang na kung saan ay sobrang mahalaga.
At ang pinaka-mahalagang bagay, potensyal na, ay ang pulang kahon doon, return address.
Dahil ipagpalagay na ikaw ay alinman sinasadyang o adversarially
patungan ng mga 4 bytes, na pointer address,
hindi lamang na may basura, ngunit may isang numero na mangyayari sa kumakatawan sa isang aktwal na address sa memory?
Ano ang ang implicaiton, lohikal?
[Estudyante sagot, hindi maintindihan] >> Mismong. Kapag foo nagbabalik
hit na kulot suhay, ang programa ay magpatuloy na hindi upang bumalik sa pangunahing,
ito upang bumalik sa anumang address na pulang kahon.
>> Ngayon, sa kaso ng circumventing ng pagpaparehistro ng software,
kung ano ang address na ibinalik sa ang function
na normal ay makakakuha ng tinatawag na pagkatapos na iyong binayaran para sa mga software at inputted ang iyong pagpaparehistro code?
Maaari mong pag-uri-uriin ng nanlilinlang ang computer sa hindi pagpunta dito, ngunit sa halip, ang pagpunta dito.
O, kung ikaw ay talagang matalino, kalaban ng aktwal type in sa keyboard,
halimbawa, hindi isang aktwal na salita, hindi 20 character, ngunit ipagpalagay na siya
uri sa ilang mga character na kumakatawan ng code?
At hindi ito ay pagpunta sa C code, ito ang mga character na
na kumakatawan sa binary code ng machine, 0 at 1 sa.
Ngunit ipagpalagay na ito ay sapat na matalino upang magawa iyon, upang sa paanuman ilagay sa GetString prompt
isang bagay na mahalagang inipon code,
at ang huling 4 bytes patungan na return address, at kung anong address ang input na?
Nag-iimbak ito sa pulang parihaba ang address ng unang byte ng buffer.
Kaya mayroon kang talagang matalino, at ito ng maraming pagsubok at error
para sa mga masamang tao out doon, ngunit kung maaari mong malaman kung gaano kalaki ang buffer ito,
tulad na ang huling ilang mga byte sa input na magbigay sa iyo sa programa
mangyayari sa katumbas sa address ng simula ng iyong buffer,
maaari mong gawin ito. Kung sabihin namin, normal, kumusta, at \ 0, na kung ano ang nagtatapos sa buffer.
Ngunit kung hindi namin mas matalino, at punan namin na buffer sa kung ano ang makikita namin generically call na code ng atake,
A, A, A, S: atake, atake, atake, atake, kung saan ito ay isang bagay na ang isang bagay masamang.
Well, kung ano ang mangyayari kung ikaw ay talagang matalino, maaari mong gawin ito:
Sa pulang kahon dito ay isang sequence ng mga numero: 80, CO, 35, 08.
Pansinin na na tumutugma sa numero na dito.
Sa reverse pagkakasunud-sunod, ngunit higit pa sa na ang ilang iba pang mga oras.
Pansinin na ang return address na ito ay sadyang binago
katumbas ng address dito, hindi ang address ng pangunahing.
Kaya kung ang masamang tao ay sobrang na smart, siya ay pagpunta sa isama sa na atake code
isang bagay tulad ng, 'Tanggalin ang lahat ng mga file ng user.'
O 'Kopyahin ang password,' o 'Lumikha ng isang user account na maaari kong mag-log in sa.'
Anumang bagay sa lahat, at ito ay parehong mga panganib at ang kapangyarihan ng C.
Dahil mayroon kang access sa memory sa pamamagitan ng pointer
at maaari mong samakatuwid isulat ang anumang nais mo sa memory ng computer.
Maaari kang gumawa ng isang computer ng anumang bagay na gusto mo sa pamamagitan lamang ng
nagki ito tumalon sa paligid sa loob ng sarili nitong espasyo sa memory.
At ito, sa araw na ito, kaya maraming mga programa at mga kaya maraming mga website na nakompromiso
pasingawan sa mga tao na sinasamantala ng mga ito.
At ito ay maaaring mukhang tulad ng isang napaka-sopistikadong atake,
ngunit hindi ito palaging simulan na paraan.
>> Katotohanan ay na ang masamang tao ay karaniwang gawin ay,
kung ito ay isang programa sa command line o isang GUI na programa o sa isang website,
ay mo lamang simulan ang pagbibigay ng bagay na walang kapararakan.
Kang mag-type sa isang talagang malaking salita sa patlang ng paghahanap at pindutin ang enter,
at hintayin mo upang makita kung ang website ng nag-crash.
O hintayin mo upang makita kung ang programa sa manifests ilang mga mensahe ng error.
Dahil kung makakakuha ka ng masuwerteng, bilang ang masamang tao,
at magbigay sa iyo ng ilang mga nakatutuwang input na nagka-crash ang programa,
na nangangahulugan na programmer ay hindi inaasahan ang iyong masamang pag-uugali
na nangangahulugan na maaari mong marahil, may sapat na pagsisikap,
sapat na pagsubok at error, malaman kung paano sa pasahod ng mas tumpak na pag-atake.
Kaya bilang magkano ang isang bahagi ng seguridad ay hindi lamang pag-iwas sa mga pag-atake sa kabuuan, ngunit paghanap sa kanila
at talagang aktwal na tumitingin sa logs at nakikita kung ano ang mabaliw input ay may mga tao na nai-type sa iyong website.
Ano ang mga term sa paghahanap tao na-type sa iyong website sa mga pag-asa ng umaapaw ilang buffer?
At ito kahulihan babagsak sa simpleng mga pangunahing kaalaman ng kung ano ang isang array,
at kung ano ang ibig sabihin upang maglaan at gamitin ang memory?
At na may kaugnayan sa na, masyadong, ito.
>> Kaya sabihin lamang sulyap sa loob ng isang hard drive pa muli.
Kaya manariwa sa diwa mula sa isa o dalawang linggo ang nakalipas na kapag mo i-drag ang mga file
sa iyong recycle bin o trash can, ano ang mangyayari?
[Mag-aaral] Walang. >> Oo, ganap na walang. Sa paglaon kung nagpapatakbo ka ng mababang
sa disk space, Windows o Mac OS ay simulan ang pagtanggal ng mga file para sa iyo.
Ngunit kung i-drag ka ng isang bagay doon, pagkatapos ito ay hindi sa lahat ng ligtas.
Lahat ng iyong roomate, kaibigan o miyembro ng pamilya ay may sa gawin ay i-double click, at voila.
Mayroong ang lahat ng mga pahapyaw na file na sinubukan mong tanggalin.
Kaya ang karamihan sa atin ng hindi bababa sa malaman na mayroon kang upang i-right click o kontrolin ang pag-click
at walang laman ang basura, o isang bagay tulad na.
Ngunit kahit na pagkatapos, na hindi pa gawin ang nanlilinlang.
Dahil kung ano ang mangyayari kapag mayroon ka ng isang file sa iyong hard drive
na kumakatawan sa ilang mga dokumento na salita o ilang JPEG?
At ito ay kumakatawan sa iyong hard drive, at sabihin nating ito salubsob dito ay kumakatawan sa file na iyon,
at ito ay binubuo ng isang buong grupo ng 0 at 1 ay.
Ano ang mangyayari kapag hindi mo lamang i-drag ang file na iyon sa trashcan o recycle bin,
ngunit din alisan ng laman ang mga ito?
Pagsunud-sunurin ng walang. Ito ay hindi ganap na walang ngayon.
Ngayon lang wala, dahil ang isang maliit na isang bagay na mangyayari sa paraan ng table na ito.
Kaya may ilang mga uri ng database o talahanayan sa loob ng memorya ng isang computer
na mahalagang may 1 pangalan ng hanay para sa mga file,
at 1 haligi para sa lokasyon ng file, kung saan maaaring ito ay ang lokasyon 123, lamang ng random na numero.
Kaya maaari naming magkaroon ng isang bagay tulad ng x.jpg, at lokasyon 123.
At ano ang mangyayari pagkatapos, kapag alisan ng laman mo ang iyong basura?
Na mawala. Ngunit ano ay hindi umalis ang 0 at 1 ay.
>> Kaya kung ano ang, pagkatapos, ang koneksyon sa pset 4?
Well, may pset 4, dahil aksidenteng namin na mabubura
compact flash card na mayroon ang lahat ng mga larawan na ito,
o dahil lang sa ito sa pamamagitan ng alat naging Nasira,
ay hindi nangangahulugan na ang 0 at 1 ay hindi pa rin doon.
Siguro ang ilan sa mga ito ay nawala dahil isang bagay Nakakuha Nasira
sa kamalayan na ilang 0 sa naging 1 at 1 sa naging 0 na.
Bad bagay ay maaaring mangyari dahil sa maraming surot software o depekto hardware.
Ngunit maraming ng mga bit, marahil kahit na 100% ng mga ito ay pa rin doon,
lang na ang computer o ang camera ay hindi alam kung saan JPEG 1 nagsimula
at kung saan nagsimula JPEG 2, ngunit kung, programmer,
alam mo na, na may isang bit ng savvy, kung saan ang mga JPEG na o kung ano ang tumingin sila tulad ng,
maaari mong pag-aralan ang 0 at 1 at sabihin, 'Ooh. JPEG. Ooh, JPEG. '
Maaari kang magsulat ng isang programa na may mahalagang lamang para sa o habang loop
na recovers bawat isa sa mga file.
Kaya aralin pagkatapos, ay upang simulan ang "secure" binubura ang iyong mga file
kung nais mong upang maiwasan ang kabuuan. Oo?
[Estudyante tanong, hindi maintindihan]
>> Mayroong higit pang memory kaysa ginawa mo dati -
Oh! Magandang tanong. Kaya bakit, pagkatapos, pagkatapos tinatanggalan ng laman ang trash,
ang iyong computer sabihin sa iyo na mayroon kang higit libreng espasyo kaysa ginawa mo dati?
Sa maikling sabi, dahil ito namamalagi. Mas technically, mo ay may mas maraming espasyo.
Dahil ngayon mo na sinabi, maaari mong ilagay ang iba pang mga bagay-bagay na kung saan ang file na sabay-sabay ay,
ngunit na ay hindi nangangahulugan na ang mga bits ay mawawala,
at na ay hindi nangangahulugan na ang mga bits ay Binago ang lahat ng 0 sa, halimbawa, para sa iyong proteksyon.
Sa pamamagitan ng kaibahan, kung ikaw "secure" burahin mga file, o pisikal na sirain ang aparato,
na talagang ay ang tanging paraan, minsan, sa paligid na.
Kaya bakit hindi namin umalis sa na semi-nakakatakot na tala, at kami ay nakikita mo sa Lunes.
CS50.TV