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 ()
Последнее исправление: sudopacman (всего исправлений: 12)

sourceforge

Это где трояны в комплекте?

Crocodoom ★★★★★
()

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

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

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

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

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

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

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

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

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

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

hobbit ★★★★★
()

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

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

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

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

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

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

Спасибо, поправил. Призываю анонимуса зарегистрироваться и писать о всех таких недоразумениях в спецтему. :)

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

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

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

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

Там проблема была не в library tag, а в экранировании тегов в треугольных скобках, из-за чего имена тегов пропали. Поправил.

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

Тем что их говно стоит 800 к/год и не определяет косвенные проверки на NULL.

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

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

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

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

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

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

Не публикует заказные статьи на хабре, например. Не заводит виртуалов на ЛОРе после (очередного) бана.

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

Да, действительно, был не прав. Спасибо за редактирование!

Siborgium ★★★★★
() автор топика

Ура!

Очередной гвоздь в крышку гроба пивас-студии.

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

Так рекламу же выдаёт. Поэтому и на первом месте.

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

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

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

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

cocucka ★★★★☆
()

Сейчас придут авторы пивас-студии и раскажут, какое оно г-но.

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

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

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

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

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

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

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

potustoronnim_v
()

чем оно лучше SonarLint/SonarQube?

GP
()

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

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

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

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

Их вместе хорошо использовать. Преимущество — скорость и то, что код не надо инструментипровать. Можно прикрутить как pre-commit check.

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

Я думал, ты спросишь, чем это лучше svace? :)

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

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

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

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

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

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

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

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

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

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

Да это очевидно, если поразмыслить, но когда ты набрал пару-тройку букв, а тебе уже готовый запрос подсвечен, первые секунды реально думаешь - как так?

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

Проверил, у меня единорога не было в поисковой выдаче

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

Для pre-commit check сабж годен более чем

Сабж иногда раздражает требованием использовать алгоритмы из std вместо божественных циклов.

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

Не помню я такого, я полтора года назад плотно занимался статанализом. Может, в новых версиях начал? И это ж, поди, отключается.

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

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

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

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

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

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

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

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

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

Siborgium ★★★★★
() автор топика

проверка кала на меньшую кальность? похвально!

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

есть, а над здравым смыслом - нет, впрочем, как у всех C++-рилейтед инструментов

anonymous
()

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

Вот уже который год 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
()
Ответ на: комментарий от ox55ff

Сабж иногда раздражает требованием использовать алгоритмы из std вместо божественных циклов.

Интересно... А есть какой-то небольшой пример, на котором это воспроизводится?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.