Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #76, АПРЕЛЬ 2005 г.

Бравые помощники компилятора

Крис Касперски ака мыщъх

Хакер, номер #076, стр. 076-104-5


Работает практически во всех операционках. Сложным образом конфигурируется и требует предварительной подготовки c докой в руках, что не есть плюс. Зато полноценно поддерживает много поточность, которой могут похвастаться далеко не все его конкуренты.

Checker

Еще одна отладочная библиотека, предлагающая свою реализацию функций malloc, realloc и free. Ругается всякий раз, когда free или realloc принимают указатель, полученный не от malloc, отслеживает повторное освобождение уже освобожденных указателей и обращения к неинициализированным областям памяти. Откладывает реальное освобождение блоков памяти на некоторое время, в течение которого пристально следит: не происходит ли к ним каких-нибудь обращений. Содержит детектор "мусора", вызываемый либо из отладчика, либо непосредственно из самой исследуемой программы. В общем, простенько, но со вкусом. К тому же, практически без ущерба для производительности системы. Работает в паре с компилятором GNU, на других — не проверял.

Заключение

Количество примочек к GCC (и другим компилятором) растет с каждым днем. Часть из них умирает, часть — растворяется в GCC. Что еще вчера было отдельным проектом, завтра может быть интегрировано с GCC. Поэтому, прежде чем искать нужную утилиту в Сети, имеет смысл поинтересоваться — нет ли чего-то похожего в компиляторе?

WWW

dmalloc.com

www.cigital.com/its4/

www.openwall.com/linux/

www.dwheeler.com/flawfinder/

manju.cs.berkeley.edu/ccured/

www.linkdata.se/sourcecode.html

www.gnu.org/software/checker/checker.html

www.cse.ogi.edu/DISC/projects/immunix/StackGuard/

Разборки с динамической памятью

Постоянная проверка успешности выделения памяти, во-первых, слишком утомительна, во-вторых, загромождает исходный текст, и, в-третьих, приводит к неоправданному увеличению объема откомпилированного кода программы.

Одно из возможных решений проблемы сводится к созданию "обертки", вокруг интенсивно используемых функций, проверяющих успешность их завершения и при необходимости рапортующих об ошибке с завершением программы или передающих управление соответствующему обработчику данной аварийной ситуации.

Можно пойти и дальше, заставив функцию-обертку возвращать указатель на указатель. Это позволит дефрагментировать динамическую память, конечно при условии, что адресация блоков всегда будет идти через базовый указатель, который будет постоянно перечитываться из памяти (чтобы компилятор не скэшировал его в регистре, указатель должен быть объявлен как volatile). Как вариант — можно защитить программу критическими секциями, чтобы блок памяти не был перемещен во время работы с ним. И то, и другое снижает производительность, а потому выглядит отнюдь не бесспорным решением.

Назад на стр. 076-104-4  Содержание