Компоновка тестовой программы с mcheck

Компоновка нашей тестовой программы с mcheck дает следующие результаты:

$ gcc ggdb о broken broken. с lmcheck $./broken 1: 12345

memory clobbered past end of allocated block память разрушена после конца распределенного блока Вследствие того, что mcheck всего лишь выдает сообщения об ошибках и завершает работу, найти ошибку невозможно. Для точного обнаружения ошибки потребуется запустить программу внутри gdb и заставить mcheck вызывать abort () при обнаружении ошибки. Можно просто вызвать mcheck () внутри gdb или поместить mcheck (1) в первой строке вашей программы (веред вызовом malloc ()). (Следует отметить, что mcheck () можно вызвать в gdb без необходимости компоновки программы с библиотекой mcheck.)

$ rm f broken; make broken $ gdb broken (gdb) break main Breakpoint 1 at 0x80483f4: file broken. c, line 14.

Точка прерывания 1 по адресу 0x80483f4: файл broken, с, строка 14.

(gdb) command 1 Type commands for when Breakpoint 1 is hit, one per line. End with a line saying just "end".

Наберите команды, которые выполнятся при достижении точки прерывания 1, по одной в строке.

Завершите строкой, содержащей только "end".

> call mcheck(&abort) > continue > end (gdb) run Starting program: /usr/src/lad/code/broken Запуск программы: /usr/src/lad/code/broken Breakpoint 1, main () at broken. с: 14 47 return broken (); $1 0 1: 12345

Program received signal SIGABRT, Aborted. Программа получила сигнал SIGABRT, прервана. 0x00el2c32 in _dl_sysinfo_int80() from /lib/ldlinux. so.2 (gdb) where 00x00el2c32 in _dl_sysinfo_int80 () from /lib/ldlinux. so.2 1 0x0072c969 in raise() from /lib/tls/libc. so.6 2 0x0072e322 in abort () from /lib/tls/libc. so.6 3 0x007792c4 in freehook() from /lib/tls/libc. so.6 4 0x00774fa5 in free() from /lib/tls/libc. so.6 5 0x0804842b in broken() at broken. c:17 6 0x08048520 in main () at broken. с:47

Важной частью этого кода является обнаруженная ошибка в строке 17 файла broken. с. Видно, что ошибка была обнаружена во время первого вызова free (), который указал на наличие проблемы в области памяти dyn. (f reehook () представляет собой ловушку, с помощью которой mcheck выполняет проверки.)

Библиотека mcheck не может помочь в обнаружении переполнения или недогрузки буфера в локальных или глобальных переменных, а только в областях памяти, распределенных с помощью malloc ().


Ведете ли вы блог?

Да
Нет
Планирую


Результаты опроса

Новостной блок