[Powered by Google Translate] [Тыдзень 5]
[David J. малая, Гарвардскі універсітэт]
[Гэта CS50.] [CS50.TV]
[Жанчына] Ён хлусіць, пра што, я не ведаю.
[Мужчына] Такім чынам, што мы ведаем?
[Жанчына] Што ў 9:15, Рэй Сантойя было ў банкамаце.
[Мужчына] Так што пытанне, што ён рабіў у 9:16?
[Жанчына] Здымкі 9 мм на нешта.
Можа быць, ён убачыў снайпера.
[Мужчына] Ці ён працуе з ім.
[Жанчына] Пачакайце. Зварот на адзін.
[Мужчына] Што вы бачыце?
[♫ ♫ трывожнай музыкай]
[Жанчына] Прынясіце свой асабовым бокам уверх. Поўны экран.
[Мужчына] Яго акуляры. >> Там у адлюстраванні.
[♫ ♫ трывожнай музыкай]
[Мужчына] Вось бейсбольнай каманды Nuevita ст. Гэта іх лагатып.
[Жанчына] І ён кажа таму, хто носіць гэтую куртку.
>> [David Malan] Такім чынам, гэта CS50 тыдзень 5, і сёньня мы разбурыць трохі тэлебачання і кіно для вас.
Таму, калі вы глядзіце шоу, як гэта тут,
і паліцыянты кажуць "Ці можаце вы чысціць, што да?" або "Павысіць"
няма ніякага паляпшэння ў рэальным свеце.
На самай справе, тое, што вы сапраўды атрымаеце трохі нешта накшталт гэтага.
Я пад'ехаў адзін з супрацоўнікаў, фатаграфіі са старонкі.
Гэта праграма пад назвай Photoshop. Гэта 1 з 2 Bowdens,
1 з 3 Bowdens на самай справе, на сённяшні дзень, таму што ў нас місіс Боуден тут жа, разам з Робом і Паўла.
Але вось Роб на экране, і калі мы павялічым на гэтую выбліск, ён заўсёды быў у яго вачах,
тое, што вы на самой справе бачыце, што тое, што вы бачыце, што вы атрымліваеце.
Гэта "ўзмоцненая", таму "CSI" у мяне крыху не так.
Там адзін аднаго кліпа, калі мы можам забраць на "CSI" проста трохі даўжэй.
Гэта адна добрая фраза вымавіць з гэтага часу, калі вы хочаце
абгрунтаваныя тэхнічныя са сваімі сябрамі, калі, сапраўды, вы кажаце, абсалютна нічога.
>> [Мужчына] На працягу некалькіх тыдняў я быў расследаванне забойства забойца таксіста
з пэўным захапленнем балючым.
[Woman # 1] Гэта ў рэальным часе.
[Жанчына # 2] Я ствару GUI інтэрфейс з выкарыстаннем Visual Basic, бачыць, калі я магу адсочваць IP-адрасы.
>> [Малая] Так аўдыё з сінхранізацыі ў бок, стварыўшы графічны інтэрфейс з выкарыстаннем Visual Basic
адсочваць IP-адрасы поўнае глупства.
У гэтыя дні вы не будзеце выкарыстоўваць Visual Basic,
няма неабходнасці ў GUI, і IP адрас быў тэхнічна дакладны тэрмін.
Так што сочыце за гэтым, і адзін з маіх любімых:
Гэта адна крыху больш таямніцай, таму што вы павінны ведаць іншую мову.
Там ёсьць мова пад назвай Objective-C, які з'яўляецца пашырэннем C.
Што азначае, што C плюс некаторыя дадатковыя магчымасці, у тым ліку аб'ектна-арыентаванага праграмавання.
І гэта мова, на якім Apple, папулярызаваў для праграмавання IOS.
І так вось урывак з розных шоў у цэлым, ад "Лічбы",
што, калі вы сапраўды паглядзіце ўважліва на вашым TiVo і паўзы ў патрэбны момант,
Вы ўбачыце, што тое, што яны глядзяць на не зусім тое, што апісана.
І дазвольце мне паспрабаваць розныя аўдыё раздым тут і паглядзець, калі мы не можам
захаваць аўдыё ў сінхранізацыі на гэты раз.
Я даю вам "Лічбы".
>> [Чалавек № 1] Гэта 32-разрадны адрас IPv4.
[Мужчына # 2] IP, гэта Інтэрнэт. >> Прыватнай сеткі. Гэта прыватная сетка Аніты.
[Малая] Добра. Гэта Objective-C, і гэта для афарбоўкі некаторых праграм малога,
як вы, магчыма, можа заключыць ад імя зменную.
Так што ж тады "Лічбы". Таму сёння і на гэтым тыдні мы ўводзім
Трохі свеце судова-медыцынскай экспертызы і кантэкст, у праблемах таму.
Сёння будзе скарочана лекцыю, таму што ёсць спецыяльнае мерапрыемства тут
пасля гэтага, таму мы будзем зазірнуць, і дражніць як студэнтаў, так і іх бацькоў сёння
з некаторымі з рэчаў, якія на гарызонце.
Сярод іх, як у панядзелак, у вас будзе яшчэ некалькі аднакласнікаў.
EDX, Гарвард і MITs новы онлайн ініцыятыве для адкрытай курсаў
і больш, запуск на кампусе Гарвардскага універсітэта ў панядзелак.
Гэта азначае, прыйшоў панядзелак у вас будзе - па стане апошніх падліках,
86000 дадатковых аднакласнікі будуць сачыць разам з лекцыямі ў CS50
і частак і пакрокавыя кіраўніцтва і праблема мностваў.
І як частка гэтага, вы станеце сябрамі першага класа
CS50 і цяпер CS50x.
>> У рамках гэтага, цяпер, разумею, што там будуць нейкія станоўчыя моманты, а таксама.
Каб падрыхтавацца да гэтага, для вялікай колькасці студэнтаў,
Дастаткова сказаць, што, хоць у нас ёсць 108 TFs і сертыфікацыі,
не зусім лепшы вучань / настаўнік аднойчы мы патрапілі 80000 іншых студэнтаў.
Такім чынам, мы не збіраемся быць сартаванне столькі праблема ўсталёўвае ўручную.
Такім чынам, прадставіў на гэтым тыдні ў задачы набор будзе CS50 праверкі,
які будзе ўтыліта каманднага радка ўнутры прыбора
што вы атрымаеце, як толькі вы абновіце яго пазней у гэтыя выходныя,
і вы будзеце мець магчымасць запускаць каманды, праверце 50,
на свой PSET, і вы атрымаеце зваротную сувязь адносна таго, ваша праграма
правільна ці няправільна ў адпаведнасці з рознымі спецыфікацыямі дызайну, якія мы прадстаўляем.
Так пра гэта і спецыфікацыі праблема набору і
CS50x аднакласнікі будуць выкарыстоўваць яго.
>> Такім чынам, праблема камплект 4 гэта ўсё аб крыміналістыцы.
І гэты кавалак быў натхнёны некаторыя рэальныя рэчы,
якому, калі я быў у аспірантуры, я інтэрнаваныя на нейкі час з
Упраўленне Middlesex акругі акруговага пракурора робіць судова-медыцынскай экспертызы
з іх вядучым судовым следчым, і што гэта склала
гэта, я думаю, я ўжо міма некалькіх тыдні, маса Дзяржаўнай паліцыі або іншых
ўвойдзе, яны сыходзяць такія рэчы, як цвёрдыя дыскі і кампакт-дыскі і дыскеты
і да т.п., а затым мэта офіс экспертызы было пераканацца ў тым,
было ці не было доказаў нейкі.
Гэта быў Спецыяльная следчая група, так што белых каўнерыкаў злачынствы,
яна была больш трывожнай роду злачынстваў,
нічога удзелам некаторых відаў лічбавых носьбітаў, аказваецца, што не так шмат людзей
напісаць электронны ліст, кажучы: "Я зрабіў гэта".
Так што даволі часта гэтыя пошукі экспертызы не з'явіўся ўсё, што шмат садавіны,
але часам людзі будуць пісаць такія лісты.
Так што часам намаганні былі ўзнагароджаныя.
>> Але даводзіць да гэтага судова PSET, мы будзем прадстаўляць у PSET 4 трохі графікі.
Такім чынам, вы, верагодна, узяць гэтыя рэчы само сабой разумеецца, JPEG, GIF і як у гэтыя дні,
але калі вы сапраўды думаеце пра гэта, малюнак, гэтак жа, як асоба Роба,
могуць быць змадэляваныя ў выглядзе паслядоўнасці кропак, або пікселяў.
Зараз, у выпадку твары Роба, ёсць усе віды кветак,
і мы пачалі бачыць асобныя кропкі, otherwide вядомыя як пікселі,
як толькі мы пачалі, каб павялічыць маштаб
Але калі мы спросцім свеце няшмат, і проста сказаць, што гэта вось Роб
у чорна-белым, так, каб прадставіць чорна-белую мы можам проста выкарыстоўваць бінарны.
І калі мы збіраемся выкарыстаць двайковы, 1 або 0, мы можам выказаць гэта ж малюнак
ўсьмешлівы твар Адзежа з гэтай карціны бітаў: 11000011 ўяўляе
белы, белы, чорны, чорны, чорны, чорны, белы.
І гэта не велізарны скачок, то, каб пачаць гаварыць аб маляўнічых фатаграфій.
Рэчы, якія вы бачыце на Facebook або ўзяць з сабой лічбавую камеру,
але, вядома, калі справа даходзіць да кветак, вам трэба больш бітаў.
І вельмі распаўсюджаны ў свеце фатаграфіі з'яўляецца выкарыстанне не з'яўляецца 1-бітны колер,
так як гэта прадугледжвае, але 24-бітны колер, дзе вы фактычна атрымліваеце мільёны кветак.
Так як у выпадку, калі мы павялічана на вочы Роба,
, Што было любую колькасць мільёны розных маляўнічых магчымасцяў.
>> Такім чынам, мы ўвядзем гэта праблема набору 4, а таксама ў кіраўніцтве
які будзе сёння ў 3:30 замест звычайнага 2:30, таму што лекцыі пятніцу тут.
Але відэа будзе ў рэжыме онлайн, як звычайна, заўтра.
Мы таксама пазнаёмім вас з іншы фармат файла.
Так што гэта наўмысна павінна выглядаць страшным на першы,
Але гэта толькі некаторыя дакументы для структуры C.
Аказваецца, Microsoft, шмат гадоў таму, спрыяў папулярызацыі гэтага фармату,
называецца растравы фармат, BMP, і гэта было супер-просты,
маляўнічы графічны фармат файла, які быў выкарыстаны на працягу некаторага часу
а часам яшчэ для шпалер на працоўных сталах.
Калі вы думаеце, вярнуцца да Windows XP і пагоркаў і блакітнага неба,
, Што было тыпова BMP, або растравых малюнкаў, і растравыя выявы
задавальненне для нас, таму што ў іх ёсць трохі больш складанасці.
Гэта не так проста, як гэта сетка з 0 і 1;
Замест гэтага, у Вас ёсць такія рэчы, як загаловак у пачатку файла.
Такім чынам, іншымі словамі, усярэдзіне. Файлаў BMP ўяўляе сабой цэлы букет з 0 і 1,
але ёсць некаторыя дадатковыя 0 і 1 у там.
І атрымліваецца, што тое, што мы, верагодна, само сабой якія разумеюцца на працягу многіх гадоў,
фарматы файлаў, як. дакумент або. або XLS. mp3 або. mp4,
усе фарматы файлаў, якія вы знаёмыя з.
Ну, і што гэта ўвогуле значыць быць фармат файла?
Таму што ў рэшце рэшт, усе гэтыя файлы, якія мы выкарыстоўваем, маюць толькі 0 і 1
і, магчыма, гэтыя 0 і 1 ўяўляюць, B, C, праз ASCII і да т.п.,
але да канца дня, гэта толькі 0 і 1.
>> Такім чынам, людзі проста часам вырашылі вынайсці новы фармат файлаў
дзе яны стандартызацыі, якія мадэлі біт будзе на самой справе маю на ўвазе.
І ў гэтым выпадку тут, людзі, якія распрацаваны растравы фармат
Кажуць, што ў самы першы байт у растравы файл, як пазначаць зрушэнне 0, то,
там будуць некаторыя зашыфраваныя імёны зменнай bfType,
які проста каштуе для растравых тыпаў файлаў; якога тыпу файл выявы гэтага.
Можна зрабіць выснову, мабыць, з другога шэрагу, што зрушэнне 2, байт нумар 2,
мае малюнак з 0 і 1, якая прадстаўляе што?
Памер і тое, і гэта ідзе адтуль.
Такім чынам, у праблеме набор 4, вы будзеце прайшоў праз некаторыя з гэтых рэчаў.
>> Мы не будзем у канчатковым выніку клопат аб усіх з іх, але заўважыць гэта пачынае станавіцца цікавым
вакол лініі або байт 54, rgbtBlue, зялёны і чырвоны.
Калі вы калі-небудзь чулі акронім RGB, чырвоны зялёны сіні, гэта спасылка на гэта.
Таму што атрымліваецца, вы можаце маляваць ўсе колеры вясёлкі
з некаторай камбінацыяй чырвонага і сіняга і зялёнага.
І на самай справе, бацькі ў зале маглі б узгадаць некаторыя з самых ранніх праектараў.
У гэтыя дні, вы бачыце толькі адзін яркі святло, выходны з аб'ектыва.
Але вернемся ў дзень, вы былі чырвоныя лінзы, блакітныя лінзы і зялёныя лінзы
і яны разам, накіраванай на экране і сфармаваў маляўнічую карціну.
І даволі часта сярэдніх школ і ВНУ будуць мець тыя лінзы
ўсё так трохі крыва, так што вы былі свайго роду бачым двайныя або патройныя малюнка,
але гэта была ідэя. Вы былі чырвоны і зялёны і сіні святло намаляваць карціну.
І той жа самы прынцып выкарыстоўваецца ў кампутарах.
>> Такім чынам, сярод праблем, то для Вас ў праблеме ўсталяваць 4
збіраюцца быць некалькі рэчаў, адна з'яўляецца на самай справе змяніць памер малюнка.
Для таго, каб у шаблоне ад 0 і 1,
высветліць, якія кавалкі 0 і 1 уяўляюць тое, што ў структуры, як гэта,
, А затым высветліць, як паўтарыць пікселяў: чырвоныя, сінія, зялёныя
ўнутры так, што, калі карціна выглядае так першапачаткова, можа выглядаць так, а не пасля гэтага.
Сярод іншых праблем, таксама будзе, што вы будзеце перададзены
судова вобраз сам файл з лічбавай камеры
і на гэтай камеры, калісьці, было цэлая куча фатаграфій.
Праблема ў тым, мы выпадкова сцёртыя або быў вобраз пашкоджаны нейкім чынам.
Дрэнныя рэчы здараюцца з лічбавых камер, і таму мы хутка скапіявалі ўсё з 0 і 1
з гэтай картай для вас, захаваць іх усё ў адзін вялікі файл, а затым мы будзем перадаваць іх для вас
У задачу ўсталяваць 4, так што вы можаце напісаць праграму ў C, з якой аднавіцца
ўсе гэтыя выявы ў фармаце JPEG, у ідэале.
І аказваецца, што JPEG, нават калі яны чымсьці складаным фарматам файла,
яны значна больш складанай, чым гэта ўсьмешлівы твар тут.
Атрымліваецца, што кожны JPEG пачынаецца з тых жа мадэляў ад 0 і 1.
Такім чынам, выкарыстоўваючы пятлю, або цыкл ці аналагічны,
Вы можаце перабраць усе 0 і 1 у гэтай судовай малюнак
і кожны раз, калі вы бачыце адмысловы шаблон, які вызначаны ў спецыфікацыі праблема набору,
Вы можаце выказаць здагадку: "Ах, вось, з вельмі высокай верагоднасцю,
Пачатак JPEG, і як толькі вы знойдзеце па той жа схеме,
некаторы колькасць байтаў ці кілабайтах або мегабайтах пазней,
Вы можаце выказаць здагадку, 'О! Вось другі JPEG, фота я ўзяў пасля таго, як першы.
Дазвольце мне спыніцца чытаў, што першы файл, пачаць пісаць гэты новы ".
І выхад з вашай праграмы для PSET 4 будзе цэлых 50 JPEG.
А калі гэта не 50 JPEG, у вас ёсць трохі цыклу.
Калі ў вас ёсць бясконцая колькасць JPEG, у вас ёсць бясконцы цыкл.
Так што, таксама будзе даволі распаўсюджаны выпадак.
Вось што на гарызонце.
>> Віктарына 0, ззаду нас. Зразумейце, на маю электронную пошту, якая нязменна ёсць людзі
, Якія абодва шчаслівыя, як бы нейтральнай, і сумныя вакол віктарына 0 раз.
І, калі ласка, дацягнуцца да мяне, кіраўнік ТФ, Zamyla, вашы ўласныя TF
або аднаго з цэнтраў сертыфікацыі, якія вы ведаеце, калі вы хацелі б абмеркаваць, як усё прайшло.
>> Такім чынам, каб вырабіць ўражанне на бацькоў тут, у пакоі,
што CS50 бібліятэку? Добрая праца.
Што CS50 бібліятэку? Да? [Адказы студэнтаў, неразборліва]
>> Добра, добра. Так што гэта Стандартная набор кода, які мы, супрацоўнікі, пісаў,
мы прадстаўляем вам, каб забяспечыць некаторыя агульныя функцыянальныя магчымасці.
Такія рэчы, як мне атрымаць радок, зразумейце мяне INT, усе функцыі, пералічаныя тут.
Пачынаючы з гэтага моманту, мы пачынаем па-сапраўднаму ўзяць гэтыя навучальныя колы прэч.
Такім чынам, мы збіраемся пачаць, каб забраць "радок" ад вас,
які, нагадаем, быў усяго толькі сінонім, што фактычны тып дадзеных? сімвал *.
Такім чынам, для бацькоў, якія, верагодна, - гэта добра, так што знак *, мы пачынаем бачыць
На экране тым больш, што мы выдаляем "радок" з нашага лексікону,
па крайняй меры калі справа даходзіць да фактычнага напісання кода.
Акрамя таго, мы будзем адмовіцца ад выкарыстання некаторых з гэтых функцый столькі ж,
таму што нашы праграмы збіраюцца атрымаць больш складаныя
, А не проста пісаць праграмы, якія сядзяць там з запытам міргаць,
чакання для карыстальніка, каб увесці нешта цалі
Вы будзеце атрымліваць вашыя матэрыялы з іншых крыніц.
Напрыклад, Вы будзеце атрымліваць іх з паслядоўнасці бітаў на лакальным цвёрдым дыску.
Вы, а не атрымліваць іх у будучыні ад сеткі, некаторыя вэб-сайт где-то.
Так што давайце адхіліце гэты пласт у першы раз, і пацягніце ўверх CS50 прыбора
і гэты файл называецца CS50.h, што вы былі рэзкімі, уключаючы некалькі тыдняў.
>> Але давайце рэальна ўбачыць, што знаходзіцца ўнутры гэтага.
Такім чынам, у верхняй частцы файла ў сінім гэта проста цэлая куча каментароў,
Інфармацыя ліцэнзавання і гарантыі. Гэта свайго роду агульную парадыгму
у праграмнае забеспячэнне, таму што шмат праграмнага забеспячэння ў гэтыя дні тое, што называецца "з адкрытым зыходным кодам»,
Гэта азначае, што нехта напісаў код
і зрабіў гэта ў вольным доступе, а не проста бегаць і выкарыстоўваць,
але на самой справе чытаць і змяняць і інтэграваць у сваю працу.
Так вось, што вы выкарыстоўваеце праграмнае забеспячэнне з адкрытым крыніцай,
хоць і ў вельмі малой формы.
Калі я пракруціць ўніз міма каментароў, хоць, мы пачынаем бачыць некаторыя больш знаёмыя рэчы.
Так заўважыць у верхняй тут, што файл CS50.h ўключае ў сябе цэлую кучу файлаў загалоўкаў.
Цяпер большасць з іх мы раней не бачылі, але адно
знаёмыя, якія з іх мы не бачылі, хоць і ненадоўга, да гэтага часу?
Так, стандартныя бібліятэкі. Stdlib.h мае таНос,
таму, як толькі мы пачалі гаварыць аб дынамічным размеркаванні памяці,
якія мы вернемся на наступным тыдні, а мы пачалі ў тым ліку і файлаў.
Аказваецца, BOOL і праўдзівым і ілжывым на самой справе не існуе ў C, па сутнасці,
калі вы ўключаеце гэты файл тут.
Такім чынам, мы на працягу некалькіх тыдняў, былі ў тым ліку стандартныя bool.h
так што вы можаце выкарыстоўваць паняцце лагічнае, праўдзівай ці ілжывай.
Без гэтага, вам прыйдзецца разабрацца падробленых і выкарыстоўваць Int
і проста адвольна лічыць, што 0 з'яўляецца ілжывым і 1 дакладная.
>> Цяпер, калі мы пракруціць ўніз далей, вось наша вызначэнне радка.
Аказваецца, як мы ўжо казалі раней, што там, дзе гэта * гэта сапраўды не мае значэння.
Вы нават можаце мець прастору вакол.
Мы, у гэтым семестры, былі яго папулярызацыі як гэта зрабіць зразумела, што * мае справу з тыпам.
Але разумееце, як агульнага, калі не трохі часцей, гэта паставіць яго там
але функцыянальна гэта тое ж самае.
Але цяпер, калі мы будзем чытаць далей уніз, давайце паглядзім на, скажам, GetInt,
таму што мы выкарыстоўвалі, што, можа быць, перш чым што-небудзь яшчэ ў гэтым семестры.
А вось GetInt. Гэта што?
Гэта прататып. Так часта мы паставілі прататыпы на вяршынях нашых. З файламі,
але вы таксама можаце змясціць прататыпы ў файлы загалоўкаў,. г файлы,
як гэта тут, так што, калі вы пішаце некаторых функцый
што вы хочаце, каб іншыя людзі маглі выкарыстоўваць, а гэта менавіта і ў выпадку з CS50 бібліятэкі,
Вы не толькі рэалізаваць свае функцыі ў нешта накшталт CS50.c,
Вы таксама змясціць прататыпы не ў верхняй часткі гэтага файла, але ў верхняй частцы загалоўка файла,
тое, што загаловак файла з'яўляецца тое, што сябры і калегі ўключаюць,
з вострымі ўключыць у свой код.
Так што ўвесь гэты час вы былі ў тым ліку ўсе гэтыя прататыпы
эфектыўна ў верхняй частцы вашага файла, але праз гэты рэзкі ўключаць механізм
, Што істотна капіюе і ўстаўляе гэты файл у свой уласны.
Цяпер, вось некаторыя даволі падрабязную дакументацыю.
>> Мы ў значнай ступені само сабой якія разумеюцца, што GetInt атрымлівае INT,
але, аказваецца, ёсць некаторыя прыватныя выпадкі, ці не так?
Што рабіць, калі карыстальнік ўводзіць лік, гэта занадта вялікі?
Квинтиллиона, што проста не можа змясціцца ўнутры Int?
Якое чаканае паводзіны? Ну, у ідэале, гэта прадказальна.
Такім чынам, у гэтым выпадку, калі вы на самой справе чытаць дробны шрыфт,
Вы ўбачыце, што, калі лінія не можа быць прачытаны, гэта вяртае INT_MAX.
Мы ніколі не казалі пра гэта, але, грунтуючыся на яго капіталізацыі,
што гэта, напэўна?
Гэта пастаянная, так што некаторыя спецыяльныя канстанта, якая, верагодна, абвясціў
у адным з гэтых файлаў загалоўкаў вось падняцца вышэй у файле,
INT_MAX і, верагодна, нешта кшталту, прыкладна, 2 мільярды даляраў.
Ідэя заключалася ў тым, што, паколькі мы павінны нейкім чынам азначае, што нешта пайшло не так,
Мы, так, ёсць 4000000000 нумары ў нашым распараджэнні,
адмоўнае 2 млрд. да 2 млрд., плюс-мінус.
Ну, тое, што з'яўляецца агульным у праграмаванні ты скраў толькі адзін з гэтых лікаў.
Можа быць 0, можа быць, 2 млрд, можа быць адмоўным 2 мільярды даляраў.
Такім чынам, вы марнуеце адну з вашых магчымых значэнняў, так што вы можаце зрабіць у свеце
што калі нешта пойдзе не так, я вярну гэты супер-вялікага значэння.
Але вы не хочаце, каб карыстач друкуе нешта загадкавае, як "2, 3, 4 ..."
сапраўды вялікі нумар, дзе вы абагульняць, а не як канстанту.
Так на самай справе, калі вы былі анальнага апошнія некалькі тыдняў,
у любы час вы тэлефануеце GetInt, вы павінны былі праверыць з, калі ўмовы.
Хіба тыпу карыстальніка ў INT_MAX, ці, дакладней,
GetInt зрабіў вяртанне INT_MAX? Таму што калі гэта так,
што на самой справе азначае, што яны не ўводзіце яго, нешта пайшло не так у гэтым выпадку.
Такім чынам, гэта тое, што звычайна называюць "дазорную" значэнне, якое проста азначае, асаблівы.
>> Ну, давайце цяпер звернемся ў службу. З файламі.
Размовы C існавала ў прыбор на працягу некаторага часу,
і, па сутнасці, прыбор мае яго папярэдне скампіляваных для вас
у тое, што мы называлі "аб'ектны код"
але гэта проста не мае значэння для вас, дзе гэта таму, што сістэма ведае,
У гэтым выпадку, дзе яна знаходзіцца, прыбор.
Але давайце пракруціць ўніз цяпер GetInt, і паглядзець, як GetInt працаваў ўвесь гэты час.
Такім чынам, тут мы маем падобныя каментары, чым раней.
Дазвольце мне павялічыць толькі на частку кода,
і што мы маем на GetInt заключаецца ў наступным.
Ён не прымае ўваходныя і вяртае цэлае, у той час (праўда), так што ў нас ёсць наўмыснае бясконцы цыкл
але, па-відаць, мы вырвацца з гэтага так ці інакш, ці вярнуцца ўнутры гэтага.
Такім чынам, давайце паглядзім, як гэта працуе. Ну, мы, падобна, выкарыстоўваюць GetString
У гэтай першай лініяй ўнутры цыклу, 166.
Цяпер гэта добрая практыка, таму што, пры якіх абставінах
GetString можа вярнуць гэта спецыяльнае ключавое слова NULL?
Калі нешта пойдзе не так. Што можа пайсці не так, калі вы называеце нешта накшталт GetString?
Да? [Студэнт адказ, неразборліва] >> Так. Таму, магчыма, таНос не атрымоўваецца.
Дзесьці пад капотам GetString кліча таНос,
якая вылучае памяць, якая дазваляе ў кампутарны краму
Усе сімвалы, якія карыстальнік набірае на клавіятуры.
І выкажам здагадку, што карыстач меў шмат вольнага часу
і набралі больш, напрыклад, чым 2 млрд. знакаў.
Больш за сімвалаў, чым кампутар, нават мае RAM.
Ну, GetString павінен быць у стане азначае, што да вас,
нават калі гэта супер, супер рэдкі выпадак куце.
Ён павінен нейкім чынам быць у стане справіцца з гэтым, і так GetString,
калі мы вернемся і прачытаць яго дакументацыю, не, на самай справе, вярнуць NULL.
Цяпер, калі GetString не атрымоўваецца, вяртаючы NULL, GetInt збіраецца пацярпець няўдачу
шляхам вяртання INT_MAX, як дазорцы.
Гэта ўсяго толькі чалавечыя канвенцыі. Толькі так вы б ведалі, што гэта справа
, Чытаючы дакументацыю.
Так што давайце пракруціць ўніз, туды, дзе Int на самай справе GotInt.
>> Так што калі я пракруціць ўніз крыху далей, у лініі 170 у нас ёсць каментар вышэй гэтых ліній.
Такім чынам, мы заяўляем, у 172, Int N і сімвал с, а затым гэтая новая функцыя
які некаторыя з вас наткнуўся раней, але Sscanf.
Гэта азначае F радок сканавання.
Іншымі словамі, даць мне радкі, і я буду праверыць яго на кавалкі інфармацыі, якая прадстаўляе цікавасць.
Дык што ж гэта значыць? Ну, выкажам здагадку, што я тыпу ў літаральным сэнсе 1 2 3 на клавіятуры,
, А затым націсніце клавішу Увод. Што такое тып дадзеных 1 2 3, калі вяртаюцца GetString?
Відавочна, што гэта радок, ці не так? У мяне ёсць радок, таму 1 2 3 сапраўды "1 2 3"
з \ 0 ў канцы яго. Гэта не Int.
Гэта не лік. Гэта выглядае як лік, але гэта не на самай справе.
Такім чынам, што ж GetInt рабіць? Гэта мае для сканавання гэтага радка злева направа,
1 2 3 \ 0, і нейкім чынам пераўтварыць яго ў фактычнае лік.
Цяпер вы можаце зразумець, як гэта зрабіць.
Калі вы ўспомніце PSET 2, Вы, верагодна, атрымаў крыху зручны
з Цэзарам або Vigenere так што вы можаце перабраць радкі,
Вы можаце канвертаваць знакаў для цэлых лікаў з выбарам. Гэта цэлая вялікая праца.
Чаму б не назваць функцыю, як Sscanf, што робіць гэта для вас?
Так Sscanf чакае аргумент, у дадзеным выпадку называецца лінія, якая з'яўляецца радком.
Затым вы паказваеце, у двукоссі, вельмі падобны на Printf,
Што вы чакаеце ўбачыць у гэтым радку?
Тое, што я кажу тут, я чакаў убачыць дзесятковы лік і, магчыма, характар.
І мы ўбачым, чаму гэта так, у адзін момант.
Аказваецца, што гэта пазначэнне цяпер нагадвае матэрыял
Мы пачалі казаць пра крыху больш за тыдзень таму.
>> Што такое & N і & C робіць для нас тут? [Адказы студэнтаў, неразборліва]
>> Так. Ён даў мне адрас і адрас п с.
Цяпер, чаму гэта так важна? Ну, вы ведаеце, што з функцыямі C
Вы заўсёды можаце вярнуць значэнне не мае ніякага значэння наогул.
Вы можаце вярнуць цэлы лік, радок, лік з якая плавае кропкай, сімвал, што заўгодна.
Ці вы можаце вярнуцца пустэчу, але вы можаце вярнуць толькі 1 рэч максімальна.
Але тут мы хочам Sscanf вярнуць мяне, можа быць, цэлы лік, дзесятковы лік,
а таксама знак, і я растлумачу, чаму знакаў у хвіліну.
Такім чынам, вы хочаце эфектыўна F вярнуць 2 рэчы, якія проста не магчыма ў C.
Такім чынам, вы можаце абыйсці, што, пераходзячы ў 2-адрасоў,
таму што як толькі вы перадаць функцыі 2 адрасу, што можа гэтую функцыю з імі рабіць?
Ён можа пісаць на гэтыя адрасы. Вы можаце выкарыстоўваць аперацыю * і "туды" да кожнага з гэтых адрасоў.
Гэта накшталт гэтага бэкдор механізм, але вельмі часта мяняюцца значэння зменных
больш, чым проста 1-е месца, у гэтым выпадку 2.
Зараз звернеце ўвагу, я праверкі == to1, а затым вяртаюцца п калі гэта, на самой справе, ацаніць да ісціны.
Так што ж адбываецца? Ну, тэхнічна, усё, што мы сапраўды хочам, адбудзецца ў GetInt гэта.
Мы хочам, каб разабраць, так бы мовіць, мы хочам, каб прачытаць радок
"1 2 3" і, калі яна выглядае як ёсць шэраг там,
тое, што мы гаворым Sscanf зрабіць, гэта пакласці гэты нумар, 1 2 3, у гэтай зменнай п, для мяне.
Чаму ж тады ў мяне гэта, а?
Якая роля таксама кажуць, Sscanf, вы можаце таксама атрымаць сімвал тут.
[Студэнт кажучы, неразборліва] >> Не - дзесятковая кропка можа працаваць.
Давайце лічыць, што на імгненне задумаўся. Што яшчэ?
[Студэнт, неразборліва] >> Так, добрыя думкі, яна можа быць нулявы знак.
Гэта на самай справе не ў гэтым выпадку. Да? [Студэнт, неразборліва]
>> >> ASCII. Ці, дазвольце мне абагульняць яшчэ далей.
% C існуе толькі для праверкі памылак.
Мы не хочам там быць знак пасля нумары,
але тое, што гэта дазваляе мне зрабіць наступнае:
Аказваецца, што Sscanf, акрамя захоўвання значэнняў у н і с, у гэтым прыкладзе,
што ён таксама робіць гэта вяртае колькасць зменных пакласці значэння цалі
Так што калі вы толькі ўвесці 1 2 3, то толькі% D будзе адпавядаць
і толькі п атрымлівае захоўваецца са значэннем, як 1 2 3 і нічога не атрымлівае пакласці ў C;
З застаецца смецце значэнне, так бы мовіць.
Смецце, таму што ён ніколі не быў ініцыялізаваны як некаторую каштоўнасць.
Так што ў гэтым выпадку, Sscanf вяртае 1, таму што я населены адзін з тых паказальнікаў,
У гэтым выпадку, вялікая. У мяне ёсць цэлы лік, так што я вызваліць лінію, каб вызваліць памяць
GetString, што на самой справе вылучаецца, а потым вярнуцца с.
У адваротным выпадку, калі вы ніколі не задумваліся, дзе гэта паўтарыць заяву прыходзіць, прыходзіць прама адсюль.
Калі, наадварот, я набіраю ў 1 2 3 Фу,
толькі некаторыя выпадковыя паслядоўнасці тэксту, Sscanf будзе бачыць,
ох, нумар, ох, нумар, ох, нумар, ох - ф.
І ён збіраецца паставіць 1 2 3 на рускай мове.
Ён збіраецца паставіць е ў с, а затым вярнуць 2.
Такім чынам, мы маем, толькі з дапамогай асноўнага вызначэння паводзін SCANF, у
Вельмі просты спосаб - добра, складаныя на першы погляд, але, у рэшце рэшт,
даволі просты механізм кажучы, ёсць цэлы лік, і калі так, то, што адзінае, што я знайшоў?
І белае прастора тут не выпадкова. Калі вы прачыталі дакументацыю па Sscanf,
ён кажа вам, што калі вы ўключаеце кавалак прабелы ў пачатку ці ў канцы,
Sscanf занадта дазволіць карыстачу, па якой прычыне, каб ўразіць прабел 1 2 3, і гэта будзе законна.
Ён не будзе крычаць на карыстачоў толькі таму, што яны патрапілі ў прабелу ў пачатку ці ў рэшце рэшт,
якія толькі трохі больш зручным для карыстальнікаў.
>> Любыя пытанні, то, па GetInts? Да?
[Студэнт пытанне, неразборліва]
>> Добры пытанне. Што рабіць, калі вы толькі што ўвялі ў сімвал, як і F, і націсніце ўвод
ніколі не ўводзіць 1 2 3; што вы думаеце паводзіны гэтага радка кода бы тады?
Так Sscanf можа пакрыць, што таксама, таму што ў гэтым выпадку,
ён не збіраецца запоўніць N або С; ён збіраецца замест вяртання 0.
У такім выпадку, я таксама лавіць гэты сцэнар, таму што чаканае значэнне я хачу 1.
Я хачу толькі 1, і толькі 1 рэч, каб быць запоўненыя. Добры пытанне. Іншыя?
>> Добра, давайце не будзем прайсці праз усе функцыі тут,
але той, які, здаецца, можа быць, тыя, што засталіся працэнты
у GetString, таму што аказваецца, што GetFloat, GetInt,
GetDouble, GetLongLong ўсе пласкадонку шмат іх функцыянальнасць GetString.
Такім чынам, давайце зірнем на тое, як ён рэалізуецца тут.
Гэта выглядае крыху складаным, але ён выкарыстоўвае тыя ж асновы
што мы пачалі гаварыць аб мінулага тыдня. Такім чынам, у GetString,
які не прымае аргументаў, як у пустэчу тут,
і ён вяртае радок, так я абвяшчаю радкі называецца буферам.
Я сапраўды не ведаю, што гэта збіраецца быць выкарыстаны для яшчэ няма, але мы будзем бачыць.
Падобна на тое магутнасці, па змаўчанні 0; не зусім упэўнены, дзе гэта адбываецца.
Не ўпэўнены, што п збіраецца быць выкарыстаны для кліентаў.
Але зараз гэта становіцца трохі больш цікавай, так і ў лініі 243,
мы заяўляем Int C, гэта свайго роду дурныя падрабязна.
Сімвал гэта 8 біт і 8 біт можа захоўваць колькі розных значэнняў?
256. Праблема ў тым, калі вы хочаце мець 256 розных знакаў ASCII,
якое ёсць, калі вы азірнецца назад, і гэта не тое, каб запомніць.
Але калі вы ўспомніце, што вялікая ASCII графіцы мы былі тыдзень таму,
было, у такім выпадку, 128 або 256 ASCII сімвалаў.
Мы выкарыстоўвалі ўсе мадэлі 0 і 1 справа.
Гэта праблема, калі вы хочаце быць у стане выявіць памылку.
Таму што, калі вы ўжо карыстаецеся 256 значэнняў для вашых персанажаў,
Вы сапраўды не планаваць загадзя, таму што цяпер у вас няма магчымасці сказаць,
"Гэта не законна характар, гэта нейкае памылковае паведамленне".
Так што свет робіць гэта, яны выкарыстоўваюць наступны самая вялікая каштоўнасць,
нешта накшталт Int, так што ў вас ёсць вар'яты лік бітаў,
32 на 4 млрд. значэнняў, так што вы можаце проста ў канчатковым выніку, выкарыстоўваючы,
па сутнасці, 257 з іх, 1 з якіх мае некаторы асаблівае значэнне як памылку.
>> Такім чынам, давайце паглядзім, як гэта працуе. У адпаведнасці 246, у мяне ёсць гэты вялікі цыкл пры
, Які выклікае fgetc, е значэнне файла, ЕОКП, а затым стандартнага ўводу.
Аказваецца, гэта ўсяго толькі больш дакладным спосабам сказаць "чытаць ўвод з клавіятуры".
Стандартная клавіятура сродкаў ўвод, стандартны вывад азначае, экран,
і стандартныя памылкі, якія мы ўбачым у PSET 4, азначае, што экран,
але асаблівая частка экрана, так што яна не змешваецца
з фактычным выхадам, што вы прызначаныя для друку, але пра гэта ў будучыні.
Так fgetc проста азначае, што чытаць адзін знак з клавіятуры, і захоўваць яго дзе?
Захоўваеце яго ў C, а затым праверыць, так што я проста выкарыстоўваючы некаторыя лагічныя саюзы тут,
пераканайцеся, што яна не роўная \ п, так што карыстач націсніце ўвод.
Мы хочам спыніць у той момант, канец цыклу, і мы таксама хочам, каб праверыць
для спецыяльных пастаяннай, EOF, якая, калі вы ведаеце ці адгадаць - што гэта азначае?
Канец файла. Так што гэта выгляд бессэнсоўна, таму што, калі я друкую на клавіятуры,
там сапраўды няма файла, якія ўдзельнічаюць у гэтым,
Але гэта ўсяго толькі свайго роду агульны тэрмін, які выкарыстоўваецца для абазначэння
што нічога не прыходзіць з пальца чалавека. EOF. Канец файла.
Як у баку, калі вы калі-небудзь ударыў кіравання D на вашай клавіятуры,
Не, што вы б яшчэ, вы патрапілі кантроль с.
Але кантроль г пасылае гэта адмысловая канстанта называецца EOF.
>> Такім чынам, зараз мы проста ёсць некаторыя дынамічнага размеркавання памяці.
Так што, калі п + 1> магутнасцяў, зараз я растлумачу, с.
п, колькі байт у цяперашні час у буферы,
Радок, вы ў цяперашні час нарошчвання ад карыстальніка.
Калі ў вас ёсць некалькі знакаў у буферы, чым у вас ёсць патэнцыял у буфер,
інтуітыўна, што мы павінны зрабіць, гэта вылучыць больш магутнасці.
Я хачу, каб слізгаць над некаторымі арыфметычнай тут
і засяродзіцца толькі на гэтай функцыі тут.
Вы ведаеце, што таНос ёсць, або па крайняй меры ў цэлым знаёмыя.
Вазьміце здагадку, што пераразмеркаваць робіць. [Студэнт адказ, неразборліва]
>> Так. І гэта не зусім даданне памяці, яна пераразмяркоўвае памяць наступным чынам:
Калі ёсць яшчэ месца ў канцы радка, каб даць вам больш, што памяць
чым гэта першапачаткова дае вам, то вы атрымаеце, што дадатковая памяць.
Такім чынам, вы можаце проста пакласці радкі сімвалаў спіной да спіны, каб спіна да спіны.
Але калі гэта не так, таму што вы занадта доўга чакалі
і нешта выпадковае атрымаў пляснулася ў памяць існуе, але ёсць дадатковы
памяць тут, унізе, гэта нармальна. Realloc будзе рабіць усю цяжкую працу за вас,
перамясціць радок, якую вы чыталі ў так далёка адсюль,
пакласці яго туды, а затым даць вам яшчэ некалькі узлётна-пасадачнай паласы ў гэтай кропцы.
Так што з хваляй боку, дазвольце мне сказаць, што тое, што робіць GetString
яно пачынае з невялікай буфер, можа быць, 1 адзіночны знак,
і калі карыстальнік ўводзіць у 2-х знакаў, GetString заканчваецца
выкліку пераразмеркаваць і кажа: "О, 1 сімвалаў было недастаткова.
Дайце мне 2 знакаў. Тады, калі вы прачыталі логіцы цыклу,
ён збіраецца сказаць: "Ох, карыстач уводзіць у 3 знакаў.
Дайце мне цяпер не 2, а 4-х знакаў, то дай мне 8, то дайце мне 16 і 32.
Той факт, што я падваенне магутнасці кожны раз
азначае, што буфер не будзе расці павольна.
Ён будзе расці супер хуткі, і што магло б быць перавагай, што?
Чаму я падваенне памеру буфера, нават калі карыстач
можа проста патрэбна 1 дадатковы сімвал з клавіятуры?
[Студэнт адказ, неразборліва]. >> Што гэта такое?
Менавіта так. Вы не павінны расці так часта.
І гэта толькі часткова - ты хэджавання стаўкі тут.
Ідэя ў тым, што вы не жадаеце патэлефанаваць пераразмеркаваць шмат, таму што ён мае тэндэнцыю быць павольным.
Кожны раз, калі вы спытаеце аперацыйнай сістэмы для памяці, як вы хутка ўбачыце,
У будучыні пастаўленай задачы, ён імкнецца заняць некаторы час.
Такім чынам, мінімізацыя, што колькасць часу, нават калі вы марнуеце некаторы прастору, як правіла, добра.
>> Але калі мы прачыталі фінальную частку GetString тут,
і зноў, разумеючы, кожная лінія тут не так важна сёння.
Але звярніце ўвагу, што ў канчатковым рахунку выклікае таНос зноў, і ён вылучае
роўна столькі байт, колькі яму трэба для радкі
, А затым выкідвае па тэлефоне свабодна, занадта вялікія буфера,
калі ён сапраўды атрымаў падвоіў занадта шмат разоў.
Карацей кажучы, вось як GetString працаваў ўвесь гэты час.
Усё гэта робіць чытанне аднаго знака ў той час, зноў і зноў і зноў
і кожны раз, калі яна мае патрэбу ў некаторай дадатковай памяці, яна пытае аперацыйнай сістэмы для яе выкліку пераразмеркаваць.
Ёсць пытанні? Добра.
>> Атацы. Цяпер, калі мы разумеем, паказальнікаў, або па крайняй меры
усё больш і больш знаёмыя з паказальнікамі,
давайце разгледзім, як увесь свет пачынае развальвацца
калі вы не зусім абараніць ад спаборнасць карыстальнікаў,
людзі, якія спрабуюць узламаць вашу сістэму.
Людзі, якія спрабуюць выкрасці вашыя праграмы ў абыход некаторых рэгістрацыйны код
што яны маглі б у адваротным выпадку прыйдзецца ўводзіць цалі
Зірніце на гэты прыклад тут, які знаходзіцца ўсяго ў C код
, Які мае функцыю асноўнага ўнізе, якая выклікае функцыю Фу,
і для чаго ён пераходзячы да Foo? [Студэнт] адзін аргумент.
>> Аднаго аргументу. Так ARGV [1], што азначае першае слова, уведзены карыстальнікам
У камандным радку пасля a.out або любой іншай праграмы, называецца.
Так Фу, у верхняй частцы, бярэ ў знак *, а знак * толькі што?
String. Там няма нічога новага тут, і што радкі адвольнай называцца барам.
У гэтай лініі тут, сімвал з [12], у родзе паў-тэхнічнага англійскай мовы, то, што гэтая лінія робіць?
Масіў -? Персанажы. Дайце мне масіў з 12 знакаў.
Такім чынам, мы маглі б назваць гэта буфер. Гэта тэхнічна называецца C, а буфер у праграмаванні
проста азначае, куча прасторы, якія можна пакласці некаторыя рэчы цалі
>> Тады, нарэшце, тетсру, мы не выкарыстоўвалі раней.
Але вы можаце здагадацца, што ён робіць. Ён капіюе памяці.
Што ён робіць? Ну, гэта мабыць капіюе бар, на ўваходзе, у с,
але толькі да даўжыні бар.
Але ёсць памылка тут.
Добра, так што тэхнічна мы сапраўды павінны зрабіць StrLen (бар) х SizeOf (Char), гэта правільна.
Але ў горшым выпадку тут, давайце выкажам здагадку, што that's - значыць, усё ў парадку.
Тады ёсць 2 памылкі. Такім чынам, SizeOf (Char), усё ў парадку, давайце зробім гэта крыху шырэй.
Так што цяпер ёсць яшчэ памылка, што ёсць што?
[Студэнт адказ, неразборліва] >> праверкі для чаго? Такім чынам, мы павінны правяраць
для NULL, таму што дрэнныя рэчы здараюцца, калі ваш паказальнік NULL,
Таму што вы маглі б у канчатковым выніку адбываецца там, і вы ніколі не павінны ісці ў NULL
шляхам разнаймення яго з аператарам *.
Так што добра, а што яшчэ мы робім? Лагічна ёсць недахоп тут.
[Студэнт адказ, неразборліва]
>> Так што праверыць, калі агдс ≥ 2?
Такім чынам, ёсць 3 памылкі ў гэтай праграме.
Мы не правярае, калі карыстальнік набраў на самай справе ні ў чым у ARGV [1], добра.
Так што трэцяя памылка? Да?
[Студэнт адказ, неразборліва] >> Добра.
Такім чынам, мы праверылі адным сцэнары. Мы няяўна праверыць, не капіюйце больш памяці
чым будзе перавышаць даўжыню бара.
Такім чынам, калі радок карыстальнік ўводзіць у складаецца з 10 знакаў,
гэта кажа: «Толькі капіявання 10 знакаў.
І гэта добра, але што рабіць, калі карыстальнік ўводзіць у слова ў радку
як 20 сімвалаў словы, гэта, кажучы копіі 20 сімвалаў з бара у што?
З, інакш вядомы як наш буфер, які азначае, што вы толькі што напісалі дадзеныя
да 8 байт месцаў, якія вам не належаць,
і вы не валодаеце ім у тым сэнсе, што вы ніколі не вылучала іх.
Такім чынам, гэта тое, што звычайна называюць атаку на перапаўненне буфера,
або перапаўненне буфера атаку, і яго атакі ў тым сэнсе, што калі карыстальнік
або праграмы, якая тэлефануе ваша функцыя робіць гэта зламысна,
што на самой справе адбываецца далей можа быць зусім дрэнна.
>> Давайце зірнем на гэтую карціну тут.
Гэтая карціна прадстаўляе свой стэк памяці.
І нагадаем, што кожны раз, калі вы выклікаеце функцыю,
Вы атрымліваеце гэтую маленькую кадраў у стэк, а затым іншы, а затым іншы, а затым другую.
І да гэтага часу мы толькі выгляд гэтых адведзенай прэч, як прастакутнікі
альбо ёсць, на дошцы або на экране тут.
Але калі павялічыць на адзін з гэтых прастакутнікаў,
Пры выкліку функцыі Foo, аказваецца, што гэта яшчэ не ўсё ў стэку
ўнутры гэтага кадра і гэты прастакутнік
чым проста х і у, а і Ь, як мы зрабілі гаворым пра своп.
Аказваецца, што ёсць некаторыя нізкаўзроўневыя дэталі,
Сярод іх зваротнага адрасу.
Вось і атрымліваецца, калі асноўныя называе Фу, асноўная павінен паведаміць Foo
які адрас асноўнага знаходзіцца ў аператыўнай памяці кампутара.
Таму што інакш, як толькі Foo робіцца выкананне, як у дадзеным выпадку тут,
як толькі вы дасягнеце гэтага цеснага фігурнай дужкай ў канцы Фу,
як, чорт вазьмі ніяк Foo ведае, дзе кантроль над праграмай павінна ісці?
Аказваецца, што адказ на гэтае пытанне ў тым, што чырвоны прастакутнік тут.
Гэта ўяўляе сабой паказальнік, і гэта да кампутара для захоўвання, часова,
на так званым стэку адрас асноўнага, так што, як толькі Foo робіцца выкананне,
Кампутар ведае, дзе і якія лініі ў асноўным, каб вярнуцца ў.
Захавана паказальнік кадра ставіцца так жа да гэтага.
Char * бар тут прадстаўляе тое, што?
Ну, а цяпер гэтая сіняя сегмент тут кадр Foo, то што знаходзіцца бар?
Такім чынам, бар проста аргумент функцыі Foo.
>> Так што цяпер мы вярнуліся на знаёмую карціну.
Там больш рэчаў і больш адцягвацца на экране
але гэта блакітны сегмент з'яўляецца тое, што мы былі маляванне на дошцы нешта накшталт падпампоўкі.
Гэта рамка для Foo і адзінае, што ў ёй прама зараз, бар,
якія гэтым параметры.
Але што яшчэ павінна быць у стэку, у адпаведнасці з гэтым кодам тут?
Char C [12]. Такім чынам, мы павінны таксама бачыць 12 квадратаў памяці,
, Што выдзяляюцца на зменную с.
І сапраўды, у нас ёсць, што на экране.
У самым версе ёсць з [0], а затым аўтар гэтай схеме
не турбаваць малявання ўсе квадраты, але на самой справе ёсць 12 маецца
таму што калі вы паглядзіце на ніжнюю правую, з [11], калі лічыць ад 0, 12 такіх байт.
Але вось у чым праблема: у якім кірунку з якая расце?
Выгляд зверху ўніз, ці не так? Калі ён пачынаецца ў верхняй і расце на дно,
Не падобна мы пакінулі сабе шмат узлётна-пасадачнай паласы тут наогул.
Мы відаў афарбаваныя сябе ў кут,
і што з [11] ўшчыльную бары, які знаходзіцца прама супраць паказальніка стэка кадра,
які знаходзіцца прама супраць зваротнага адраса; няма больш месца.
Так у чым жа наступствы, то, калі вы сапсаваць,
а вы паспрабуйце прачытаць 20 байт у 12-байт буфера?
Дзе гэтыя 8 дадатковых байтаў ісці?
Усярэдзіне ўсё астатняе, некаторыя з якіх гэта супер важна.
І самае галоўнае, магчыма, з'яўляецца чырвоная скрынка там, зваротны адрас.
Таму выкажам здагадку, што вы выпадкова ці adversarially
перазапісаць гэтыя 4 байта, што паказальнік адрасы,
не толькі з смеццем, але са шматлікімі, што адбываецца ўяўляюць фактычны адрас у памяці?
Што implicaiton, лагічна?
[Адказы студэнтаў, неразборліва] >> Менавіта так. Калі Foo вяртаецца
і хіты, якія фігурнай дужкай, праграма будзе зыходзіць не вярнуцца да асноўнай,
ён збіраецца вярнуцца ў любы адрас у тым, што чырвоныя скрынкі.
>> Зараз, у выпадку абыходу рэгістрацыі праграмнага забеспячэння,
што гэта адрас які вяртаецца ў гэта функцыя
, Які звычайна выклікаецца пасля таго, як вы заплацілі за праграмнае забеспячэнне і ўводзіцца рэгістрацыйны код?
Вы можаце сартаваць трук кампутар у не збіраемся тут, але замест гэтага збіраюцца тут.
Ці, калі вы сапраўды разумны, супернік сапраўды можа ўвесці на клавіятуры,
Напрыклад, не фактычныя словы, не больш за 20 сімвалаў, але мяркую, што ён ці яна
У некаторых тыпах знакаў, якія прадстаўляюць код?
І гэта не будзе С-код, ён будзе сімвалы
, Якія ўяўляюць сабой двайковы машынны код, 0 і 1.
Але выкажам здагадку, што яны досыць разумныя, каб зрабіць гэта, каб хоць неяк ўставіць у радок GetString
тое, што па сутнасці скампіляваны код,
і апошнія 4 байта перазапісу, што зваротны адрас, і тое, што адрас не што ўваходны рабіць?
Ён захоўвае ў гэтым чырвоным квадраце адрас першых байта буфера.
Такім чынам, вы павінны быць вельмі разумным, і гэта шмат спроб і памылак
для дрэнных людзей там, але калі вы можаце высветліць, наколькі вялікі гэты буфер,
такія, што за апошнія некалькі байт ва ўваходны якія вы дае праграме
апынуцца эквівалентнай адрас пачатку вашага буфера,
Вы можаце зрабіць гэта. Калі мы кажам, як правіла, прывітанне, і \ 0, гэта тое, што трапляе ў буфер.
Але калі мы больш разумныя, і мы запаўняем гэты буфер з тым, што мы называем агульным шкоднасны код,
A, A, A, A: атака, атака, атака, атака, дзе гэта толькі тое, што робіць нешта дрэннае.
Ну, а што здарыцца, калі вы сапраўды разумныя, вы можаце зрабіць гэта:
У чырвонай скрынцы тут паслядоўнасць лікаў: 80, CO, 35, 08.
Звярніце ўвагу, што супадае з колькасцю гэта тут.
Гэта ў зваротным парадку, але пра гэта як-небудзь у іншы раз.
Звярніце ўвагу, што гэты зваротны адрас быў наўмысна зменены
роўным адрасе тут, а не адрас асноўнага.
Такім чынам, калі дрэнны хлопец супер разумны, ён ці яна збіраецца ўключыць у гэты шкоднасны код
нешта накшталт: «Прыбярыце усе файлы карыстальніка.
Або «Скапіяваць паролі" або "Стварэнне ўліковага запісу карыстальніка, што я магу ўвайсці ў.
Усё, што заўгодна, і гэта як небяспека і сілу C.
Таму што ў вас ёсць доступ да памяці праз паказальнікі
і таму вы можаце напісаць усё, што заўгодна ў памяць кампутара.
Вы можаце зрабіць кампутар рабіць усё, што хочуць проста
тое, што скакаць у сваім уласным прасторы памяці.
І так, па гэты дзень, так шмат праграм і так шмат сайтаў, якія аказваюцца пад пагрозай
зводзяцца да людзей скарыстацца гэтым.
І гэта магло б быць падобным на супер-складаных нападаў,
але гэта не заўсёды пачынаюцца менавіта так.
>> Рэальнасць такая, што тое, што дрэнныя людзі, як правіла, зрабіць гэта,
будзь то праграмы ў камандную радок або графічны інтэрфейс праграмы або вэб-сайт,
вам проста пачаць прадастаўленне глупства.
Вы ўводзіце ў сапраўды вялікім слова ў поле пошуку і націснуць кнопку ўводу,
і вы чакаць, каб убачыць, калі сайт аварый.
Ці вы чакаеце, каб убачыць, калі праграма выяўляе некаторы паведамленне пра памылку.
Таму што, калі вам пашанцуе, як дрэнны хлопец,
і вы даць некаторыя вар'яты ўваход, збой праграмы,
гэта азначае, што праграміст не чакае вашага дрэннага паводзінаў
якая азначае, што вы, верагодна, можа з дастатковым высілкам,
Дастаткова спроб і памылак высветліць, як паводзіць больш дакладную атаку.
Такім чынам, як жа неад'емнай часткай бяспекі не толькі пазбегнуць гэтых нападаў у цэлым, але іх выяўлення
а на самай справе, гледзячы на ​​часопісы і бачачы, што вар'ят уваходаў ёсць людзі, уведзеныя ў ваш сайт.
Якія пошукавыя тэрміны людзей ўвялі ў свой сайт у надзеі перапоўненыя некаторыя буфера?
І ўсё гэта зводзіцца да простых асновам таго, што масіў,
і што гэта значыць для выдзялення і выкарыстання памяці?
І звязаныя з гэтым, таксама, заключаецца ў наступным.
>> Так што давайце проста зазірнуць ўнутр жорсткага дыска яшчэ раз.
Такім чынам, вы памятаеце тыдзень ці два таму, што пры перацягванні файлаў
ў кашы або кошыка, што адбываецца?
[Студэнт] Нічога. >> Так, абсалютна нічога. У рэшце рэшт, калі вы запусціце нізкай
на дыску, Windows ці Mac OS пачнецца выдаленне файлаў для вас.
Але калі вы перацягнуць нешта ёсць, то гэта зусім не бяспечна.
Усе вашыя Знаёмствы Пошук Ключавыя словы, адзін або член сям'і павінен зрабіць гэта двойчы клікнуць мышкай, і вуаля.
Там усё адрывістыя файлы, якія вы спрабавалі выдаліць.
Таму большасць з нас па крайняй меры, ведаю, што вы павінны клікнуць правай кнопкай мышы або кантраляваць
і пустой смецце, ці нешта накшталт гэтага.
Але нават тое, што не зусім рабіць сваю справу.
Таму што тое, што адбываецца, калі ў вас ёсць файл на цвёрдым дыску
, Які ўяўляе нейкі дакумент, слова або некалькі JPEG?
І гэта ўяўляе ваш жорсткі дыск, а скажам, гэта стужкі тут прадстаўляе гэты файл,
і ён складаецца з цэлы букет з 0 і 1.
Што адбываецца, калі вы не толькі перацягнуць гэты файл у кошык, ці каша,
але і ачысціць яго?
Накшталт нічога. Гэта не абсалютна нічога не цяпер.
Зараз гэта проста нішто, таму што сёе-тое адбываецца ў форме гэтай табліцы.
Такім чынам, ёсць свайго роду базу дадзеных або табліцу ў памяці кампутара
, Што істотна мае 1 калонкі для імёнаў файлаў,
і 1 слупок для размяшчэння файлаў, дзе гэта можа быць размяшчэнне 123, проста выпадковы лік.
Такім чынам, мы маглі б мець нешта накшталт x.jpg і месцазнаходжанне 123.
І што адбываецца потым, калі вы спустошыць ваш смецце?
Гэта сыходзіць. Але тое, што не знікае, гэта 0 і 1.
>> Так што, то, падлучэнне да PSET 4?
Ну, з PSET 4, толькі таму, што мы выпадкова сцёртыя
кампактныя флэш-карты, што былі ўсе гэтыя фатаграфіі,
ці проста таму, што яго няўдача стала пашкоджаны,
не азначае, што 0 і 1 з'яўляюцца не ўсё яшчэ там.
Можа быць, некаторыя з іх страцілі, таму што нешта сапсаваўся
У тым сэнсе, што некаторым 0 стала 1 і 1 стала 0 '.
Дрэнныя рэчы могуць адбыцца з-за памылкі ў праграмным забеспячэнні ці няспраўнасць абсталявання.
Але шмат хто з тых бітаў, можа быць, нават 100% з іх усё яшчэ там,
гэта проста, што кампутар або камеру не ведае, дзе JPEG 1 пачалася
і дзе JPEG 2 пачалася, але калі вы праграміст,
Ведаеце, з трохі здаровага сэнсу, дзе гэтыя выявы ў фармаце JPEG або тое, што яны выглядаюць,
Вы можаце прааналізаваць 0 і 1, і кажуць: "О-о. JPEG. Ох, JPEG.
Вы можаце напісаць праграму па сутнасці толькі для або падчас цыклу
, Якая аднаўляе кожны з гэтых файлаў.
Так што ўрок такім выпадку, каб пачаць "надзейна" пры спробе ачысціць вашых файлаў
калі вы хочаце, каб пазбегнуць гэтага наогул. Да?
[Студэнт пытанне, неразборліва]
>> Мець больш памяці, чым раней -
О! Добры пытанне. Дык чаму ж тады, пасля апаражнення смецце,
Ваш кампутар скажа вам, што ў вас больш вольнага прасторы, чым вы рабілі раней?
У двух словах, таму што ён хлусіць. Больш тэхнічна, у вас ёсць больш прасторы.
Таму што цяпер вы сказалі, вы можаце пакласці іншыя рэчы, дзе гэты файл быў калісьці,
але гэта не азначае, што біт сыходзіць,
і гэта не значыць, біты мяняюцца ўсе 0, напрыклад, для вашай абароны.
З іншага боку, калі вы "надзейна" сцерці файлы або фізічна знішчыць прыладу,
, Які сапраўды з'яўляецца адзіным спосабам, а часам і вакол гэтага.
Так чаму б нам не пакінуць на гэтым падлозе-страшна запіску, і мы будзем бачыць Вас у панядзелак.
CS50.TV