Разработка приложений в среде Linux - [23]

Шрифт
Интервал

>41:  printf("7: %s\n", global);

>42:

>43:  return 0;

>44: }

>45:

>46: int main (void) {

>47:  return broken();

>48: }

В этой главе мы рассмотрим проблемы в показанном выше сегменте кода. Этот код разрушает три типа областей памяти: память, выделенную из динамического пула памяти (кучи) с помощью >malloc(), локальные переменные размещенные в стеке программы и глобальные переменные, хранящиеся в отдельной области памяти, которая была статически распределена при запуске программы[9]. Для каждого класса памяти эта тестовая программа выполняет запись за пределами зарезервированной области памяти (по одному байту) и также сохраняет байт непосредственно перед зарезервированной областью. К тому же в коде имеется утечка памяти, что позволит продемонстрировать, как с помощью различных средств отследить эти утечки.

Несмотря на то что в представленном коде кроется много проблем, в действительности, он работает нормально. Не означает ли это, что проблемы подобного рода не важны? Ни в коем случае! Переполнение буфера часто приводит к неправильному поведению программы задолго до фактического его переполнения, а утечки памяти в программах, работающих длительное время, приводят к пустой растрате ресурсов компьютера. Более того, переполнение буфера является классическим источником уязвимостей безопасности, как описано в главе 22.

Ниже показан пример выполнения программы.

>$ gcc -Wall -о broken broken.с

>$ ./broken

>1: 12345

>2: 12345678

>3: 12345678

>4: 12345

>5: 12345

>6: 12345

>7: 12345

7.2. Средства проверки памяти, входящие в состав >glibc

Библиотека GNU С (>glibc) предлагает три простых средства проверки памяти. Первые два — >mcheck() и >MALLOC_CHECK_ — вызывают проверку на непротиворечивость структуры данных кучи, а третье средство — >mtrace() — выдает трассировку распределения и освобождения памяти для дальнейшей обработки.

7.2.1. Поиск повреждений кучи

Когда память распределяется в куче, функциям управления памятью необходимо место для хранения информации о распределениях. Таким местом является сама куча; это значит, что куча состоит из чередующихся областей памяти, которые используются программами и самим функциями управления памятью. Это означает, что переполнения или недополнение буфера может фактически повредить структуру данных, которую отслеживают функции управления памятью. В такой ситуации есть много шансов, что сами функции управления памятью, в конце концов, приведут к сбою программы.

Если вы установили переменную окружения >MALLOC_CHECK_, выбирается другой, несколько более медленный набор функций управления памятью. Этот набор более устойчив к ошибкам и может обнаруживать ситуации, когда >free() вызывается более одного раза для одного и того же указателя, а также когда происходят однобайтные переполнения буфера. Если >MALLOC_CHECK_ установлена в >0, функции управления памятью просто более устойчивы к ошибкам, но не выдают никаких предупреждений. Если >MALLOC_CHECK_ установлена в >1, функции управления памятью выводят предупреждения о стандартных ошибках при замеченной проблеме. Если >MALLOC_CHECK_ установлена в >2, функции управления памятью вызывают >abort(), когда замечают проблемы.

Установка >MALLOC_CHECK_ в >0 может оказаться полезной, если вам мешает найти ошибку в памяти другая ошибка, которую в этот момент исправить нет возможности; эта установка позволяет работать с другими средствами отслеживания ошибок памяти.

Установка >MALLOC_CHECK_ в >1 полезна в случае, когда никаких проблем не видно, поэтому определенные уведомления могут помочь.

Установка >MALLOC_CHECK_ в >2 наиболее полезна при работе в отладчике, поскольку при возникновении ошибки он позволяет выполнить обратную трассировку вплоть до функций управления памятью. В результате вы максимально приблизитесь к месту возникновения ошибки.

>$ MALLOC_CHECK_=1 ./broken

>malloc: using debugging hooks

>malloc: используются отладочные функции

>1: 12345

>free(): invalid pointer 0x80ac008!

>free(): недопустимый указатель 0x80ac008!

>2: 12345678

>3: 12345678

>4: 12345

>5: 12345

>6: 12345

>7: 12345

>$ MALLOC_CHECK_=2 gdb ./broken

>...

>(gdb) run

>Starting program: /usr/src/lad/code/broken

>Запуск программы: /usr/src/lad/code/broken

>1: 12345

>Program received signal SIGABRT, Aborted.

>Программа получила сигнал SIGABRT, прервана.

>0x00 с 64 с 32 in _dl_sysinfo_int80() from/lib/ld-linux.so.2

>(gdb) where

>#0 0x00c64c32 in _dl_sysinfo_int80() from /lib/ld-linux.so.2

>#1 0x00322969 in raise() from /lib/tls/libc.so.6

>#2 0x00324322 in abort() from /lib/tls/libc.so.6

>#3 0x0036d9af in free_check() from /lib/tls/libc.so.6

>#4 0x0036afa5 in free() from /lib/tls/libc.so.6

>#5 0x0804842b in broken() at broken.c:17

>#6 0x08048520 in main() at broken.с:47

Другой способ заставить >glibc проверить кучу на непротиворечивость — воспользоваться функцией >mcheck():

>typedef void(*mcheck Callback)(enummcheck_status status);

>void mcheck(mcheck Callback cb) ;

В случае вызова функции >mcheck(), функция >malloc() размещает известные последовательности байтов перед и после возвращенной области памяти, чтобы можно было обнаружить переполнение или недогрузку буфера, >free() ищет эти сигнатуры и, если они были повреждены, вызывает функцию, указанную аргументом


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Windows Vista. Мультимедийный курс

Эта книга поможет вам разобраться в премудростях операционной системы Windows Vista.Информационная насыщенность учебного материала позволяет утверждать, что мультимедийный курс будет интересен и новичкам, и опытным пользователям.


FAQ по смартфону Qtek 8300/8310

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Домашние и офисные сети под Vista и XP

Количество персональных компьютеров в нашей стране растет год от года. Сегодня во многих семьях имеется два или даже три компьютера.Чтобы воспользоваться всеми преимуществами такой ситуации, компьютеры в вашей квартире стоит объединить сетью. Это позволит вам играть по сети в компьютерные игры, совместно использовать дисковое пространство, принтеры, модемы и другие устройства, всю сеть можно соединить с Интернетом. А в офисах сеть между компьютерами просто необходима.Открывающиеся перспективы выглядят очень заманчиво.


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)