Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
ElectricFence
Библиотека ElectricFence была разработана Брюсом Перенсом (Bruce Perens). Она доступна как необязательный компонент в некоторых дистрибутивах Linux, таких как Red Hat (Enterprise и Fedora), SUSE и openSUSE, и может быть легко найдена в Интернете. Это средство пытается применять виртуальную память системы Linux для защиты памяти, используемой функциями
malloc
free
Выполните упражнение 10.3.
Далее приведена программа 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/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
valgrind
Средство
valgrind
Для применения
valgrind
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