18 января 2012

Cppcheck как еще один шаг к светлому будущему

Я верю что наступит время когда ошибок в программном коде не будет совсем. Солнце остынет, а человечество можно будет пересчитать по щупальцам осьминогокрылых с альфа-центавра 17. Сейчас это время еще не наступило, ошибки в коде правило, а не исключение.

Статических анализаторов кода множество. Если верить википедии то первый из множество вышел на большую сцену в 1979 и звался Lint. И как скорее всего понятно из заголовка данного поста, речь пойдет об Cppcheck. Молодом и до сих пор активно разрабатывающемся статическом анализаторе кода C/C++.

Он очень прост в использовании: cppcheck --enable=all main.c.

Если вы захотите использовать его в большом проекте, то вам может понадобиться указать директорию с заголовочными файлами, делается это флагом -I dir1 dir2 dir3. Так же очень полезным будет использования формата ошибок в стиле gcc, что бы среда разработки, в моем случае vim, позволило переходить по собщениям анализатора так же как по сообщениям от компилятора.

Список того что может Cppcheck можно почитать на официальном сайте. Если коротко: то переполнения, неиспользуемые функции и утечки памяти. Но это если коротко, на самом деле список его возможностей будет подлиннее. Лучше покажу на простом примере что может Cppcheck. Это простой пример показывающий как круто статический анализатор поможет нам в борьбе с утечками памяти.

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
  int *x;
  x = (int*)malloc(sizeof(int));
  *x = 5;
  printf("%d\n", *x);
  return 0;
}

cppcheck --enable=all:

Checking main.c...
[main.c:11]: (error) Memory leak: x
Checking usage of global functions..

Это конечно очень простой код и мы сами можем увидеть в чем проблема, но на больших проектах это может оказаться полезным, хотя возможны и ложные срабатывания (у меня такого еще не было, но википедия говорит что такое имеет место быть) на очень больших и запутанных проектах.