Книга: Основы программирования в Linux
ElectricFence
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
, повреждена, и вы, в конце концов, попадете в беду.
$ cc -о efence efence.с
$ ./efence
$
Тем не менее, если вы возьмете ту же самую программу и скомпонуйте ее с библиотекой ElectricFence (libefence.a), то получите немедленный отклик:
$ cc -о efence efence.с -lefence
$ ./efence
Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens <[email protected]>
Segmentation fault
$
Выполнение под контролем отладчика позволяет получить подробное описание проблемы;
$ cc -g -о efence efence.с -lefence
$ gdb efence
(gdb) run
Starting program: /home/neil/BLP4e/chapter10/efence
Electric 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:10
10 ptr[1024] = 0;
(gdb)
Как это работает
Библиотека ElectricFence заменяет функцию malloc
и связанные с ней функции версиями, применяющими аппаратные средства виртуальной памяти для защиты от несанкционированного доступа к памяти. При возникновении подобного обращения к памяти порождается сигнал нарушения сегментации и программа останавливается.