Основы программирования в Linux
ElectricFence
Библиотека ElectricFence была разработана Брюсом Перенсом (Bruce Perens). Она доступна как необязательный компонент в некоторых дистрибутивах Linux, таких как Red Hat (Enterprise и Fedora), SUSE и openSUSE, и может быть легко найдена в Интернете. Это средство пытается применять виртуальную память системы Linux для защиты памяти, используемой функциями
иmalloc, и аварийного останова программы в момент повреждения памяти.freeВыполните упражнение 10.3.
Упражнение 10.3. Применение библиотеки ElectricFenceДалее приведена программа efence.c, которая выделяет память с помощью функции
и пишет данные за концом выделенного блока. Познакомьтесь с ней и посмотрите, что произойдет.malloc#include <stdio.h>#include <stdlib.h>int main() {char *ptr = (char *)malloc(1024);ptr[0] = 0;/* Теперь пишет за пределы блока */ptr[1024] = 0;exit(0);}Когда вы откомпилируете и выполните программу, то не увидите некорректного поведения. Однако вероятно, что область памяти, выделенная
, повреждена, и вы, в конце концов, попадете в беду.malloc$ <b>cc -о efence efence.с</b>$ <b>./efence</b>$Тем не менее, если вы возьмете ту же самую программу и скомпонуйте ее с библиотекой ElectricFence (libefence.a), то получите немедленный отклик:
$ <b>cc -о efence efence.с -lefence</b>$ <b>./efence</b>Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens <[email protected]>Segmentation fault$Выполнение под контролем отладчика позволяет получить подробное описание проблемы;
$ <b>cc -g -о efence efence.с -lefence</b>$ <b>gdb efence</b>(gdb) <b>run</b>Starting program: /home/neil/BLP4e/chapter10/efenceElectric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens [email protected]Program received signal SIGSEGV, Segmentation fault.[Switching to Thread 1024 (LWP 1869)]0x08048512 in main () at efence.c:1010 ptr[1024] = 0;(gdb)Как это работает
Библиотека ElectricFence заменяет функцию
и связанные с ней функции версиями, применяющими аппаратные средства виртуальной памяти для защиты от несанкционированного доступа к памяти. При возникновении подобного обращения к памяти порождается сигнал нарушения сегментации и программа останавливается.mallocvalgrind
Средство
способно обнаруживать многие из обсуждавшихся нами проблем (упражнение 10.4). Прежде всего, оно умеет находить ошибки доступа, к массиву и утечки памяти. Это средство, возможно, не включено в ваш дистрибутив Linux, но его можно найти на Web-сайте http://valgrind.org.valgrindДля применения
даже не требуется перекомпиляции программы, и вы можете находить ошибки доступа к памяти в выполняющейся программе. Данное средство заслуживает внимания; оно применяется в основных разработках, включая среду KDE версии 3.valgrindУпражнение 10.4. СредствоvalgrindДалее приведена программа checker.c, которая выделяет некоторый объем памяти, читает область памяти и записывает данные за пределами выделенного участка, а затем делает выделенный участок недоступным.
#include <stdio.h>#include <stdlib.h>int main() {char *ptr = (char *)malloc(1024);char ch;/* Неинициализированное чтение */ch = ptr[1024];/* Запись за пределами блока */ptr[1024] = 0;/* Потеря блока */ptr = 0;exit(0);}Для применения
вы просто выполняете командуvalgrind, передав ей опции, задающие нужные виды проверок, и далее указав программу для выполнения с ее аргументами (если таковые есть).valgrindПри выполнении программы с
вы увидите множество обнаруженных проблем:valgrind$ <b>valgrind --leak-check=yes -v ./checker</b>==4780== Memcheck, a memory error detector.==4780== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.==4780== Using LibVEX rev 1732, a library for dynamic binary translation.==4780== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.==4780== Using valgrind-3.2.3, a dynamic binary instrumentation framework.==4780== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.==4780==--4780-- Command line--4780-- ./checker--4780-- Startup, with flags:--4780-- --leak-check=yes--4780-- -v--4780-- Contents of /рroc/version:--4780-- Linux version 2-6.20.2-2-default ([email protected]) (gcc version 4.1.3 20070218 (prerelease) (SUSE Linux)) #1 SMP Fri Mar 9 21:54:10 UTC 2007--4780-- Arch and hwcaps: X86, x86-sse1-sse2--4780-- Page sizes: currently 4096, max supported 4096