1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> ПРЕДСЕДНИК 1: Хајде да напише програм који добија низ од корисника без 3 00:00:02,920 --> 00:00:05,700 користећи ЦС50 Библиотека је функционишу ГетСтринг. 4 00:00:05,700 --> 00:00:08,720 Да бисте то урадили, ми ћемо ићи напред и користите сцанф, функција да ГетСтринг 5 00:00:08,720 --> 00:00:10,950 Функција заправо користи испод хаубе. 6 00:00:10,950 --> 00:00:13,780 Али ја ћу то урадити намерно у бугги начин. 7 00:00:13,780 --> 00:00:17,230 Ја ћу да урадим на начин који мислим би било у реду, али се испоставља да 8 00:00:17,230 --> 00:00:19,380 моја претпоставка је да ће бити сасвим, сасвим погрешан. 9 00:00:19,380 --> 00:00:20,800 А у ствари, прилично опасно. 10 00:00:20,800 --> 00:00:24,750 Због грешке попут оног да сам о томе да направи може да се експлоатише од стране противника 11 00:00:24,750 --> 00:00:28,870 тако да ваша машина или ваш програм може се узети преко потенцијално. 12 00:00:28,870 --> 00:00:30,200 >> Почнимо као што следи. 13 00:00:30,200 --> 00:00:33,540 Прво ћемо прогласити нашу жицу, сада иначе познат као цхар звезда, 14 00:00:33,540 --> 00:00:34,750 и зову је с. 15 00:00:34,750 --> 00:00:39,400 Омогућава следећи питати корисника за ниску, као са "стринг молим." И 16 00:00:39,400 --> 00:00:44,250 хајде сада да стринг од корисника користећи сцанф, цитат завршен цитат, "% с." У 17 00:00:44,250 --> 00:00:47,760 Другим речима, хајде да обавести да смо сцанф Не, у ствари, очекујем да добијем стринг 18 00:00:47,760 --> 00:00:48,630 од корисника. 19 00:00:48,630 --> 00:00:50,810 >> Али сада морамо да кажемо сцанф једна друга ствар - 20 00:00:50,810 --> 00:00:53,350 где да ставим ниску која корисник даје. 21 00:00:53,350 --> 00:00:57,840 Па, ја ћу сасвим једноставно почне са зарезом а, наводећи да бих волео 22 00:00:57,840 --> 00:00:59,320 сцанф да стави ту ниску. 23 00:00:59,320 --> 00:01:04,818 Ја поред ћу одштампате нешто као принтф "хвала за% с 24 00:01:04,818 --> 00:01:10,670 косих н зарез. "И као и увек, ја сам ће проћи у стринг, с. 25 00:01:10,670 --> 00:01:14,920 Сада ћемо сачувати, компајлирати, и покренути овај Програм, а видим да не можемо изазвати 26 00:01:14,920 --> 00:01:16,590 Проблем сам предвидео. 27 00:01:16,590 --> 00:01:18,650 >> Направите сцанф-1. 28 00:01:18,650 --> 00:01:20,960 ./сцанф-1. 29 00:01:20,960 --> 00:01:21,830 Стринг молим. 30 00:01:21,830 --> 00:01:25,540 Хајде да пружи нешто слично, "здраво." "Хвала на нулл." Хм, то није 31 00:01:25,540 --> 00:01:26,750 оно што сам очекивао. 32 00:01:26,750 --> 00:01:28,240 Дакле, шта се овде дешава? 33 00:01:28,240 --> 00:01:32,040 >> Па, испоставило се, јер смо прогласили а као цхар звезде, али нисмо 34 00:01:32,040 --> 00:01:36,120 заправо чувају у ова адресу стварни комад меморије, сцанф зар не 35 00:01:36,120 --> 00:01:38,940 имали где да стави ниску да корисник унесе 36 00:01:38,940 --> 00:01:42,510 Заиста, ако корисник требало да сада куцате у много дуже него низ "здраво" 37 00:01:42,510 --> 00:01:46,780 на пример неколико редова текста или неколико пасуса текста, то је сасвим 38 00:01:46,780 --> 00:01:50,280 могуће да ми индукују такозвани сегментација грешка. 39 00:01:50,280 --> 00:01:53,570 >> Јер сцанф неће да знају да Нисам заправо ставили адресу 40 00:01:53,570 --> 00:01:54,610 унутар с. 41 00:01:54,610 --> 00:01:58,000 Уместо тога, она ће видети неку вредност у с, неки образац бита који могу 42 00:01:58,000 --> 00:02:00,910 врло добро бити вредност смеће, постоји само случајно. 43 00:02:00,910 --> 00:02:04,600 И сцанф и даље ће покушати да пишу корисник стринг на ту адресу, 44 00:02:04,600 --> 00:02:08,789 чак и ако је вредност за смеће, који могао заиста изазвати судар. 45 00:02:08,789 --> 00:02:10,130 >> Па како ћемо поправити ово? 46 00:02:10,130 --> 00:02:12,523