LINUX.ORG.RU

cppcheck 2.6

 , , ,


0

1

Вышла новая версия cppcheck — статического анализатора исходного кода для языков C и C++.

В этом выпуске представлены новые проверки:

  • пропущенный return в функции;
  • запись перекрывающихся (overlapping) данных, обнаружение UB;
  • сравнение с значением вне допустимого диапазона типов;
  • отключение copy elision из-за использования return std::move(local);
  • открытие файла на чтение и запись в разных потоках (streams).

Также внесены улучшения:

  • Добавлен цветной вывод диагностических сообщений на Unix-based платформах.
  • Добавлен символьный анализ для ValueFlow.
  • Правила, использующие список токенов «define», могут быть сопоставлены и с #include.
  • Библиотечный тег function может использовать тег container, что позволяет задать yields или specify для контейнера, принимаемого входным аргументом свободной функции (например, std::size, std::empty, std::begin, std::end, и т.д).
  • Библиотечный тег smart-pointer может задавать тег unique для умных указателей, реализующих единоличное владение. Реализовано предупреждение о провисших ссылках на такие указатели.
  • Исправлены проблемы при использовании флага --cppcheck-build-dir.
  • htmlreport теперь может выводить информацию об авторе (получаемую с помощью git blame).
  • Больше предупреждений о не-константных переменных, которые можно сделать константными.

Помимо этого, была завершена проверка соответствия исходного кода стандарту MISRA C 2012: реализованы все правила MISRA C 2012, кроме 1.1, 1.2 (должны обеспечиваться компилятором) и 17.3 (может обеспечиваться компилятором), включая правила в поправках 1 и 2.

Исходный код анализатора распространяется по лицензии GPLv3.

>>> Подробности

★★★

Проверено: hobbit ()

Хорошая новость. Статические анализаторы нужны и разумеется не ВМЕСТО квалифицированного аккуратного программиста, а В ПОМОЩЬ ему. И не ВМЕСТО утилит динамического анализа вроде valgrind (при всей моей любви к оному), а В ДОПОЛНЕНИЕ к ним.

P.S. Тем временем Яндекс при поиске слова cppcheck первой ссылкой выдаёт рекламу широко известного на ЛОРе проприетарного аналога. Sad but true.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от hobbit

У яндекса всё индивидуально. У меня он выдаёт ссылку на офф. страницу cppcheck, статью на хабре, википедии и т.п. никаких ЛОРов на первой странице нет, а PVS только в самом низу.

anonymous ()
Ответ на: комментарий от hobbit

Тем временем Яндекс

Пересел недавно на яшу. Сильно больше рекламы. И кажется, что гугль лучше ищет ответы на всякие программерские вопросы. Пока всё это выглядит как поедание кактуса.

ox55ff ★★★★ ()
Ответ на: комментарий от ox55ff

Пересел недавно на яшу.

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

hobbit ★★★★★ ()

Поддерживаются цветов в выводе диагностик на Unix-based платформ

Библиотечный тег может использовать тег

Библиотечный тег может задавать тег для умных указателей

А новость-то писал кто, яндекс-переводчик или гугл-переводчик?

По крайней мере в двух последних случаях с защитой от CSS он справился отлично!

anonymous ()
Ответ на: комментарий от anonymous

А новость-то писал кто, яндекс-переводчик или гугл-переводчик?

Новость писал я, не прибегая к машинному переводу. Сможешь перевести «library tag» лучше – вперед, буду рад идеям.

Siborgium ★★★ ()
Последнее исправление: Siborgium (всего исправлений: 1)
Ответ на: комментарий от ox55ff

И кажется, что гугль лучше ищет ответы на всякие программерские вопросы

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

SkyMaverick ★★★ ()
Ответ на: комментарий от cocucka

Мне человек присылал лог анализа исходников DoubleContact пивас-студией. Она нашла пару нехороших мест, которые не увидел прикрученный к гитхабу Coverity Scan. С сабжем не сравнивал, к сожалению.

hobbit ★★★★★ ()
Ответ на: комментарий от hobbit

Ну а пивас может пропустить другие критические ошибки. Что ж теперь гонять пучок платных анализаторов в надежде, что они все баги задетектят? Мой поинт в том, что cppcheck должно быть достаточно для уменьшения вероятности пропуска распространенных ошибок в коде и платить не надо.

cocucka ★★★★★ ()
Ответ на: комментарий от ox55ff

И кажется, что гугль лучше ищет ответы на всякие программерские вопросы.

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

У меня вообще иногда возникает неприятный дискомфорт от того, что поисковик по первым нескольких буквам выдает полностью готовый запрос, на 100% соответствующий тому, который я еще только хотел набрать.

yetanother ★★ ()
Ответ на: комментарий от yetanother

У меня вообще иногда возникает неприятный дискомфорт от того, что поисковик по первым нескольких буквам выдает полностью готовый запрос, на 100% соответствующий тому, который я еще только хотел набрать.

Ты просто задаешь банальные запросы)

potustoronnim_v ()

пропущенный return в функции;

Да, помню веселую историю в моей практике. Пришлось как-то править «первые три байта операционной системы». А дело было так. Занимался я тогда разработкой некой embedded bsd-подобной системы на разных платформах. Первым делом, при инициализации была С-шная функция с ассемблерной вставкой. типа звали system call (на ppc дело было) и system call записывал в R0 то, что нужно. Ну такой типа INT9 биосовский. Ретурна не было, так как через R0 код возврата и нужно было передавать по ABI. И тут перешли на новый тулчейн, с 2.95-2 на какой-то третий, который ничтоже сумняшеся лепил implicit return 0 там. где его не было. Ну и «эффект превзошел ожидания», система перестала грузиться сразу. :), потому как после вызова этой функции в r0 был 0, а не то, что там должно было быть. Так что аккуратнее, товарищи, с пропущенными ретурнами, их иногда забывают «по доразумению».

А cppcheck — вещь годная. Хотя, лучше ее использовать в связке с анализатором шланга :)

gns ★★★★★ ()
Последнее исправление: gns (всего исправлений: 1)
Ответ на: комментарий от potustoronnim_v

У меня вообще иногда возникает неприятный дискомфорт от того, что поисковик по первым нескольких буквам выдает полностью готовый запрос, на 100% соответствующий тому, который я еще только хотел набрать.

Ты просто задаешь банальные запросы)

Применим тут правило, что по себе людей не судят)

На самом деле запрос был как раз очень специфический. Я читал статью по своей тематике с телефона, и встретил математический термин, который решил погуглить уже с десктопа, причем я 100% этот термин никогда не искал. И буквально первое слово не набрал, а поисковик предложил полный запрос. Вообще, теория вероятностей не исключает такого, с ее точки зрения ничего удивительного, если подумать. Просто с точки зрения человеческой психологии это выглядит не интуитивно. На основе этого, например, работают мошенники и цыгане всякие - они же всем подряд одно и то же говорят, в надежде «угадать». А человек часто думает, ну, наверное, правда - откуда они знают, не могли же они угадать? А они именно угадали. Другой пример - если бросать монетку, то будут часто длинные последовательности решек и орлов, а если дать человеку задание сымитировать броски монетки, то у него длинных последовательностей орлов и решек может и не быть - он будет так имитировать случайность. Интуиция может сильно противоречить теории вероятностей.

yetanother ★★ ()
Последнее исправление: yetanother (всего исправлений: 1)
Ответ на: комментарий от hobbit

Я их сравнивал не с пивасом, я сабж сравнивал с clang и svace (который в кишках докрученный clang, оп слухам). Для pre-commit check сабж годен более чем, Да и как анализатор первого прохода хорош. поправь то, что видит cppcheck, потом уже берись за «тяжелую артиллерию». Так как-то Остальное хоть и видит больше, но требует инструментирования кода.

gns ★★★★★ ()
Ответ на: комментарий от yetanother

Ну, запросы же не берутся с потолка, значит, какой бы не была узкой специализация, кто-то до тебя уже задавал подобные запросы. Ну и историю запросов надо иметь в виду: я, например, люблю кино, поэтому Яндекс у меня часто с первого слова угадывает название фильма произвольной длины, да ещё и «смотреть онлайн в ХД» услужливо добавляет. Ты, наверное, не в первый раз делаешь запросы на математические темы, поэтому поисковик старается подобрать тебе схожие по тематике варианты.

potustoronnim_v ()
Ответ на: комментарий от ox55ff

Пересел недавно на яшу. Сильно больше рекламы. И кажется, что гугль лучше ищет ответы на всякие программерские вопросы. Пока всё это выглядит как поедание кактуса.

Не фига. Рекламу гугл тоже как не в себя сыпет. Да и ответов гугл стал давать меньше яндекса. Слишком умный и толерантный стал гугл, скрывая данные

anonymous ()
Ответ на: комментарий от cocucka

Скажем так: пивас студия не настолько лучше анализирует код, чтобы за неё платить деньги.

Плюс еще навязчивая её реклама везде. И поток самовосхваления от эффективных менеджеров.

anonymous ()
Ответ на: комментарий от ox55ff

И кажется, что гугль лучше ищет ответы на всякие программерские вопросы

К сожалению, в гугле последнее время чрезмерное количество мусора. В яндексе такого не наблюдаю, во всяком случае пока что – возможно, потому что пользуюсь преимущественно гуглом.

Siborgium ★★★ ()

Ложные срабатывания

Вот уже который год cppcheck считает «ошибкой» манипуляции с big-endian / little-endian.

Пример:

$ cat test.cpp 
int main()
{
	int x = 0;
	char * s = (char *)&x;
	s[1] = 1;
	return x == 256;
}

$ cppcheck test.cpp 
Checking test.cpp ...
test.cpp:5:3: error: The address of local variable 'x' is accessed at non-zero index. [objectIndex]
 s[1] = 1;
  ^
test.cpp:4:21: note: Address of variable taken here.
 char * s = (char *)&x;
                    ^
test.cpp:5:3: note: The address of local variable 'x' is accessed at non-zero index.
 s[1] = 1;
  ^


anonymous ()
Ответ на: комментарий от JaM

У него есть преимущества перед clang-tidy?

Да.

cppcheck ловит то, что clang-tidy пропускает

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

clang-tidy это игнорирует. cppcheck - нет.

Пример:

$ cat test.cpp
struct A {
   int x = 1;
};
struct B : public A {
   int x = 2;
};
int main() {
   B b;
   return b.x;
}

$ cppcheck --enable=all test.cpp 
Checking test.cpp ...
test.cpp:5:8: warning: The struct 'B' defines member variable with name 'x' also defined in its parent struct 'A'. [duplInheritedMember]
   int x = 2;
       ^
test.cpp:2:8: note: Parent variable 'A::x'
   int x = 1;
       ^
test.cpp:5:8: note: Derived variable 'B::x'
   int x = 2;
       ^
anonymous ()