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