13.07.2015 Views

НА БАГАХ В CHROME - Xakep Online

НА БАГАХ В CHROME - Xakep Online

НА БАГАХ В CHROME - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Ищем ошибки в программах на C/C++чего получается утечка. В коде Linux насчитывалось 13 ошибоктакого типа (bit.ly/d1qgI6). Патч, устраняющий ошибку утечкипамяти:@leak@type T;T* x;statement S;identifier a=~».*alloc$»;@@* x = a(...);if (x == NULL) S... when != x* return ...;В разделе описания переменных, кроме всего прочего, задаетсяпеременная a, которая успешно сопоставляется с любым идентификатором,оканчивающимся на alloc. Мы можем использоватьрегулярные выражения, чтобы конкретизировать вид конструкций,которые мы хотим найти.Разберём подробнее раздел, задающий преобразования кода.* x = a(...);Раньше мы использовали «+» и « », чтобы указать, какие элементынужно добавить или удалить. Символ «*» используется дляпоиска. Многоточие сопоставляется произвольному коду. Если коддолжен удовлетворять ряду ограничений, то следует воспользоватьсяключевым словом when:... when != xЗдесь мы говорим, что хотим любой код, в котором не содержитсяx (при этом вид x определяется ранее).После применения патча к тестовому коду получаем следующийdiff:diff =--- leak.c+++ /tmp/cocci-output-11639-4c40d5-leak.c@@ -2,12 +2,10 @@int main(int argc, char** argv) {char* param;- param = malloc(257);if (param == NULL) {return 1;}if (argc < 2) {- return 1;}// ... using paramfree(param);return 0;}Минусы здесь служат только для выделения участков кода, которыенас интересовали в патче (там мы отмечали их символом «*»).SmPL имеет много других интересных возможностей, например,позволяет задавать зависимости между правилами (применяйтакое-то правило, только если выполнено такое-то), обеспечиваетинтеграцию с Python и т. д. Более подробно о них можно узнатьна официальном сайте coccinelle (bit.ly/1Z3wXP).Также на основе coccinelle создано несколько других программ.• Coccicheck содержит набор готовых правил, которые ищут следующиепопулярные ошибки:• разыменование нулевого указателя;• сравнение указателя с нулем вместо NULL;Результат работы Cppcheck• sizeof(pointer);• !x & y;• утечки памяти;• неиспользуемые переменные.Достаточно натравить coccicheck на интересующий тебя проект,и он проверит его на вышеперечисленные ошибки (вернее,на шаблоны в коде, которые на них очень похожи). Coccicheckлежит в директории scripts/ проекта coccinelle.• Herodotos (bit.ly/vrmt8v) позволяет проследить эволюциюошибок в нескольких версиях программы. При этом он собираетинтересную статистику и может строить графики.• Coccigrep (bit.ly/qxM9nd) — это «семантический grep» для C. Онможет искать в программе заданные структуры или переменные(как и DXR).• Spdiff (bit.ly/rLhp7P) — это «семантический diff», то есть инструментдля автоматического выявления изменений в программе.Звучит очень круто, но работает он только в лабораторныхусловиях.Coccinelle переводится c французского как «божья коровка»(bug that eats another bugs). Документация на «коровку» довольнаразрозненная, поэтому, чтобы понять, как писать на SmPL, придетсяпройти небольшой квест. Но оно того стоит. В пользу этогоговорит хотя бы количество багов, найденных в коде Linux (судяпо bit.ly/d1qgI6, оно достигает нескольких сотен).ЗАКЛЮЧЕНИЕИтак, каковы общие рекомендации по поиску ошибок с помощьюинструментов для статического анализа? Первым делом проверьсвой код при максимальном уровне предупреждений компилятора(то есть указывай не только -Wall). По возможности лучше использоватьдля проверки несколько компиляторов (например, intel,clang). Далее всё зависит от языка. Если это C++, то выбор бесплатныхинструментов достаточно ограничен (С++ тяжело разбирать;вероятно, ситуацию улучшит возможность писать плагины дляGCC). Определенно стоит попробовать Сppcheck, который особеннохорошо находит утечки памяти. Для C++ также есть Dehydra, но длянее, скорее всего, придется писать проверки самостоятельно. Длячистого С ситуация получше. Есть отличный инструмент Coccinelle,есть Frama-C. Они умеют находить определенные типы утечекпамяти, выходов за границу и прочие ужасы. Однако для поисканетривиальных ошибок недостаточно просто натравить на код этиинструменты (как и большинство других продвинутых программдля статического анализа). Нужно либо писать свои проверки,либо специальным образом настраивать сам анализатор.С другой стороны, опыт статического анализа показывает,что наиболее часто встречаются именно тривиальные ошибки,которые успешно отлавливают инструменты статического анализа«из коробки». Поэтому проверить свой код статическим анализатором— это хорошая идея. zХАКЕР 02 /157/ 2012 093

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!