← 1 2 →
Используй несколько разных анализаторов, у них у всех есть свои сильные и слабые стороны. Так делает NASA.
invy ★★★★★ ()
Используй несколько разных анализаторов, у них у всех есть свои сильные и слабые стороны. Так делает NASA.
Какие еще анализаторы вы посоветуете?
Мне не понятно, почему cppcheck пропустил две явные ошибки? Даже gcc ругается на присвоение 32000.
andreyu ★★★★★ ()
Ну вот gcc и используёте для подобного рода ошибок, раз он ругается. Ещё в llvm/clangе хороший статический анализатор, говорят.
invy ★★★★★ ()
Мне не понятно, почему cppcheck пропустил две явные ошибки? Даже gcc ругается на присвоение 32000.
Отладь @ пофикси
yoghurt ★★★★★ ()
Отладь @ пофикси
По существу как всегда ничего нет?
andreyu ★★★★★ ()
Ну вот gcc и используёте для подобного рода ошибок, раз он ругается.
Он ругается только на одну ошибку. А выход за границы он тоже не видит.
Ещё в llvm/clangе хороший статический анализатор, говорят.
Такое же говно, как и cppcheck.
andreyu ★★★★★ ()
Чтоб такое отловить, статический чекер дожен быть очень умным. Возможно таких вообще не существует в природе.
Кстати, clang не возмутился на 32000 в char, gcc возмутился (warning: overflow in implicit constant conversion). А чем динамический валгринд не устраивает? Он все рассказал на присвоении: Invalid write of size 1
anonymous ()
говорят, в jdk хороший анализатор кода ?
anonymous ()
Кстати, clang не возмутился на 32000 в char
q.cc:6:13: warning: implicit conversion from ‘int’ to ‘char’ changes value from 32000 to 0 v = 32000, ~ ^~~~~
По умолчанию выключено, похоже.
i-rinat ★★★★★ ()
А выход за границы он тоже не видит.
А как оно должно увидеть «выход за границу»? Это же нужно знать контракт класса std::vector, вывести который из кода вряд ли представляется возможным. С точки зрения компилятора/анализатора класс std::vector мало чем отличается от любого другого пользовательского класса вроде QVector, у которого также есть свой контракт.
К тому же выхода за границу внутреннего буфера std::vector может и не быть, если capacity size. Будет нарушен контракт, и будет записано число в доступную область памяти, этого даже всякие runtime анализаторы вроде valgrind не поймают.
kamre ★★★ ()
$ g++ -Wall -pedantic -g cpp_t.cc -o cpp_tcpp_t.cc: In function ‘int main(int, char**)’:cpp_t.cc:6: warning: overflow in implicit constant conversion$ clang++ -Wall -pedantic -g cpp_t.cc -o cpp_t$ clang —versionclang version 1.1 (Debian 2.7-3)Target: i386-pc-linux-gnuThread model: posix
anonymous ()
$ clang++ —versionDebian clang version 3.4-1 (trunk) (based on LLVM 3.4)Target: x86_64-pc-linux-gnuThread model: posix
Версии разные.
i-rinat ★★★★★ ()
говорят, в jdk хороший анализатор кода ?
import java.util.ArrayList,public class TestArrayList { public static void main(String: No bounds checking is performed.
x0r ★★★★★ ()
Что бы говорить о количестве нулей в банке, нужно иметь мозги. Судя по вашим сообщениям в этой ветке, мозгов у вас нет. Но есть желание выпендрится. Ничего, скоро закончатся каникулы, там вам продолжат мозги вправлять.
andreyu ★★★★★ ()
смотря как анализирует. в самом векторе оператор v = 32000, ^
$ clang test.cpp test.cpp:6:13: warning: implicit conversion from ‘int’ to ‘char’ changes value from 32000 to 0 v = 32000, ~ ^~~~~1 warning generated.
quest ★★★★ ()
Он намекает что тебе стоит написать багрепорт авторам cppcheck
Оно мне нужно? Я проинформировал читающих эту ветку о баге. Дабы они в дальнейшем не полагались на этот анализатор. Кто считает, что этот баг стоит запостить, пусть это сделает сам, а не говорит сделать это мне.
andreyu ★★★★★ ()
Количество нулей с мозгами не коррелирует
Вы это не мне, а анонимусу скажите. Своими нулями именно он тут хвастается.
andreyu ★★★★★ ()
Нафига вообще cppcheck если gcc и clang даже БЕЗ опций это ловят
Подумайте сами, зачем нужен статический анализатор. А заодно покажите, как clang или gcc ловит выход за границы в приведенном мною примере.
andreyu ★★★★★ ()
А заодно покажите, как clang или gcc ловит выход за границы в приведенном мною примере.
По факту они даже без опций эту проблему показывают что я выше и привел.
quest ★★★★ ()
покажите, как clang или gcc ловит выход за границы в приведенном мною примере.
По факту они даже без опций эту проблему показывают
Выход за границу вектора?
tailgunner ★★★★★ ()
Выход за границу вектора?
А ну да это я краем глаза смотрю, ну юзайте at()Кто из свободных такое просекает в этом коде без запуска?
quest ★★★★ ()
Содержание
- Возможности Cppcheck
- Использование Cppcheck
- Диагностики
- Примеры диагностик
- Пример N1. Проект MPlayer
- Пример N2. Проект Doom 3
- Пример N3. Проект Doom 3
- Пример N4. Проект Quake 3: Arena
- Пример N5. Проект Quake 3: Arena
- Ссылки
Cppcheck это инструмент статического анализа исходного кода на языке Си и Си++. Отличительными чертами инструмента являются: открытость, бесплатность, кроссплатформенность, простота использования.
Возможности Cppcheck
На момент написания этой заметки Cppcheck версии 1.60.1 поддерживал следующие языки: C89, C99, C11, C++03, C++11. Также, на момент написания статьи, существуют следующие плагины для интеграции с различными средами разработки:
- Code::Blocks integrated
- CodeLite integrated
- Eclipse Cppcheclipse
- Hudson Cppcheck Plugin
- Jenkins Cppcheck Plugin
- Visual Studio / Eclipse Visual Lint by RiverBlade (платное решение)
Использование Cppcheck
Одним из основных преимуществ анализатора Cppcheck является простота использования. Можно рекомендовать этот инструмент для обучения и первого знакомства с методологией статического анализа. Например, установив Cppcheck для Windows, вы получаете GUI интерфейс, позволяющий сразу приступить к проверке ваших проектов.
Рисунок 1. Cppcheck для Windows. Главное окно. Нажмите на картинку для увеличения.
Просто выберите в меню Check directory и укажите путь до вашего проекта. Результат работы анализатора может выглядеть как показано на рисунке ниже.
Рисунок 2. Результат проверки проекта. Нажмите на картинку для увеличения.
Конечно, я немного лукавлю, говоря, что Cppcheck не требует никакой настройки. Если вы серьезно начнете использовать Cppcheck, вам понадобится произвести ряд настроек. Например, потребуется указать пути до сторонних библиотек, интегрировать Cppcheck с вашей средой разработки или настроить ночные запуски. Однако, сам факт, что вы можете просто выбрать каталог и получить результат очень здорово! Особенно если вы только начинаете изучать, что такое статический анализ кода. Эта возможность просто бесценна.
После проверки можно просмотреть диагностические сообщения. Все сообщения разделены на следующие группы: Errors, Warnings, Style Warnings, Portability Warnings, Performance Warnings, Information Messages. Группы легко включать/выключать используя кнопки на тулбаре.
На рисунке N3 показан режим работы для просмотра Style Warnings. Группа предупреждений Style Warnings включена, а остальные выключены (см. цифру 1). Файл cpuid_x86.c содержит несколько таких предупреждений. Выбрано первое предупреждение, которое относится к 214 строке (см. цифру 2). В нижнем окне сразу показывается описание этой диагностики (см. цифру 3).
Рисунок 3. Пример просмотра диагностического сообщения. Нажмите на картинку для увеличения.
Диагностики
Анализатор Cppcheck выполняет множество различных видов проверок. Перечислим некоторые из них:
- Неправильное использование функций из Standard Template Library,
- Утечки памяти (Memory leaks),
- Утечки ресурсов (Resource leaks),
- Выход за границы массивов (Bounds checking for array overruns),
- Использование неинициализированных переменных,
- Использование устаревших функций,
- Проверка операций ввода/вывода (Check input/output operations),
- Разыменование нулевого указателя.
Примеры диагностик
Приведём несколько примеров ошибок в коде, которые умеет выявлять анализатор Cppcheck.
Пример N1. Проект MPlayer
В этом коде ситуация отсутствия данных обрабатывается неправильно. Если выполняется условие (!sh-wf || sh-wf-cbSize <, 80), то происходит утечка памяти.
….context_t *ctx = calloc(1, sizeof(context_t)),const SpeexMode *spx_mode,const SpeexStereoState st_st = SPEEX_STEREO_STATE_INIT,if (!sh-wf || sh-wf-cbSize <, 80) { mp_msg(MSGT_DECAUDIO, MSGL_FATAL, ‘Missing extradata!\n’), return 0,}….
Диагностическое сообщение:
libmpcodecs/ad_speex.c:44: Memory leak: ctx
Пример N2. Проект Doom 3
В коде вместо sizeof(ctx) должно быть написано sizeof(*ctx). Из-за ошибки обнуляется не весь объект ctx а только несколько первых байт.
void MD5_Final( MD5_CTX *ctx, unsigned char digest ) { …. memset( ctx, 0, sizeof( ctx ) ),
Диагностическое сообщение:
..\Doom3\id-Software-DOOM-3-a9c49da\neo\idlib\hashing\MD5.cpp(252):
Using size of pointer ctx instead of size of its data.
Пример N3. Проект Doom 3
Ошибка связана с тем, что память выделяется для массива элементов, а освобождается, как если бы она была выделена для одного элемента. Правильный вариант delete , . delete sortIndex,
Диагностическое сообщение:
..\Doom3\id-Software-DOOM-3-a9c49da\neo\renderer\Image_init.cpp(2214)
Mismatching allocation and deallocation: sortIndex
Пример N4. Проект Quake 3: Arena
Массив состоит из трех элементов. А работаем, как если бы он содержал четыре элемента.
void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors ){ … unsigned char invModulate, … invModulate = 255 — backEnd.currentEntity-e.shaderRGBA, invModulate = 255 — backEnd.currentEntity-e.shaderRGBA, invModulate = 255 — backEnd.currentEntity-e.shaderRGBA, invModulate = 255 — backEnd.currentEntity-e.shaderRGBA, // this trashes alpha, but the AGEN block fixes it
Диагностическое сообщение:
..\Quake3\id-Software-Quake-III-Arena-dbe4ddb\code\renderer\tr_shade_calc.c 628
Array invModulate index 3 out of bounds
Пример N5. Проект Quake 3: Arena
Функция printf() печатает два числа, а параметров передаётся три. Или один параметр лишний, или неправильная строка форматирования.
static void do_uid(int x) { printf(‘%d’, x, x, x),}
Диагностическое сообщение:
..\Quake3\id-Software-Quake-III-Arena-dbe4ddb\lcc\src\2html.c 131
printf format string has 2 parameters but 3 are given
Ссылки
- Website: http://cppcheck.sourceforge.net/
- Wikipedia: Cppcheck.
- Cppcheck manual: HTML, PDF.
- Cppcheck git repository.
- Пример положительного отзыва о Cppcheck. Cppcheck: free, easy, and great.
- Евгений Рыжков. Сравнение Cppcheck и PVS-Studio.
- Aleksey Vitebskiy. Poor Mans Visual Studio Cppcheck Integration.
WindowsMac
- Windows
- Разработчикам
- IDE и редакторы
- cppcheck
- Скачать
Программа не может быть загружена: ссылка для скачивания недоступна.Внешние ссылки для скачивания стали недействительными по неизвестной причине.Извините, но мы не можем обеспечить безопасность сторонних сайтов.
Похожие программы
FlashDevelop
IDE и редакторы
Aqua Data Studio
IDE и редакторы
Raize Components
IDE и редакторы
Astah Community
IDE и редакторы
LispWorks
IDE и редакторы
Последние обновления
Heartbeat
Управление документами
php Kitchen Planner
3D дизайн
How to clean registry
Каталог программ•DMCA•Submit•Контактная информация
Скачать