1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [Nate Хардисон, Гарвардскі універсітэт] 3 00:00:05,000 --> 00:00:07,000 Гэта CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Некаторыя з найбольш цяжкіх памылак у праграмах C 5 00:00:10,000 --> 00:00:13,000 прыходзяць ад няправільнага кіравання памяццю. 6 00:00:13,000 --> 00:00:15,000 Ёсць вялікая колькасць спосабаў, каб ўкруціць рэчы, 7 00:00:15,000 --> 00:00:17,000 у тым ліку вылучаючы няправільны аб'ём памяці, 8 00:00:17,000 --> 00:00:20,000 забываючы пры ініцыялізацыі зменных, 9 00:00:20,000 --> 00:00:23,000 пісьмовай форме да або пасля заканчэння буфера, 10 00:00:23,000 --> 00:00:25,000 і вызваленне захаваць памяць некалькі разоў. 11 00:00:25,000 --> 00:00:28,000 Сімптомы вар'іруюцца ад збоі 12 00:00:28,000 --> 00:00:30,000 таямніча перазапісаны значэннямі, 13 00:00:30,000 --> 00:00:34,000 Часта на месцах і часах далёкіх ад першапачатковай памылкі. 14 00:00:34,000 --> 00:00:37,000 Адсочванне назіранага праблемы зваротна ў асноўны першапрычыны 15 00:00:37,000 --> 00:00:39,000 можа быць складанай задачай, 16 00:00:39,000 --> 00:00:42,000 але, на шчасце, ёсць карысны праграму пад назвай Valgrind 17 00:00:42,000 --> 00:00:44,000 што можа зрабіць многае, каб дапамагчы. 18 00:00:44,000 --> 00:00:47,000 >> Вы запускаеце праграму пад Valgrind каб 19 00:00:47,000 --> 00:00:50,000 шырокія праверкі дынамічнай памяці асігнаванняў і доступаў. 20 00:00:50,000 --> 00:00:53,000 Калі Valgrind выяўляе праблему, ён дае вам неадкладны, 21 00:00:53,000 --> 00:00:56,000 прамой інфармацыі, якая дазваляе 22 00:00:56,000 --> 00:00:58,000 лягчэй знайсці і выправіць памылку. 23 00:00:58,000 --> 00:01:01,000 Valgrind таксама паведамленні пра менш небяспечныя праблем з памяццю, 24 00:01:01,000 --> 00:01:04,000 такіх як ўцечкі памяці, вылучэнне дынамічнай памяці, 25 00:01:04,000 --> 00:01:07,000 і забыць, каб вызваліць яго. 26 00:01:07,000 --> 00:01:10,000 Падабаецца наш кампілятар, Clang, на наш адладчык, GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind з'яўляецца свабодным праграмным забеспячэннем, і яна ўсталяваная на прыбор. 28 00:01:14,000 --> 00:01:16,000 Valgrind працуе на вашым выкананы файл, 29 00:01:16,000 --> 00:01:20,000 не ваш. або з. ч. файлаў зыходнага кода, 30 00:01:20,000 --> 00:01:23,000 так што вы сабралі апошнюю дату копіі вашай праграмы 31 00:01:23,000 --> 00:01:25,000 выкарыстаннем Clang або зрабіць. 32 00:01:25,000 --> 00:01:28,000 Затым запусціць праграму пад Valgrind можа быць 33 00:01:28,000 --> 00:01:32,000 так просты, як толькі прэфікс стандартнай каманды праграмы са словам Valgrind, 34 00:01:32,000 --> 00:01:35,000 які запускае Valgrind і запускае праграму ўнутры яго. 35 00:01:35,000 --> 00:01:38,000 Пры запуску Valgrind робіць некаторыя складаныя 36 00:01:38,000 --> 00:01:41,000 перетасовывает наладзіць выкананы файл для праверкі памяці, 37 00:01:41,000 --> 00:01:44,000 так што гэта можа заняць крыху, каб устаць і бегчы. 38 00:01:44,000 --> 00:01:48,000 Праграма будзе выконваць нармальна, няхай гэта будзе значна павольней, 39 00:01:48,000 --> 00:01:52,000 і калі ён скончыцца, Valgrind будзе друкаваць справаздачу аб сваёй памяці. 40 00:01:52,000 --> 00:01:58,000 Калі ўсё пойдзе добра, то яна будзе выглядаць прыкладна так: 41 00:01:58,000 --> 00:02:01,000 У гэтым выпадку,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 гэта шлях да праграмы, я хачу бегчы. 43 00:02:04,000 --> 00:02:06,000 І хоць гэта не прымаць ніякіх аргументаў, 44 00:02:06,000 --> 00:02:09,000 калі гэта так я б проста трэка іх у канцы каманды, як звычайна. 45 00:02:09,000 --> 00:02:12,000 Чысты праграма проста дурная маленькая праграма, якую я стварыў 46 00:02:12,000 --> 00:02:15,000 што вылучае месца для блока цэлымі ў кучы, 47 00:02:15,000 --> 00:02:19,000 паставіць некаторыя значэння ў іх, і вызваляе ўвесь блок. 48 00:02:19,000 --> 00:02:23,000 Гэта тое, што вы здымаеце для, без памылак і без уцечак. 49 00:02:23,000 --> 00:02:27,000 >> Іншым важным паказчыкам з'яўляецца агульная колькасць байт вылучаецца. 50 00:02:27,000 --> 00:02:32,000 У залежнасці ад праграмы, калі асігнаванні ў мегабайтах або вышэй, 51 00:02:32,000 --> 00:02:34,000 Вы, верагодна, робіце нешта няправільна. 52 00:02:34,000 --> 00:02:37,000 Вы залішне захоўвання дублікатаў? 53 00:02:37,000 --> 00:02:40,000 Выкарыстоўваеце Ці вы кучу для захоўвання, калі гэта было б лепш выкарыстоўваць стэк? 54 00:02:40,000 --> 00:02:43,000 Такім чынам, памылкі памяці можа быць па-сапраўднаму зло. 55 00:02:43,000 --> 00:02:46,000 Больш за адкрытыя з іх выклікаюць захапляльныя аварыі, 56 00:02:46,000 --> 00:02:49,000 але нават тады яна можа быць цяжка вызначыць 57 00:02:49,000 --> 00:02:51,000 што менавіта прывяло да аварыі. 58 00:02:51,000 --> 00:02:54,000 Больш за падступна, праграма з памяццю памылкі 59 00:02:54,000 --> 00:02:56,000 усё яшчэ можа скампілявана 60 00:02:56,000 --> 00:02:58,000 і ўсё яшчэ можа здавацца правільнай працы 61 00:02:58,000 --> 00:03:01,000 таму што ў вас атрымалася злавіць поспех вялікую частку часу. 62 00:03:01,000 --> 00:03:04,000 Пасля некалькіх "паспяховых вынікаў" 63 00:03:04,000 --> 00:03:07,000 Вы маглі б проста думаю, што крах шчаслівай выпадковасці на кампутары, 64 00:03:07,000 --> 00:03:10,000 але кампутар ніколі не памыляецца. 65 00:03:10,000 --> 00:03:13,000 >> Запуск Valgrind можа дапамагчы вам адсачыць прычыну бачных памылак памяці 66 00:03:13,000 --> 00:03:18,000 а таксама знайсці хаваюцца памылак, якія вы нават не ведалі яшчэ кс. 67 00:03:18,000 --> 00:03:22,000 Кожны раз, калі Valgrind выяўляе праблему, ён выводзіць інфармацыю аб тым, што ён назіраў. 68 00:03:22,000 --> 00:03:24,000 Кожны элемент з'яўляецца даволі кароткім - 69 00:03:24,000 --> 00:03:27,000 Крыніца лінія парушальніка інструкцый, у чым справа, 70 00:03:27,000 --> 00:03:30,000 і трохі інфармацыі аб памяці ўдзельнічаюць - 71 00:03:30,000 --> 00:03:34,000 але часта гэта дастаткова інфармацыі, каб звярнуць вашу ўвагу на правільнае месца. 72 00:03:34,000 --> 00:03:37,000 Вось прыклад з Valgrind працуе на багі праграмы 73 00:03:37,000 --> 00:03:40,000 , Што робіць несапраўдным чытання дынамічнай памяці. 74 00:03:40,000 --> 00:03:49,000 Мы не бачым ніякіх памылак або папярэджанняў ў кампіляцыю. 75 00:03:49,000 --> 00:03:53,000 Ой-ой, памылка Агульны кажа, што ёсць дзве памылкі - 76 00:03:53,000 --> 00:03:56,000 2 несапраўдным чытанняў памерам 4 - байт, то ёсць. 77 00:03:56,000 --> 00:04:01,000 Абодва дрэнна чытае адбылася ў асноўнай функцыяй invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 першым на лініі 16, а другі на лініі 19. 79 00:04:04,000 --> 00:04:06,000 Давайце паглядзім на код. 80 00:04:06,000 --> 00:04:11,000 Падобна на тое, што першы выклік Printf спрабуе прачытаць адну Int мінулым канца нашага блока памяці. 81 00:04:11,000 --> 00:04:13,000 Калі мы азірнемся на выхадзе Valgrind, у 82 00:04:13,000 --> 00:04:16,000 мы бачым, што Valgrind сказаў нам менавіта гэта. 83 00:04:16,000 --> 00:04:19,000 Адрас мы спрабуем чытаць пачынае 0 байт 84 00:04:19,000 --> 00:04:22,000 у канцы мінулага блок памерам 16 байта - 85 00:04:22,000 --> 00:04:25,000 4 32-разрадных цэлых лікаў, што мы далі. 86 00:04:25,000 --> 00:04:29,000 Гэта значыць, адрасы мы спрабавалі прачытаць пачынаецца ў самым канцы нашага блока, 87 00:04:29,000 --> 00:04:32,000 гэтак жа, як мы бачым у нашых дрэнных Printf выкліку. 88 00:04:32,000 --> 00:04:36,000 Цяпер, несапраўднымі чытанняў не здаецца, што буйныя здзелкі, 89 00:04:36,000 --> 00:04:39,000 Але калі вы выкарыстоўваеце гэтыя дадзеныя для кіравання патокам ваша праграма - 90 00:04:39,000 --> 00:04:42,000 Напрыклад, як частка, калі заява або пятля - 91 00:04:42,000 --> 00:04:45,000 Затым рэчы могуць моўчкі ідуць дрэнна. 92 00:04:45,000 --> 00:04:47,000 Глядзіце, як я магу запусціць праграму invalid_read 93 00:04:47,000 --> 00:04:50,000 і нічога незвычайнага не адбываецца. 94 00:04:50,000 --> 00:04:52,000 Страшна, так? 95 00:04:52,000 --> 00:04:56,000 >> Цяпер, давайце паглядзім на некалькі відаў памылак, якія могуць паўстаць у кодзе, 96 00:04:56,000 --> 00:04:59,000 і мы ўбачым, як Valgrind выяўляе іх. 97 00:04:59,000 --> 00:05:01,000 Мы толькі што бачылі прыклад invalid_read, 98 00:05:01,000 --> 00:05:04,000 так што цяпер давайце паглядзім invalid_write. 99 00:05:04,000 --> 00:05:09,000 Зноў жа, ніякіх памылак або папярэджанняў ў кампіляцыю. 100 00:05:09,000 --> 00:05:12,000 Добра, Valgrind кажа, што ёсць дзве памылкі ў гэтай праграме - 101 00:05:12,000 --> 00:05:15,000 і invalid_write і invalid_read. 102 00:05:15,000 --> 00:05:18,000 Давайце праверым гэты код. 103 00:05:18,000 --> 00:05:21,000 Падобна на тое, што ў нас ёсць асобнік класічнага StrLen плюс адна памылка. 104 00:05:21,000 --> 00:05:24,000 Кодэкс не таНос дадатковы байт прасторы 105 00:05:24,000 --> 00:05:26,000 для / 0 характару, 106 00:05:26,000 --> 00:05:30,000 таму, калі копія вул пайшла пісаць на ssubstrlen "CS50 камяні!" 107 00:05:30,000 --> 00:05:33,000 ён напісаў 1 байт ў канцы мінулага нашага блока. 108 00:05:33,000 --> 00:05:36,000 Invalid_read прыходзіць тады, калі мы звяртаемся да Printf. 109 00:05:36,000 --> 00:05:40,000 Printf сканчаецца чытаннем несапраўдным памяці пры чытанні / 0 сімвалаў 110 00:05:40,000 --> 00:05:43,000 як гэта выглядае ў канцы гэтай струны гэта друк. 111 00:05:43,000 --> 00:05:45,000 Але ўсё гэта не пазбег Valgrind. 112 00:05:45,000 --> 00:05:48,000 Мы бачым, што ён злоўлены invalid_write як частка вул копію 113 00:05:48,000 --> 00:05:51,000 у радку 11 асноўных і invalid_read з'яўляецца часткай Printf. 114 00:05:51,000 --> 00:05:54,000 Rock On, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Зноў жа, гэта можа здацца не мае вялікага значэння. 116 00:05:57,000 --> 00:06:00,000 Мы можам запусціць гэтую праграму зноў і зноў па-за Valgrind 117 00:06:00,000 --> 00:06:03,000 і не бачу ніякай памылкі сімптомаў. 118 00:06:03,000 --> 00:06:06,000 >> Тым не менш, давайце паглядзім на невялікае змяненне гэтага, каб убачыць 119 00:06:06,000 --> 00:06:09,000 як рэчы могуць стаць вельмі дрэнна. 120 00:06:09,000 --> 00:06:14,000 Так што, праўда, мы злоўжыванне рэчаў больш, чым проста трохі ў гэтым кодзе. 121 00:06:14,000 --> 00:06:17,000 Мы толькі выдзялення месца ў дынамічнай памяці для двух радкоў 122 00:06:17,000 --> 00:06:19,000 Даўжыня CS50 парод, 123 00:06:19,000 --> 00:06:22,000 на гэты раз, памятаючы / 0 характару. 124 00:06:22,000 --> 00:06:25,000 Але тады мы кідаем ў супер-доўгая радок у блоку памяці 125 00:06:25,000 --> 00:06:27,000 што S вызначае. 126 00:06:27,000 --> 00:06:30,000 Які эфект будзе, што ёсць на блок памяці, што T паказвае на? 127 00:06:30,000 --> 00:06:34,000 Ну, калі T паказвае на памяць, што проста побач з S, 128 00:06:34,000 --> 00:06:37,000 наступныя толькі пасля гэтага, 129 00:06:37,000 --> 00:06:39,000 Затым мы маглі б напісана над часткай T. 130 00:06:39,000 --> 00:06:41,000 Давайце запусцім гэты код. 131 00:06:41,000 --> 00:06:43,000 Паглядзіце, што адбылося. 132 00:06:43,000 --> 00:06:47,000 Мы радкоў захоўваецца ў нашай кучы блокаў як уяўляецца, належным чынам не друкуецца. 133 00:06:47,000 --> 00:06:49,000 Нішто, здаецца, у корані памылковая. 134 00:06:49,000 --> 00:06:52,000 Тым не менш, давайце вернемся ў наш код і 135 00:06:52,000 --> 00:06:55,000 закомментируйте радок, дзе мы капіяваны CS50 парод 136 00:06:55,000 --> 00:06:59,000 ў другой блок памяці, на які паказвае тон. 137 00:06:59,000 --> 00:07:02,000 Цяпер, калі мы запусцім гэты код, мы павінны 138 00:07:02,000 --> 00:07:06,000 Толькі ўбачыць змесціва першага блока памяці раздрукаваць. 139 00:07:06,000 --> 00:07:09,000 Ух ты, нават калі мы гэтага не зрабілі, вул копію 140 00:07:09,000 --> 00:07:12,000 любыя сімвалы, у другім блоку куча, на якую паказвае T, 141 00:07:12,000 --> 00:07:15,000 мы атрымліваем друк. 142 00:07:15,000 --> 00:07:18,000 Сапраўды, радок, якую мы запраўленыя ў нашым першым блоку 143 00:07:18,000 --> 00:07:21,000 захапілі першы блок, а ў другім блоку, 144 00:07:21,000 --> 00:07:23,000 робіць усё здаецца нармальным. 145 00:07:23,000 --> 00:07:26,000 Valgrind, аднак, кажа нам праўду. 146 00:07:26,000 --> 00:07:28,000 Там мы ідзем. 147 00:07:28,000 --> 00:07:32,000 Усе гэтыя несапраўдным чытае і піша. 148 00:07:32,000 --> 00:07:36,000 >> Давайце паглядзім на прыклад іншага роду памылкі. 149 00:07:36,000 --> 00:07:39,000 Тут мы робім нешта даволі няўдала. 150 00:07:39,000 --> 00:07:41,000 Мы захапіць прастору для Int ў кучы, 151 00:07:41,000 --> 00:07:45,000 і мы ініцыялізуем паказальнік Int - P - паказаць на гэта прастора. 152 00:07:45,000 --> 00:07:48,000 Тым не менш, у той час як наш паказальнік ініцыялізуецца, 153 00:07:48,000 --> 00:07:52,000 дадзеныя, якія ён паказвае толькі мае ўсе барахло знаходзіцца ў той частцы кучы. 154 00:07:52,000 --> 00:07:55,000 Таму, калі мы загрузіць дадзеныя ў Int я, 155 00:07:55,000 --> 00:07:57,000 Мы тэхнічна ініцыялізацыі я, 156 00:07:57,000 --> 00:08:00,000 але мы робім гэта з непажаданых дадзеных. 157 00:08:00,000 --> 00:08:03,000 Выклік сцвярджаюць, што гэта зручны макрас адладкі 158 00:08:03,000 --> 00:08:06,000 вызначаны ў трапна назваў сцвярджаюць, бібліятэкі, 159 00:08:06,000 --> 00:08:09,000 перапыніць праграму, калі яе тэст ўмова не выконваецца. 160 00:08:09,000 --> 00:08:11,000 Гэта значыць, калі я не роўна 0. 161 00:08:11,000 --> 00:08:14,000 У залежнасці ад таго, што было ў кучы прастору, на якое паказвае р, 162 00:08:14,000 --> 00:08:18,000 гэтая праграма можа працаваць часам і не ў іншы час. 163 00:08:18,000 --> 00:08:20,000 Калі гэта працуе, мы проста пашанцавала. 164 00:08:20,000 --> 00:08:24,000 Кампілятар не будзе лавіць гэтую памылку, але ўпэўнены, Valgrind волі. 165 00:08:24,000 --> 00:08:28,000 Там мы бачым памылкі, якія вынікаюць з нашага выкарыстання, што непажаданыя дадзеныя. 166 00:08:28,000 --> 00:08:32,000 >> Пры выдзяленні дынамічнай памяці, але не вызваляе яго ці вызваліць яго, 167 00:08:32,000 --> 00:08:34,000 што называецца ўцечка. 168 00:08:34,000 --> 00:08:37,000 Для невялікі, нядоўгай праграма, якая запускаецца і тут жа выходзіць, 169 00:08:37,000 --> 00:08:39,000 Уцечкі даволі бясшкодныя, 170 00:08:39,000 --> 00:08:42,000 але для праектаў большага памеру і / або даўгавечнасць, 171 00:08:42,000 --> 00:08:46,000 нават невялікія уцечкі могуць скласці ў нешта маёра. 172 00:08:46,000 --> 00:08:49,000 Для CS50, мы чакаем, што вы 173 00:08:49,000 --> 00:08:51,000 клапаціцца аб вызваляючы ўсе кучы памяці, якія вы вылучаеце, 174 00:08:51,000 --> 00:08:54,000 так як мы хочам, каб вы развіваць навыкі правільна звяртацца з ручной працэс 175 00:08:54,000 --> 00:08:56,000 патрабуецца C. 176 00:08:56,000 --> 00:08:59,000 Каб зрабіць гэта, ваша праграма павінна мець дакладную 177 00:08:59,000 --> 00:09:03,000 адно-адназначнае адпаведнасць паміж таНос і бясплатныя званкі. 178 00:09:03,000 --> 00:09:06,000 На шчасце, Valgrind можа дапамагчы вам з уцечкамі памяці таксама. 179 00:09:06,000 --> 00:09:09,000 Вось вынікаючай праграму пад назвай leak.c, што вылучае 180 00:09:09,000 --> 00:09:13,000 прасторы ў кучы, піша ён, але не вызваліць яго. 181 00:09:13,000 --> 00:09:16,000 Мы скампіляваць яго з Марка і запусціць яго пад Valgrind, 182 00:09:16,000 --> 00:09:18,000 і мы бачым, што, хоць у нас няма ніякіх памылак памяці, 183 00:09:18,000 --> 00:09:20,000 у нас ёсць адна ўцечка. 184 00:09:20,000 --> 00:09:23,000 Ёсць 16 байт вызначана страціў, 185 00:09:23,000 --> 00:09:27,000 Гэта азначае, што паказальнік на гэтую памяць не была ў рамкі, калі праграма завершыцца. 186 00:09:27,000 --> 00:09:30,000 Цяпер, Valgrind не дае нам масу інфармацыі аб уцечцы, 187 00:09:30,000 --> 00:09:35,000 Але калі мы будзем прытрымлівацца гэтай невялікай запісцы, што ён дае ўніз, да ніжняй часткі яго дакладу 188 00:09:35,000 --> 00:09:38,000 перазапусціць з - уцечка праверыць = поўны 189 00:09:38,000 --> 00:09:41,000 , Каб убачыць поўную інфармацыю аб ўцечка памяці, 190 00:09:41,000 --> 00:09:44,000 мы атрымаем больш інфармацыі. 191 00:09:44,000 --> 00:09:46,000 Зараз, у кучу рэзюмэ, 192 00:09:46,000 --> 00:09:50,000 Valgrind кажа нам, дзе памяць, што было страчана было першапачаткова выдзелена. 193 00:09:50,000 --> 00:09:52,000 Гэтак жа, як мы ведаем, ад пошуку ў зыходным кодзе, 194 00:09:52,000 --> 00:09:55,000 Valgrind паведамляе нам, што мы ўцечка памяці 195 00:09:55,000 --> 00:09:58,000 вылучаецца з заклікам таНос на лініі 8 з leak.c 196 00:09:58,000 --> 00:10:00,000 У асноўныя функцыі. 197 00:10:00,000 --> 00:10:02,000 Даволі выдатны. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind класіфікуе уцечак з дапамогай гэтых тэрмінаў: 199 00:10:04,000 --> 00:10:07,000 Вызначана страцілі - гэта дынамічнай памяці 200 00:10:07,000 --> 00:10:10,000 у якім праграма не мае паказальніка. 201 00:10:10,000 --> 00:10:14,000 Valgrind ведае, што ты калісьці быў паказальнік, але з тых часоў страціў яго. 202 00:10:14,000 --> 00:10:17,000 Гэтая памяць вызначана ўцечка. 203 00:10:17,000 --> 00:10:20,000 Ускосна страцілі - гэта дынамічнай памяці 204 00:10:20,000 --> 00:10:24,000 да якой толькі паказальнікі да яго таксама будуць страчаныя. 205 00:10:24,000 --> 00:10:27,000 Напрыклад, калі вы страцілі ваш паказальнік на першы вузел звязанага спісу, 206 00:10:27,000 --> 00:10:30,000 Затым першае вузел сам бы вызначана страціў, 207 00:10:30,000 --> 00:10:34,000 у той час як ва ўсіх вузлах будзе ўскосна страціў. 208 00:10:34,000 --> 00:10:37,000 Магчыма, страціў - гэта дынамічнай памяці 209 00:10:37,000 --> 00:10:41,000 да якой Valgrind не можа быць упэўнены, ці ёсць паказальнік ці не. 210 00:10:41,000 --> 00:10:44,000 Тым не менш дасягальным з'яўляецца дынамічнай памяці 211 00:10:44,000 --> 00:10:47,000 да якога праграма па-ранейшаму мае паказальнік на выхадзе, 212 00:10:47,000 --> 00:10:50,000 Звычайна гэта азначае, што глабальная пераменная паказвае на гэта. 213 00:10:50,000 --> 00:10:53,000 Каб праверыць гэтыя ўцечкі, вы таксама павінны ўключыць опцыю 214 00:10:53,000 --> 00:10:55,000 - Усё яшчэ дасягальная = ды 215 00:10:55,000 --> 00:10:58,000 У вашым выкліку Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Гэтыя розныя выпадкі могуць спатрэбіцца розныя стратэгіі для ачысткі іх, 217 00:11:01,000 --> 00:11:05,000 але ўцечкі павінны быць ліквідаваны. 218 00:11:05,000 --> 00:11:08,000 На жаль, фіксуючы уцечкі можа быць цяжка зрабіць, 219 00:11:08,000 --> 00:11:11,000 З няправільныя выклікі бясплатна можна падарваць вашу праграму. 220 00:11:11,000 --> 00:11:14,000 Напрыклад, калі мы паглядзім на invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 мы бачым прыклад дрэннага вызвалення памяці. 222 00:11:18,000 --> 00:11:21,000 Якім павінна быць ні аднаго званка, каб вызваліць ўвесь блок 223 00:11:21,000 --> 00:11:24,000 памяці, на якую паказвае int_block, 224 00:11:24,000 --> 00:11:27,000 замест гэтага стала спроба вызваліць кожны Int памеру падзелу 225 00:11:27,000 --> 00:11:29,000 ў памяці асобна. 226 00:11:29,000 --> 00:11:32,000 Гэта катастрафічна не атрымаецца. 227 00:11:32,000 --> 00:11:34,000 Boom! Якія памылкі. 228 00:11:34,000 --> 00:11:36,000 Гэта, безумоўна, не ёсць добра. 229 00:11:36,000 --> 00:11:39,000 Калі вы затрымаліся з такой памылкай, хоць, і вы не ведаеце, дзе шукаць, 230 00:11:39,000 --> 00:11:41,000 падаць назад на ваш новы лепшы сябар. 231 00:11:41,000 --> 00:11:44,000 Вы ўжо здагадаліся - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, як заўсёды, дакладна ведае, у чым справа. 233 00:11:47,000 --> 00:11:50,000 Ідэнтыфікатар і бясплатна разлічвае не супадаюць. 234 00:11:50,000 --> 00:11:52,000 Мы атрымалі 1 ідэнтыфікатар і 4 вызваляе. 235 00:11:52,000 --> 00:11:55,000 І Valgrind таксама кажа нам, дзе першы званок бясплатны дрэнна - 236 00:11:55,000 --> 00:11:58,000 той, які выклікаў разбурэння - ідзе ад - 237 00:11:58,000 --> 00:12:00,000 радок 16. 238 00:12:00,000 --> 00:12:03,000 Як бачыце, дрэнна званкоў, каб вызваліць сапраўды дрэнныя, 239 00:12:03,000 --> 00:12:05,000 таму мы рэкамендуем дазваляючы вашай праграме ўцечкі 240 00:12:05,000 --> 00:12:08,000 у той час як вы працуеце на атрыманне функцыянальных правільна. 241 00:12:08,000 --> 00:12:12,000 Пачніце шукаць уцечку толькі пасля таго, як ваша праграма працуе правільна, 242 00:12:12,000 --> 00:12:14,000 без якіх-небудзь іншых памылак. 243 00:12:14,000 --> 00:12:16,000 >> І гэта ўсё, што ў нас ёсць для гэтага відэа. 244 00:12:16,000 --> 00:12:18,000 Цяпер, што ж вы чакаеце? 245 00:12:18,000 --> 00:12:21,000 Перайсці запусціць Valgrind вашых праграм прама цяпер. 246 00:12:21,000 --> 00:12:25,000 Мяне клічуць Нейт Хардисон. Гэта CS50. [CS50.TV]