[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 миллиарда,
Идея в том, что, поскольку мы должны каким-то образом означает, что что-то пошло не так,
Мы, да, есть 4 миллиарда номера в нашем распоряжении: -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]