[Powered by Google Translate] [Тыдзень 5]
[David J. малая - Гарвардскі універсітэт]
[Гэта CS50. - CS50.TV]
>> Гэта CS50, 5-я тыдзень.
Сёння і на гэтым тыдні, мы ўводзім трохі свеце судова-медыцынскай экспертызы
ў кантэксце пастаўленай задачы 4.
Сёння будзе скарочана лекцыю, таму што ёсць спецыяльнае мерапрыемства тут пасля.
Таму мы зазірнуць і дражніць як студэнтаў, так і іх бацькоў сёння
з некаторымі з рэчаў, якія на гарызонце.
>> Сярод іх, як у панядзелак, у вас будзе яшчэ некалькі аднакласнікаў.
EDX, Гарвард і новыя онлайн ініцыятыве MIT для OpenCourseWare і больш,
запускае на кампусе Гарвардскага універсітэта ў панядзелак, што азначае прыйшоў панядзелак
Вы будзеце мець, па стане апошніх падліках, 86 тысяч дадатковых аднакласнікаў
хто будзе наступным разам з лекцыямі CS50 і секцыі
і пакрокавыя кіраўніцтва і праблема мностваў.
І як частка гэтага, вы станеце сябрамі першага класа CS50 і цяпер CS50x.
У рамках гэтага цяпер, разумею, што там будуць нейкія станоўчыя моманты, а таксама.
Каб падрыхтавацца да гэтага, для вялікай колькасці студэнтаў,
Дастаткова сказаць, што, хоць у нас ёсць 108 TFs і сертыфікацыі,
гэта не зусім лепшы вучань-настаўнік суадносінах адзін раз мы патрапілі 80000 студэнтаў.
Мы не збіраемся быць сартаванне столькі праблема устанаўліваецца ўручную,
так прадставіла на гэтым тыдні ў задачы набор будзе CS50 праверкі,
які будзе ўтыліту каманднага радка ўнутры прыбора
што вы атрымаеце, як толькі вы абновіце яго ў канцы гэтага тыдня.
Вы будзеце мець магчымасць запускаць каманды, check50, на свой уласны PSET,
і вы атрымаеце імгненную зваротную сувязь адносна таго, ваша праграма з'яўляецца правільнай ці няправільнай
у адпаведнасці з рознымі спецыфікацыямі дызайну, якія мы прадстаўляем.
Больш падрабязна аб гэтым у апісанні мноства праблем.
CS50x аднакласнікі будуць выкарыстоўваць яго.
>> Праблема Set 4 гэта ўсё аб судовай экспертызы,
і гэта PSET быў сапраўды натхнёны некаторыя рэальныя рэчы
якому, калі я быў у аспірантуры я інтэрнаваныя на час
з офісам акруговага пракурора акругі Миддлсекс справы ідуць судова-медыцынскай экспертызы
з іх вядучым судовым следчым.
Што гэта азначала, як я думаю, я ўжо некалькі тыдняў мінулым,
маса Дзяржаўнай паліцыі або іншых ўвойдзе,
яны сыходзяць такія рэчы, як цвёрдыя дыскі і кампакт-дыскі і дыскеты і да т.п.,
і тады мэта офіс экспертызы было высветліць
было, ці не было доказаў нейкі.
Гэта быў Спецыяльная следчая група, так што белых каўнерыкаў злачынствы.
Гэта было больш трывожным роду злачынствах, нічога удзелам некаторых відаў лічбавых носьбітаў.
Аказваецца, што не так шмат людзей пішуць ліст сказаўшы: "Я зрабіў гэта".
Так даволі часта, гэтыя судовыя пошукі не апынуцца ўсе, што шмат садавіны,
але часам людзі будуць пісаць такія лісты.
Так што часам, намаганні былі ўзнагароджаныя.
>> Але даводзіць да гэтага судова PSET, мы будзем прадстаўляць у pset4 трохі графікі.
Вы, напэўна, узяць гэтыя рэчы само сабой разумеецца - JPEG, GIF, і да таго падобнае - у гэтыя дні.
Але калі вы сапраўды думаеце пра гэта, малюнак, гэтак жа, як асоба Роба,
могуць быць змадэляваныя ў выглядзе паслядоўнасці кропак ці пікселяў.
У выпадку твары Роба, ёсць усе віды кветак,
і мы пачалі бачыць асобныя кропкі, інакш вядомы як кропак,
як толькі мы пачалі, каб павялічыць маштаб
Але калі мы спросцім свеце няшмат, і проста сказаць, што гэта тут Роб у чорна-белым,
прадстаўляць чорнае і белае, мы можам проста выкарыстоўваць бінарны.
І калі мы збіраемся выкарыстаць двайковы, 1 або 0, мы можам выказаць гэта ж малюнак
ўсьмешлівы твар Адзежа з гэтай карціны біт.
11000011 ўяўляе белы, белы, чорны, чорны, чорны, чорны, белы, белы.
І гэта не велізарны скачок потым пачынаюць казаць пра маляўнічых фатаграфій,
рэчы, якія вы бачыце на Facebook або ўзяць з сабой лічбавую камеру.
Але, вядома, калі справа даходзіць да кветак, вам трэба больш бітаў.
І вельмі распаўсюджаны ў свеце фатаграфіі з'яўляецца выкарыстанне не з'яўляецца 1-бітны колер,
так як гэта прадугледжвае, але 24-бітны колер, дзе вы фактычна атрымліваеце мільёны кветак.
Так як у выпадку, калі мы павялічана на вочы Роба,
, Што было любую колькасць мільёны розных маляўнічых магчымасцяў.
Такім чынам, мы ўвядзем гэта ў праблеме Set 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 ўяўляюць ABC праз ASCII і да т.п.,
але, у рэшце рэшт, гэта яшчэ толькі 0 і 1.
Такім чынам, людзі проста часам вырашылі вынайсці новы фармат файлаў
дзе яны стандартызацыі, якія мадэлі біт будзе на самой справе маю на ўвазе.
І ў гэтым выпадку тут, людзі, якія распрацаваны растравы фармат
Кажуць, што ў самы першы байт у растравы файл, як пазначаць зрушэнне 0 там,
там будзе некалькі загадкава імем зменнай bfType,
які проста каштуе для растравага тыпу файла, тып файла растравага малюнка заключаецца ў наступным.
Можна зрабіць выснову, магчыма, з другога шэрагу, што зрушэнне 2, байт нумар 2,
мае малюнак з 0 і 1, якая прадстаўляе што? Памер нешта.
І гэта ідзе адтуль.
Такім чынам, у праблеме Set 4, вы будзеце прайшоў праз некаторыя з гэтых рэчаў.
Мы не будзем у канчатковым выніку клопат пра ўсіх з іх.
Але заўважце, гэта пачынае станавіцца цікавым вакол байт 54: rgbtBlue, зялёны і чырвоны.
Калі вы калі-небудзь чулі скарачэнне RGB - чырвоны, зялёны, сіні - гэта спасылка на гэты
таму што аказваецца, можна маляваць ўсе колеры вясёлкі
з некаторай камбінацыяй чырвонага і сіняга і зялёнага.
І на самай справе, бацькі ў зале маглі б узгадаць некаторыя з самых ранніх праектараў.
У гэтыя дні, вы бачыце толькі адзін яркі святло, выходны з аб'ектыва,
Але вернемся ў дзень, у вас чырвоныя лінзы, блакітныя лінзы і зялёныя лінзы,
і разам яны накіраваны на экране і сфармаваў маляўнічую карціну.
І даволі часта, сярэдняй школы і ВНУ будуць мець тыя лінзы
ледзь-ледзь крыва, так што вы былі свайго роду бачым двайныя або патройныя малюнкаў.
Але гэта была ідэя. Вы былі чырвоны і зялёны і сіні святло намаляваць карціну.
І той жа самы прынцып выкарыстоўваецца ў кампутарах.
>> Такім чынам, сярод праблем, то для Вас ў праблеме Set 4 збіраемся быць некалькі рэчаў.
Адным з іх з'яўляецца на самай справе змяніць памер малюнка, каб узяць у карціну 0 і 1,
высветліць, якія кавалкі 0 і 1 уяўляюць тое, што ў структуры, як гэта,
, А затым высветліць, як паўтарыць пікселяў - чырвонага, блюз, зеляніна -
ўнутры так, што, калі карціна выглядае так першапачаткова,
гэта можа выглядаць так, а не пасля гэтага.
Сярод іншых праблем таксама будзе, што вы будзеце перададзены судова малюнак
фактычнага файл з лічбавай камеры.
І на гэтай камеры, калісьці, было цэлая куча фатаграфій.
Задача мы выпадкова сцёртыя або быў вобраз пашкоджаны нейкім чынам.
Дрэнныя рэчы здараюцца з лічбавых камер.
І таму мы хутка скапіяваць усё 0 і 1 з гэтай картай для вас,
захаваць іх усё ў адзін вялікі файл, а затым мы будзем перадаваць іх вам у праблеме Set 4
так што вы можаце напісаць праграму на C, з якім, каб аднавіць усе з тых, JPEG, ідэальна.
І аказваецца, што JPEG, нават калі яны чымсьці складаны фармат файла -
яны значна больш складанай, чым гэта ўсьмешлівы твар тут -
Аказваецца, што кожны JPEG пачынаецца з тых жа мадэляў з 0 і 1.
Такім чынам, выкарыстоўваючы, у канчатковым рахунку, у той час як цыкл або цыкл ці аналагічны,
Вы можаце перабраць усе 0 і 1 у гэтай судовай малюнка,
і кожны раз, калі вы бачыце адмысловы шаблон, які вызначаны ў спецыфікацыі пастаўленай задачы,
Вы можаце выказаць здагадку, вось, з вельмі высокай верагоднасцю, пачала JPEG.
І як толькі вы знойдзеце па той жа схеме некаторы колькасць байт
або кілабайтах або мегабайтах пазней, можна выказаць здагадку, вось другі JPEG,
фота я ўзяў пасля таго, як першы.
Дазвольце мне спыніцца чытаў, што першы файл, пачаць пісаць гэтую новую,
і выхад з вашай праграмы для pset4 будзе цэлых 50 JPEG.
А калі гэта не 50 JPEG, у вас ёсць трохі цыклу.
Калі ў вас ёсць бясконцая колькасць JPEG, у вас ёсць бясконцы цыкл.
Так што таксама будзе даволі распаўсюджаны выпадак.
Дык вось што на гарызонце.
>> Віктарына 0 за намі, разумеюць, на маю электронную пошту, якая нязменна ёсць людзі, якія абодва шчаслівыя,
роду нейтральная, і сумна вакол віктарына 0 раз.
І, калі ласка, дацягнуцца да мяне, галава TF Zamyla, вашы ўласныя TF,
або аднаго з цэнтраў сертыфікацыі, якія вы ведаеце, калі вы хацелі б абмеркаваць, як усё прайшло.
>> Такім чынам, каб вырабіць ўражанне на бацькоў тут, у пакоі, што CS50 бібліятэку?
[Смяецца] Добрая праца.
Што CS50 бібліятэку? Так. >> [Студэнт] Гэта папярэдняга пісьмовага набору кода [неразборліва]
Добра, добра.
Гэта папярэдняга пісьмовага набору кода, які мы напісалі супрацоўнікаў, мы даем вам,
, Што дае некаторыя агульныя функцыянальныя магчымасці,
такія рэчы, як мне атрымаць радок, зразумейце мяне INT - усе функцыі, пералічаныя тут.
>> Пачынаючы з гэтага моманту, мы пачынаем па-сапраўднаму ўзяць гэтыя навучальныя колы прэч.
Мы збіраемся пачаць, каб забраць радок з вас,
Нагадаем які быў усяго толькі сінонім, што фактычны тып дадзеных? >> [Некалькі студэнтаў] Char *.
Char *. Для бацькоў, якія, верагодна, [робіць свісцячы гук]. Гэта добра.
Char *, мы пачнем бачыць на экране ўсё больш, як мы выдаліць радок з нашага лексікону,
па крайняй меры калі справа даходзіць да фактычнага напісання кода.
Акрамя таго, мы будзем адмовіцца ад выкарыстання некаторых з гэтых функцый, як шмат
таму што нашы праграмы збіраюцца атрымаць больш выдасканаленымі.
Замест таго, каб пісаць праграмы, якія сядзяць там з запытам міргаць,
чакання для карыстальніка, каб надрукаваць што-небудзь, вы будзеце атрымліваць вашыя матэрыялы з іншых крыніц.
Напрыклад, Вы будзеце атрымліваць іх з паслядоўнасці бітаў на лакальным цвёрдым дыску.
Вы, а не атрымліваць іх у будучыні ад сеткі,
некаторыя вэб-сайт где-то.
>> Так што давайце адхіліце гэты пласт у першы раз і пацягніце ўверх CS50 Appliance
і гэты файл называецца cs50.h, што вы былі # уключаючы тыдняў,
Але давайце рэальна ўбачыць, што знаходзіцца ўнутры гэтага.
У верхняй частцы файла ў сінім гэта проста цэлая куча каментарыяў:
Інфармацыя ліцэнзавання і гарантыі.
Гэта свайго роду агульную парадыгму ў праграмнае забеспячэнне
таму што шмат праграмнага забеспячэння ў гэтыя дні, што называецца адкрытым зыходным кодам,
Гэта азначае, што нехта напісаў код, і зрабіў гэта ў вольным доступе
Не проста запусціць і выкарыстоўваць, але на самой справе чытаць і змяняць і інтэграваць у сваю працу.
Так вось, што вы выкарыстоўваеце праграмнае забеспячэнне з адкрытым крыніцай, хоць і ў вельмі малой формы.
Калі я пракруціць ўніз міма каментароў, хоць, мы пачынаем бачыць некаторыя больш знаёмыя рэчы.
Звярніце ўвагу на верхнюю тут, што файл cs50.h ўключае ў сябе цэлую кучу файлаў загалоўкаў.
Большасць з іх, мы яшчэ не бачылі, але адзін знаёмы.
Якія з іх мы не бачылі, хоць і ненадоўга, да гэтага часу? >> [Студэнт] Стандартная бібліятэка.
Так, стандартныя бібліятэкі. stdlib.h мае таНос.
Як толькі мы пачалі гаварыць аб дынамічным размеркаванні памяці,
якія мы вернемся на наступным тыдні, а мы пачалі ў тым ліку і файлаў.
Аказваецца, BOOL і праўдзівым і ілжывым на самой справе не існуе ў C такі
калі вы ўключаеце гэты файл тут.
Мы тыдняў былі ў тым ліку stdbool.h
так што вы можаце выкарыстоўваць паняцце лагічнае, праўдзівай ці ілжывай.
Без гэтага, вам прыйдзецца разабрацца падробленых і выкарыстоўваць Int
і проста адвольна лічыць, што 0 з'яўляецца ілжывым і 1 дакладная.
Калі мы пракруціць ўніз далей, вось наша вызначэнне радка.
Аказваецца, як мы ўжо казалі раней, што там, дзе гэтая зорка сапраўды не мае значэння.
Вы нават можаце мець прастору вакол.
Мы ў гэтым семестры было садзейнічанне, так як гэта ясна даць зразумець,
, Што зорка мае справу з тыпам,
але разумею, як агульнага, калі не трохі больш агульнага,
, Каб пакласці яго туды, але функцыянальна гэта тое ж самае.
Але цяпер, калі мы чытаем далей уніз, давайце зірнем на GetInt
таму што мы выкарыстоўвалі, што, магчыма, перш чым што-небудзь яшчэ ў гэтым семестры.
Вось GetInt. Гэта што? >> [Студэнт] прататып. >> Гэта ўсяго толькі прататып.
Часта мы паставілі прататыпы на вяршынях нашых. З файламі,
але вы таксама можаце змясціць прататыпы ў файлы загалоўкаў,. г файлы, як гэта тут
так што калі вы напісаць некалькі функцый, якія вы хочаце, каб іншыя людзі маглі выкарыстоўваць,
які як раз той выпадак з бібліятэкай CS50,
Вы не толькі рэалізаваць свае функцыі ў нешта накшталт cs50.c,
Вы таксама змясціць прататыпы не ў верхняй часткі гэтага файла, але ў верхняй частцы загалоўка файла.
Тады гэты загаловак файла з'яўляецца тое, што сябры і калегі ўключаюць
з № ўключаць у свой уласны код.
Так што ўвесь гэты час вы былі ў тым ліку ўсе гэтыя прататыпы,
эфектыўна ў верхняй частцы вашага файла, але па шляху гэтага # ўключаць механізм,
якія па сутнасці капіюе і ўстаўляе гэты файл у свой уласны.
Вось некаторыя даволі падрабязную дакументацыю.
Мы ў значнай ступені само сабой якія разумеюцца, што GetInt атрымлівае INT,
але, аказваецца, ёсць некаторыя прыватныя выпадкі.
Што рабіць, калі карыстальнік ўводзіць лік, якое занадта вялікі, квинтиллиона,
што проста не можа змясціцца ўнутры Int? Якое чаканае паводзіны?
У ідэале, гэта прадказальна.
Такім чынам, у гэтым выпадку, калі вы на самой справе чытаць дробны шрыфт,
Вы сапраўды будзеце бачыць, што калі радок не можа быць прачытаны, гэта вяртае INT_MAX.
Мы ніколі не казалі пра гэта, але, грунтуючыся на яго капіталізацыю, што гэта магчыма?
[Студэнт] пастаянна. >> Гэта пастаянная.
Гэта нейкая спецыяльная канстанта, якая, верагодна, заявіў у адным з гэтых файлаў загалоўкаў
вось падняцца вышэй у файле, і INT_MAX, верагодна, нешта накшталт прыкладна 2 мільярды,
Ідэя ў тым, што, паколькі мы павінны нейкім чынам азначае, што нешта пайшло не так,
Мы, так, ёсць 4000000000 нумары ў нашым распараджэнні: -2 млрд. да 2 млрд., плюс-мінус.
Ну, тое, што з'яўляецца агульным у праграмаванні ты скраў толькі адзін з гэтых нумароў,
можа быць 0, можа быць, 2 млрд, можа быць, -2000000000,
так што вы марнуеце адну з вашых магчымых значэнняў, так што вы можаце зрабіць у свеце
што калі нешта пойдзе не так, я вярну гэта супер вялікае значэнне.
Але вы не хочаце, каб карыстач друкуе нешта загадкавае, тыпу 234 ..., сапраўды вялікія ліку.
Вы абагульніць яго, а не як канстанту.
Так на самай справе, калі вы былі анальнага апошнія некалькі тыдняў, у любы час вы называлі GetInt,
Вы павінны былі праверыць з умовай, калі карыстач зрабіў тыпу ў INT_MAX,
або, больш канкрэтна, зрабілі GetInt вяртання INT_MAX, таму што калі гэта так,
што на самой справе азначае, што яны не ўводзіце яго. Нешта пайшло не так у гэтым выпадку.
Такім чынам, гэта тое, што звычайна называюць дазорную значэнне, якое проста азначае, асаблівы.
>> Давайце цяпер звернемся ст. Файл з.
Размовы C існавала ў прыбор на некаторы час.
І на самай справе, прыбор мае гэта папярэдне скампіляваныя для вас у гэта рэч, якую мы называлі аб'ектны код,
але гэта проста не мае значэння для вас, дзе гэта таму, што сістэма ведае,
У гэтым выпадку, калі ён: прыбор.
Давайце зараз пракруціць ўніз, каб GetInt і паглядзець, як GetInt працаваў ўвесь гэты час.
Тут у нас ёсць падобныя каментары, чым раней.
Дазвольце мне павялічыць толькі на частку кода.
А што мы маем на GetInt заключаецца ў наступным.
Ён не прымае ніякіх ўваходных дадзеных.
Яна вяртае цэлае, у той час (праўда), так што ў нас ёсць наўмыснае бясконцы цыкл,
але па-відаць, мы вырвацца з гэтага так ці вярнуць з ў гэтым.
>> Давайце паглядзім, як гэта працуе.
Мы, падобна, выкарыстоўваюць GetString ў гэтай першай лініяй ўнутры цыклу, 166.
Цяпер гэта добрая практыка, таму што, пры якіх абставінах можа вярнуцца GetString
адмысловае ключавое слова NULL? >> [Студэнт] Калі нешта пойдзе не так.
Калі нешта пойдзе не так. І тое, што можа пайсці не так, калі вы тэлефануеце нешта накшталт GetString?
Так. >> [Студэнт] Malloc не дае ёй цэлымі.
Так. Можа быць, таНос не атрымоўваецца.
Дзесьці пад капотам, GetString кліча таНос, якая вылучае памяць,
які дазваляе кампутарным краме ўсе знакі
пра тое, што карыстальнік набірае на клавіятуры.
І выкажам здагадку, што карыстач меў шмат вольнага часу і набралі больш, напрыклад,
чым 2 млрд. знакаў, больш сімвалаў, чым кампутар, нават мае RAM.
GetString павінен быць у стане азначае, што да вас.
Нават калі гэта супер, супер рэдкі выпадак куце,
яна павінна нейкім чынам быць у стане справіцца з гэтым,
і так GetString, калі б мы пайшлі назад і прачытайце дакументацыю, у рэчаіснасці NULL вяртанне.
Так што цяпер, калі GetString не атрымоўваецца, вяртаючы NULL, GetInt збіраецца пацярпець няўдачу, вяртаючы INT_MAX
гэтак жа, як дазорцы. Гэта ўсяго толькі чалавечыя канвенцыі.
Толькі так вы б ведалі, што гэта справа, чытаючы дакументацыю.
>> Давайце пракруціць ўніз, туды, дзе Int фактычна атрымалі.
Калі я пракруціць ўніз крыху далей, у лініі 170, у нас ёсць каментар вышэй гэтых ліній.
Мы заяўляем, у 172 Int, п, і сімвал, з, а затым гэтая новая функцыя,
які некаторыя з вас наткнуўся раней, Sscanf.
Гэта азначае радок SCANF.
Іншымі словамі, даць мне радкі, і я буду праверыць яго на кавалкі інфармацыі, якая прадстаўляе цікавасць.
Што гэта значыць?
Выкажам здагадку, што я друкую, літаральна, 123 на клавіятуры, а затым націсніце Enter.
Што такое тып дадзеных з 123, калі вяртаюцца GetString? >> [Студэнт] String.
Відавочна, што гэта радок, ці не так? Я атрымаў радок.
Такім 123 з'яўляецца на самай справе, цытата, канец цытаты, 123 з \ 0 ў канцы яго.
Гэта не Int. Гэта не лік. Гэта выглядае як лік, але гэта не на самай справе.
Такім чынам, што ж GetInt рабіць?
Гэта мае для сканавання гэтага радка злева направа - 123 \ 0 - і нейкім чынам пераўтварыць у фактычных цэлае.
Вы маглі зразумець, як гэта зрабіць.
Калі вы ўспомніце pset2, Вы, верагодна, атрымаў крыху знаёмыя з Цэзарам
або Vigenere, так што вы можаце перамяшчацца па радку, вы можаце канвертаваць знакаў для цэлых лікаў.
Але чорт вазьмі, гэта цэлая вялікая праца.
Чаму б не назваць функцыю, як Sscanf, што робіць гэта для вас?
Так Sscanf чакае аргумент - у гэтым выпадку называецца лінія, якая з'яўляецца радком.
Затым паказваюцца ў двукоссях, вельмі падобны на Printf, што вы чакаеце ўбачыць у гэтай радку.
І тое, што я кажу тут, я чакаю ўбачыць дзесятковы лік і, магчыма, характар.
І мы ўбачым, чаму гэта так, у адзін момант.
І аказваецца, што гэта пазначэнне цяпер нагадвае матэрыял, які мы пачалі казаць пра
крыху больш за тыдзень таму.
Што такое & N і & C робіць для нас тут? >> [Студэнт] Адрас п і адрас з.
Так. Ён даў мне адрас і адрас п с. Чаму гэта так важна?
Вы ведаеце, што з функцыямі ў C, вы заўсёды можаце вярнуць значэнне не мае ніякага значэння наогул.
Вы можаце вярнуць цэлы лік, радок, лік з якая плавае кропкай, сімвал, незалежна, ці вы можаце вярнуцца несапраўднымі,
але вы можаце вярнуць толькі адно максімальна.
Але тут мы хочам Sscanf вярнуць мяне, можа быць, цэлы лік, дзесятковы лік,
а таксама знак, і я растлумачу, чаму знакаў у хвіліну.
Вы хочаце эфектыўна Sscanf вярнуць дзве рэчы, але гэта проста не магчыма ў C.
Вы можаце абыйсці, што, пераходзячы ў два адрасы
таму што як толькі вы перадаць функцыю двух адрасах,
што можна, што функцыя з імі рабіць? >> [Студэнт] Напішыце на гэтыя адрасы.
Ён можа пісаць на гэтыя адрасы.
Вы можаце выкарыстоўваць зорку аперацыю і паехаць туды, да кожнага з гэтых адрасоў.
Гэта свайго роду гэтым заднюю дзверы механізм, але вельмі часта мяняюцца значэння зменных
больш, чым проста адно месца - у дадзеным выпадку, два.
Цяпер я заўважаю праверкі == 1, а затым вяртаюцца п калі гэта, на самой справе, ацаніць да ісціны.
Так што ж адбываецца? Тэхнічна, усе мы сапраўды хочам, адбудзецца ў GetInt гэта.
Мы хочам, каб разабраць, так бы мовіць, мы хочам, каб прачытаць радок - канец цытаты цытаты-123 -
і калі яна выглядае як ёсць шэраг там, што мы гаворым Sscanf рабіць
змяшчаюць гэты лік - 123 - у гэтай зменнай п для мяне.
Дык чаму ж тады я на самой справе гэта так?
Якая роля Sscanf кажуць, што вы можаце таксама атрымаць сімвал тут?
[Неразборліва адказ студэнта] >> дзесятковая кропка на самай справе маглі б працаваць.
Давайце лічыць, што на імгненне задумаўся. Што яшчэ?
[Студэнт] Гэта можа быць NULL. >> Добрая думка. Гэта можа быць нулявы знак.
Гэта на самай справе не ў гэтым выпадку. Так. >> [Студэнт] ASCII.
ASCII. Ці дазвольце мне абагульняць яшчэ далей.
% C існуе толькі для праверкі памылак.
Мы не хочам там быць знак пасля нумары,
але тое, што гэта дазваляе мне зрабіць наступнае.
Аказваецца, што Sscanf, акрамя захоўвання значэнняў у п і с у гэтым прыкладзе,
што ён таксама робіць гэта вяртае колькасць зменных пакласці значэння цалі
Так што калі вы толькі ўводзіце 123, то толькі% D будзе супадаць,
і толькі п атрымлівае захоўваецца на суму, як 123,
і нічога не атрымлівае пакласці ў з.
З застаецца смецце значэнне, так бы мовіць -
смецце, таму што ён ніколі не быў ініцыялізаваны да некаторага значэння.
Так што ў гэтым выпадку, Sscanf вяртае 1, таму што я населены 1 з гэтых паказальнікаў,
У гэтым выпадку вялікая, у мяне ёсць цэлы лік, таму я вызваліць лінію, каб вызваліць памяць
GetString, што на самой справе вылучаецца, а затым я вярнуся п,
яшчэ, калі вы ніколі не задумваліся, дзе гэта Паўтарыць заяву прыходзіць, яна прыходзіць прама адсюль.
Такім чынам, калі, наадварот, я набіраю ў 123foo - толькі некаторыя выпадковыя паслядоўнасці тэксту -
Sscanf будзе бачыць нумар, нумар, нумар, F,
і ён збіраецца паставіць 123 у п; ён збіраецца паставіць е месца ў С, а затым вярнуць 2.
Такім чынам, мы маем, толькі з дапамогай асноўнага вызначэння паводзін Sscanf, у вельмі просты спосаб -
Ну, складаныя, на першы погляд, але ў канцы дня даволі просты механізм -
сказаць ёсць цэлы лік, і калі так, то, што адзінае, што я знайшоў?
І прабелы тут не выпадкова.
Калі вы прачыталі дакументацыю па Sscanf, ён кажа вам, што калі вы ўключаеце частка прабелаў
у пачатку ці ў канцы канцоў, Sscanf занадта дазволіць карыстачу, па якой прычыне,
, Дасягнуў 123 прабел, і гэта будзе законна.
Вы не будзеце крычаць на карыстачоў толькі таму, што яны патрапілі ў прабелу
у пачатку ці ў канцы, які з'яўляецца трохі больш зручным для карыстальнікаў.
>> Любыя пытанні, то на GetInt? Так. >> [Студэнт] Што рабіць, калі вы проста пакласці ў знак?
Добры пытанне.
Што рабіць, калі вы толькі што ўвялі ў сімвал, як F і націсніце Enter, ніколі не набраўшы 123?
Што вы думаеце паводзіны гэтага радка кода бы тады?
[Неразборліва адказ студэнта]
Так, так Sscanf можа пакрыць, што таксама, таму што ў такім выпадку, ён не збіраецца запоўніць п або с.
Гэта будзе замест вяртання 0, у гэтым выпадку я таксама лавіць, што сцэнар
таму што чаканае значэнне я хачу 1.
Я хачу толькі адну і толькі адну рэч, каб быць запоўненыя. Добры пытанне.
>> Іншыя? Добра.
>> Давайце не будзем прайсці праз усе функцыі тут,
але той, які, здаецца, можа быць, з пакінутых цікавасць GetString
таму што аказваецца, што GetFloat, GetInt, GetDouble, GetLongLong
Усе пласкадонку шмат іх функцыянальнасць GetString.
Такім чынам, давайце зірнем на тое, як ён рэалізуецца тут.
Гэта выглядае крыху складаным, але ён выкарыстоўвае тыя ж асновы
што мы пачалі гаварыць аб мінулага тыдня.
У GetString, які не прымае аргументаў, як у пустэчу тут
і вяртае радок, я, здаецца, я аб'яўленні радкі называецца буферам.
Я сапраўды не ведаю, што гэта збіраецца быць выкарыстаны для яшчэ няма, але мы будзем бачыць.
Падобна на тое, магутнасцю па змаўчанні 0.
Не зусім упэўнены, дзе гэта адбываецца, не ўпэўнены, што N будзе выкарыстоўвацца для кліентаў,
але зараз гэта становіцца трохі больш цікавай.
У адпаведнасці 243, мы заяўляем, INT, с.
Гэта свайго роду дурныя падрабязна.
Сімвал гэта 8 біт і 8 біт можа захоўваць колькі розных значэнняў? >> [Студэнт] 256. >> 256.
Праблема ў тым, калі вы хочаце мець 256 розных знакаў ASCII, якія існуюць
Калі вы ўспомніце - і гэта не тое, каб запомніць.
Але калі вы ўспомніце, што вялікая ASCII графіцы мы былі тыдзень таму,
было ў гэтым выпадку 128 або 256 ASCII сімвалаў.
Мы выкарыстоўвалі ўсе мадэлі 0 і 1 ўверх.
Гэта праблема, калі вы хочаце быць у стане выявіць памылку
таму што, калі вы ўжо карыстаецеся 256 значэнняў для вашых персанажаў,
Вы сапраўды не планаваць загадзя, таму што цяпер у вас няма магчымасці сказаць,
гэта не законны характар, гэта нейкае памылковае паведамленне.
Так што свет робіць гэта яны выкарыстоўваюць наступны самая вялікая каштоўнасць, нешта накшталт INT,
так што ў вас вар'ятам колькасцю бітаў, 32, 4 млрд. магчымых значэнняў
так што вы можаце проста канчатковым выніку, выкарыстоўваючы па сутнасці 257 з іх,
1 з якіх мае некаторы асаблівае значэнне як памылку.
>> Такім чынам, давайце паглядзім, як гэта працуе.
У адпаведнасці 246, у мяне ёсць гэты вялікі цыкл, пакуль што выклікае fgetc,
F Значэнне файла, так ЕОКП, а затым стандартнага ўводу.
Аказваецца, гэта ўсяго толькі больш дакладным спосабам сказаць, чытаць ўвод з клавіятуры.
Стандартная клавіятура сродкаў ўвод, стандартны вывад азначае, экран,
і стандартныя памылкі, якія мы ўбачым у pset4, азначае, што экран
але асаблівая частка экрана, так што яна не змешваецца з фактычным выхадам
што вы прызначаныя для друку. Але пра гэта ў будучыні.
Так fgetc проста азначае, што чытаць адзін знак з клавіятуры і захоўваць яго дзе?
Захоўваеце яго ў с.
А потым праверыць - так што я проста выкарыстоўваючы некаторыя Булевы саюзаў тут -
пераканайцеся, што яна не роўная - \ п, так што карыстач націснуў Enter, мы хочам, каб спыніць у той момант,
канец цыклу - і мы таксама хочам, каб праверыць на спецыяльным пастаянным EOF,
, Які, калі вы ведаеце ці здагадваецеся, што гэта азначае? >> [Студэнт] канец файла. >> Канец файла.
Гэта свайго роду бессэнсоўна, таму што калі я друкую на клавіятуры,
там сапраўды няма файла, якія ўдзельнічаюць у гэтым,
Але гэта ўсяго толькі свайго роду агульны тэрмін, які выкарыстоўваецца для абазначэння
што нічога не прыходзіць з пальца чалавека.
EOF - канец файла.
Як у баку, калі вы калі-небудзь ударыў кіравання D на вашай клавіятуры, не тое, што вам давядзецца яшчэ -
Вы патрапілі кіравання C - D кіравання пасылае гэта адмысловая канстанта называецца EOF.
Такім чынам, зараз мы проста ёсць некаторыя дынамічнага размеркавання памяці.
>> Так што, калі (п + 1> магутнасцяў). Зараз я растлумачу, с.
N толькі, колькі байт у цяперашні час у буферы,
Радок, вы ў цяперашні час нарошчвання ад карыстальніка.
Калі ў вас ёсць некалькі знакаў у буферы, чым у вас ёсць патэнцыял у буфер,
Інтуітыўна, што нам трэба зрабіць, гэта вылучыць больш магутнасці.
Так што я буду слізгаць над некаторымі арыфметычнай тут і сканцэнтраваны толькі на гэтай функцыі тут.
Вы ведаеце, што таНос з'яўляецца або, па крайняй меры ў цэлым знаёмыя.
Вазьміце здагадку, што пераразмеркаваць робіць. >> [Студэнт] Дадае памяці.
Гэта не зусім даданне памяці. Яна пераразмяркоўвае памяць наступным чынам.
Калі ёсць яшчэ месца ў канцы радка, каб даць вам больш, што памяць
чым гэта першапачаткова дае вам, то вы атрымаеце, што дадатковая памяць.
Такім чынам, вы можаце проста трымаць пакласці сімвалаў струны спіной да спіны, каб спіна да спіны.
Але калі гэта не так, таму што вы занадта доўга чакалі
і нешта выпадковае атрымаў шлёпнуўся ў памяці ёсць
але ёсць дадатковая памяць тут, унізе, гэта нармальна.
Realloc будзе рабіць усю цяжкую працу за вас,
перамясціць радок, якую вы чыталі ў так далёка адсюль, пакладзеце яго туды,
, А затым даць вам яшчэ некалькі узлётна-пасадачная паласа ў гэтай кропцы.
>> Так што з хваляй боку, дазвольце мне сказаць, што тое, што робіць GetString
яно пачынае з невялікай буфер, можа быць, аднаго характару,
і калі карыстальнік ўводзіць у два знака, GetString сканчаецца выклікам пераразмеркаваць і кажа:
адзін знак не хапала, дай мне два знака.
Тады, калі вы прачыталі логіцы цыклу, яна скажа
карыстач уводзіць у 3 сімвала, дай мне цяпер не 2, а 4-х знакаў,
Затым дайце мне 8, то дайце мне 16 і 32.
Той факт, што я падваенне магутнасці кожны раз
азначае, што буфер не будзе расці павольна, ён будзе расці вельмі хутка.
А што можа быць перавагай, што?
Чаму я падваенне памеру буфера
хоць карыстальнік можа проста трэба адзін дадатковы сімвал з клавіятуры?
[Неразборліва адказ студэнта] >> Што гэта такое? >> [Студэнт] Вы не павінны расці так часта.
Менавіта так. Вы не павінны расці так часта.
І гэта толькі часткова вы хэджавання стаўкі тут,
Ідэя ў тым, што вы не жадаеце патэлефанаваць пераразмеркаваць шмат, таму што ён мае тэндэнцыю быць павольным.
Кожны раз, калі вы спытаеце аперацыйнай сістэмы для памяці,
як вы хутка ўбачыце, у будучыні пастаўленай задачы, ён імкнецца заняць некаторы час.
Такім чынам, мінімізацыя, што колькасць часу, нават калі вы марнуеце некаторы прастору,
як правіла, добра.
>> Але калі мы прачыталі фінальную частку GetString тут -
і зноў разуменні кожны радок тут не так важна сёння -
заўважыць, што ў канчатковым рахунку выклікае таНос раз
і ён вылучае менавіта столькі байт, колькі яму трэба для радкі
, А затым выкідвае па тэлефоне бясплатна празмерна вялікія буфера
калі ён сапраўды атрымаў падвоіў занадта шмат разоў.
Карацей кажучы, вось як GetString працаваў ўвесь гэты час.
Усё гэта робіць чытанне аднаго знака ў той час, зноў і зноў, і зноў,
і кожны раз, калі яна мае патрэбу ў некаторай дадатковай памяці, яна пытае аперацыйнай сістэмы для яе
па тэлефоне пераразмеркаваць.
>> Ёсць пытанні? Добра.
>> Атацы.
Цяпер, калі мы разумеем, паказальнікі або па крайняй меры ўсё больш знаёмым з паказальнікамі,
давайце разгледзім, як увесь свет пачынае развальвацца
калі вы не зусім абараніць ад спаборнасць карыстальнікаў,
людзі, якія спрабуюць узламаць вашу сістэму,
людзі, якія спрабуюць выкрасці вашыя праграмы ў абыход некаторых рэгістрацыйны код
што яны маглі б у адваротным выпадку прыйдзецца ўводзіць цалі
>> Зірніце на гэты прыклад тут, які знаходзіцца ўсяго ў C код, які мае функцыю асноўнага унізе
, Якая выклікае функцыю Foo. І тое, што ён пераход да Foo?
[Студэнт] адзін аргумент. >> [Малая] адзін аргумент.
Так ARGV [1], што азначае, што першае слова, якое карыстальнік ўводзіць у камандным радку
Пасля a.out або любой іншай праграмы, называецца.
Так Foo у верхняй бярэ ў знак *. Але сімвал * толькі што? >> [Студэнт] радок.
[Малая] радкі, так што нічога новага.
Гэты радок ўмоўна называцца барам.
У гэтай лініі тут, сімвал з [12], у родзе паў-тэхнічнага англійскай мовы, то, што гэтая лінія робіць?
[Студэнт] Масіў - >> Масіў? >> [Студэнт] персанажы. >> Персанажы.
Дайце мне масіў з 12 знакаў. Такім чынам, мы маглі б назваць гэта буфер.
Гэта тэхнічна называецца C, а буфер у праграмаванні проста азначае, куча прасторы
што вы можаце змясціць некаторыя рэчы цалі
Тады, нарэшце, тетсру мы не выкарыстоўвалі раней, але вы можаце здагадацца, што ён робіць.
Ён капіюе памяці. Што ён робіць?
Гэта відавочна капіюе бар, на ўваходзе, у з, але толькі да даўжыні бар.
Але ёсць памылка тут. >> [Студэнт] Вы павінны SizeOf характар. >> Добра.
Тэхнічна, мы павінны сапраўды зрабіць StrLen (бар) * SizeOf (Char)). Гэта правільна.
Але ў горшым выпадку тут, давайце выкажам здагадку, што that's -
Добра. Тады ёсць дзве памылкі.
Такім чынам, SizeOf (Char));
Давайце зробім гэта крыху шырэй.
Так што цяпер ёсць яшчэ памылка, што ёсць што? >> [Неразборліва адказ студэнта]
Калі ласка, праверце, ці што? >> [Студэнт] Праверка на NULL.
Мы павінны, як правіла праверкі на NULL таму, што дрэнныя рэчы здараюцца
калі ваш паказальнік NULL, таму што вы маглі б у канчатковым выніку адбываецца там,
і вы ніколі не павінны ісці ў пустое разнаймення яго з зоркай аператара.
Так што гэта добра. А што яшчэ мы робім? Лагічна, што ёсць недахоп тут.
[Студэнт] Калі ласка, праверце, калі агдс з'яўляецца> = 2.
Такім чынам, праверце агдс з'яўляецца> = 2. Такім чынам, ёсць тры памылкі ў гэтай праграме.
Мы сочым праверкі, калі карыстач на самай справе набралі ні ў чым у ARGV [1]. Добра.
Так што трэцяя памылка? Так. >> [Студэнт] C не можа быць досыць вялікі.
Добра. Мы праверылі адзін сцэнар.
Мы няяўна праверыць, не капіюйце больш памяці, чым будзе перавышаць даўжыню бара.
Такім чынам, калі радок карыстальнік ўводзіць у складаецца з 10 знакаў,
гэта кажа капіяваць толькі 10 знакаў. І гэта нармальна.
Але што, калі карыстальнік ўводзіць у слова ў радку, як 20-значны слова?
Гэта кажа копіі 20 сімвалаў з бара у што?
C, інакш вядомы як наш буфер, які азначае, што вы толькі што напісалі дадзеныя
да 8 байт месцаў, якія вам не належаць,
і вы не валодаеце ім у тым сэнсе, што вы ніколі не вылучала іх.
Такім чынам, гэта тое, што звычайна вядома як атака перапаўнення буфера або нападу з перапаўненнем буфера.
І гэта напад ў тым сэнсе, што калі карыстач ці праграма, якая тэлефануе ваша функцыя
робіць гэта зламысна, што на самой справе адбываецца наступнае самай справе можа быць вельмі дрэнна.
>> Такім чынам, давайце зірнем на гэтую карціну тут.
Гэтая карціна прадстаўляе свой стэк памяці.
Нагадаем, што кожны раз, калі вы выклікаеце функцыю вы атрымаеце гэтую маленькую кадра ў стэку
а потым яшчэ і потым яшчэ і яшчэ.
І да гэтага часу, мы толькі выгляд гэтых адведзенай ў выглядзе прастакутнікаў
альбо на дошцы або на экране тут.
Але калі павялічыць на адзін з гэтых прастакутнікаў, пры выкліку функцыі Foo,
Аказваецца, што ёсць больш у стэк ўнутры гэтага фрэйма ў гэтым прамавугольніку
чым проста х і у, а і Ь, як мы зрабілі гаворым пра своп.
Аказваецца, што ёсць некаторыя нізкаўзроўневыя дэталі, сярод іх зваротны адрас.
Вось і атрымліваецца, калі асноўныя называе Фу, асноўная павінен паведаміць Foo
які адрас асноўнага знаходзіцца ў аператыўнай памяці кампутара
таму што інакш, як толькі Foo робіцца выкананне, як у дадзеным выпадку тут,
як толькі вы дасягнеце гэтага замкнёнага фігурнай дужкай ў канцы Фу,
як, чорт вазьмі ніяк Foo ведае, дзе кантроль праграма павінна пайсці?
Аказваецца, што адказ на гэтае пытанне ў гэтым чырвоным квадраце тут.
Гэта ўяўляе сабой паказальнік, і гэта да кампутара для захоўвання часова
на так званым стэку адрас асноўнага, так што, як толькі Foo робіцца выкананне,
Кампутар ведае, дзе і якія лініі ў асноўным, каб вярнуцца ў.
Захавана паказальнік кадра ставіцца так жа да гэтага.
Char * бар тут прадстаўляе тое, што?
Зараз гэты сегмент сіняга вось кадр Foo аўтара. Што такое бар?
Бар з'яўляецца толькі аргументам функцыі Foo.
Так што цяпер мы вярнуліся на выгляд знаёмая карціна.
Там больш рэчаў і больш адцягвацца на экране,
але гэта блакітны сегмент толькі тое, што мы ўжо абапіраючыся на дошцы
нешта накшталт падпампоўкі. Гэта рамка для Foo.
І адзінае, што ў ёй зараз знаходзіцца бар, які з'яўляецца гэтым параметрам.
Але што яшчэ павінна быць у стэку адпаведнасці з гэтым Кодэксам тут?
[Студэнт] сімвал з [12]. >> [Малая] сімвал з [12].
Мы павінны таксама бачыць 12 квадратаў памяці, выдзеленай для зменнай с,
ды і ў нас ёсць, што на экране.
У самым версе ёсць з [0], а затым аўтар гэтай схеме
не турбаваць малявання ўсе квадраты, але на самой справе ёсць 12 маецца
таму што калі вы паглядзіце на ніжнюю правую, з [11], калі лічыць ад 0 займае 12-е такія байт.
Але вось у чым праблема.
У якім кірунку з якая расце?
Выгляд зверху ўніз, калі яна пачынаецца ў верхняй і расце на дно.
Гэта не падобна мы пакінулі сабе шмат узлётна-пасадачнай паласы тут наогул.
Мы відаў афарбаваныя сябе ў кут,
і што з [11] ўшчыльную бары, які знаходзіцца прама супраць Захавана паказальнік кадра,
які знаходзіцца прама супраць зваротнага адрасу. Там няма больш месца.
Так што ж маецца на ўвазе тое, калі вы сапсаваць
а вы паспрабуйце прачытаць 20 байт у 12-байт буфера?
Дзе гэтыя 8 дадатковых байтаў ісці? >> [Студэнт] Усярэдзіне -
Усярэдзіне ўсё астатняе, некаторыя з якіх гэта супер важна.
І самае галоўнае, магчыма, з'яўляецца чырвоная скрынка там, зваротны адрас,
таму выкажам здагадку, што вы выпадкова ці adversarially перапісаць гэтыя 4 байта,
што паказальнік адрасы, а не толькі з смеццем, але з шэрагам
што адбываецца ўяўляюць фактычны адрас у памяці.
Што ўскосна, лагічна? >> [Студэнт] Функцыя збіраецца вярнуцца ў іншае месца.
Менавіта так.
Калі Foo вяртаецца і хіты, якія фігурнай дужкай, праграма будзе працягвацца
Не для вяртання ў галоўнае, ён збіраецца вярнуцца ў любы адрас у тым, што чырвоныя скрынкі.
>> У выпадку абыходу рэгістрацыі праграмнага забеспячэння,
Што рабіць, калі адрас які вяртаецца ў гэта функцыя, якая звычайна выклікаецца
пасля таго як вы заплацілі за праграмнае забеспячэнне і ўводзіцца рэгістрацыйны код?
Вы можаце сартаваць трук кампутар у не збіраемся тут, але замест гэтага збіраюцца тут.
Ці, калі вы сапраўды разумны, супернік сапраўды можа ўвесці з клавіятуры, напрыклад,
Ня фактычнага слова, не больш за 20 сімвалаў, але мяркую, што ён ці яна на самай справе тыпаў
некаторыя сімвалы, якія ўяўляюць сабой код.
І гэта не будзе C код, ён на самай справе будзе сімвалы
, Якія ўяўляюць сабой двайковы код машыны, 0 і 1.
Але выкажам здагадку, што яны досыць разумныя, каб зрабіць гэта,
неяк ўставіць у радок GetString тое, што, па сутнасці скампіляваны код,
і апошнія 4 байта перазапісу, што зваротны адрас.
І тое, што адрас не што ўваходны рабіць?
Гэта на самай справе захоўвае ў гэтым чырвоным квадраце адрас першых байта буфера.
Такім чынам, вы павінны быць вельмі разумным, і гэта шмат спроб і памылак для дрэнных людзей там,
Але калі вы можаце высветліць, наколькі вялікі гэты буфер
такія, што за апошнія некалькі байт ць ўваходным вы дае праграме
апынуцца эквівалентнай адрас пачатку вашага буфера, вы можаце зрабіць гэта.
Калі мы кажам, звычайна прывітанне і \ 0, гэта тое, што трапляе ў буфер.
Але калі мы разумней і мы запаўняем гэты буфер з тым, што мы называем агульным шкоднасны код -
AAA, атака, атака, атака - там, дзе гэта толькі тое, што робіць нешта дрэннае,
Што адбудзецца, калі вы сапраўды разумныя, вы можаце гэта зрабіць.
У чырвонай скрынцы тут паслядоўнасць лікаў - 80, C0, 35, 08.
Звярніце ўвагу, што супадае з колькасцю гэта тут.
Гэта ў зваротным парадку, але пра гэта як-небудзь у іншы раз.
Звярніце ўвагу, што гэты зваротны адрас быў наўмысна зменены
роўным адрасе тут, а не адрас асноўнага.
Такім чынам, калі дрэнны хлопец супер разумны, ён ці яна збіраецца ўключыць у гэты шкоднасны код
нешта накшталт выдаліць усе файлы карыстальніка або капіяваць паролі
або стварыць уліковы запіс карыстальніка, што я магу ўвайсці ў сістэму - наогул нічога.
>> І гэта як небяспека і сілу C.
Таму што ў вас ёсць доступ да памяці праз паказальнікі
і таму вы можаце напісаць усё, што заўгодна ў памяць кампутара,
Вы можаце зрабіць кампутар рабіць усё, што заўгодна
проста тое, што скакаць у сваім уласным прасторы памяці.
І так па сённяшні дзень так шмат праграм і так шмат сайтаў, якія аказваюцца пад пагрозай
зводзяцца да людзей скарыстацца гэтым.
І гэта можа здацца супер складаныя атакі, але гэта не заўсёды пачынаюцца менавіта так.
Рэальнасць такая, што тое, што дрэнныя людзі, як правіла, зрабіць гэта,
будзь то праграмы ў камандную радок або графічны інтэрфейс праграмы або вэб-сайт,
Вы проста пачаць прадастаўленне глупства.
Вы ўводзіце ў сапраўды вялікім слова ў поле пошуку і націсніце Enter,
і вы чакаць, каб убачыць, калі сайт падае
ці вы чакаць, каб убачыць, калі праграма выяўляе некаторыя паведамленні пра памылку
таму што, калі вам пашанцуе, як дрэнны хлопец, і вы даць некаторыя вар'яты ўваход
, Што збой праграмы, гэта азначае, што праграміст не чакае вашага дрэннага паводзінаў,
якая азначае, што вы, верагодна, можа з досыць высілкаў, досыць спроб і памылак,
высветліць, як паводзіць больш дакладную атаку.
Такім чынам, як жа неад'емнай часткай бяспекі не толькі пазбегнуць гэтых нападаў зусім
але выяўленне іх і на самай справе, гледзячы на ​​часопісы
і бачачы, што вар'ят уваходаў ёсць людзі, уведзеныя ў свой сайт,
якія пошукавыя тэрміны людзі набралі на свой сайт
у надзеі перапоўненыя некаторыя буфера.
І ўсё гэта зводзіцца да простых асновам таго, што масіў
і што гэта значыць для выдзялення і выкарыстання памяці.
>> , Якія адносяцца да, што тады таксама гэтага.
Давайце проста зазірнуць ўнутр жорсткага дыска яшчэ раз.
Вы памятаеце, з тыдзень ці два таму, што пры перацягванні файлаў ў кашы або кошыка,
што адбываецца? >> [Студэнт] Нічога. >> Абсалютна нічога, дакладна?
У рэшце рэшт, калі вы запусціце недахопу месца на дыску,
АС Windows ці Mac OS пачнецца выдаленне файлаў для вас.
Але калі вы перацягнуць нешта там, што зусім не бяспечна.
Усе ваш сусед ці сябар або член сям'і павінен зрабіць, двойчы пстрыкніце і, вуаля,
там усё адрывістыя файлы, якія вы спрабавалі выдаліць.
Большасць з нас, па меншай меры, ведаю, што вы павінны правай кнопкай мышы або кіравання націсніце
і пустой смецце ці нешта накшталт гэтага.
Але нават тое, што не зусім зрабіць трук
таму што тое, што адбываецца, калі ў вас ёсць файл на цвёрдым дыску
, Які ўяўляе некаторы дакумент або некалькі JPEG, і гэта з'яўляецца жорсткі дыск,
і скажам, гэта стужкі тут прадстаўляе гэты файл,
і ён складаецца з цэлую кучу 0 і 1.
Што адбываецца, калі вы не толькі перацягнуць файл у сметніцу ці каша
але і ачысціць яго? Накшталт нічога.
Гэта не абсалютна нічога не цяпер.
Зараз гэта проста нішто, таму што сёе-тое адбываецца ў форме гэтай табліцы.
Такім чынам, ёсць свайго роду базу дадзеных або табліцу ў памяці кампутара
, Што істотна мае адзін слупок для файлаў, імёны і адзін слупок для файлаў месца,
дзе гэта можа быць размяшчэнне 123, проста выпадковы лік.
Такім чынам, мы маглі б мець нешта накшталт x.jpeg і размяшчэнне 123.
Што адбываецца потым, калі вы сапраўды спустошыць ваш смецце?
Гэта сыходзіць.
Але тое, што не знікае, гэта 0 і 1.
>> Так у чым жа тады падлучэнне да pset4?
Ну, з pset4, проста таму, што мы выпадкова сцёртыя кампактныя флэш-карты
, Што было ўсе гэтыя фатаграфіі або проста таму, што яго няўдача была пашкоджана
не азначае, што 0 і 1, не ўсё яшчэ там.
Можа быць, некаторыя з іх страцілі, таму што нешта сапсаваўся
У тым сэнсе, што некаторыя 0s сталі 1 і 1с стала 0s.
Дрэнныя рэчы могуць адбыцца з-за памылкі ў праграмным забеспячэнні ці няспраўнасць абсталявання.
Але шмат хто з тых бітаў, можа быць, нават 100% з іх, усё яшчэ там.
Гэта проста, што кампутар або камеру не ведае, дзе JPEG1 пачатку
і дзе JPEG2 пачалося.
Але калі вы праграміст, ведаю, з трохі здаровага сэнсу, дзе гэтыя выявы ў фармаце JPEG з'яўляюцца
або тое, што яны выглядаюць так што вы можаце аналізаваць 0 і 1 і казаць JPEG, JPEG,
Вы можаце напісаць праграму, з асноўным толькі для або падчас цыклу
, Якая аднаўляе кожны з гэтых файлаў.
Так што ўрок з'яўляецца тое, каб пачаць бяспечнага выдалення файлаў
калі вы хочаце, каб пазбегнуць гэтага наогул. Так.
>> [Студэнт] Чаму ён гаворыць на вашым кампутары
што ў вас больш памяці, чым вы рабілі раней?
Мець больш памяці, чым вы рабілі раней - >> [студэнт] падрабязна даступнай памяці.
Ох. Добры пытанне.
Дык чаму ж тады пасля апаражнення смецце ваш кампутар вам сказаць
што ў вас больш вольнага прасторы, чым вы рабілі раней?
У двух словах, таму што ён хлусіць.
Больш тэхнічна, у вас ёсць больш прасторы, таму што цяпер вы сказалі,
Вы можаце змясціць іншыя рэчы, дзе гэты файл быў раней.
Але гэта не азначае, што біт сыходзіць,
і гэта не значыць, біты змяняюцца для ўсіх 0s, напрыклад,
для вашай абароны.
Такім чынам, у адрозненне ад, калі вы надзейна сціраць файлы або фізічна знішчыць прыладу,
, Які сапраўды з'яўляецца адзіным спосабам часам вакол гэтага.
>> Так чаму б нам не пакінуць на гэтым падлозе-страшна запіску, і мы будзем бачыць Вас у панядзелак.
[Апладысменты]
>> [CS50.TV]