[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 млрд, може бути, -2 млрд,
так що ви витрачаєте одну з ваших можливих значень, так що ви можете зробити в світі
що якщо щось піде не так, я поверну це супер велике значення.
Але ви не хочете, щоб користувач друкує щось загадкове, типу 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]