vak: (Default)
[personal profile] vak
Вызов cppcheck выглядит намного проще по сравнению с clang-tidy. Но и проверяет он меньше.
cppcheck --std=c++14 --enable=style --error-exitcode=1 --inline-suppr --quiet --suppress=*:*/_deps/* --suppress=*:*/grammar.hpp --library=googletest.xml -I/some/path -DNDEBUG source.cpp
Флаг --checks задаёт список правил для проверки.

Флаги --suppress подавляют файлы, загруженные со стороны (типа Googletest) или сгенерённые посредством Bison.

Флаг --library берет из указанного файла дополнительную информацию о семантике "странных" конструкций, имеющихся в коде. К примеру, для Googletest надо описать макросы вида TEST():
<?xml version="1.0"?>
<def version="2">
<define name="TEST(A,B)" value="void __ ## A ## _ ## B ( )"/>
<define name="TEST_F(A,B)" value="void __ ## A ## _ ## B ( )"/>
<define name="GTEST_TEST(A,B)" value="void __ ## A ## _ ## B ( )"/>
</def>
Но самое приятное - cppcheck легко интегрируется с cmake. Достаточно добавить в CMakeLists.txt следующий фрагмент:
find_program(Cppcheck NAMES cppcheck)
if(NOT (Cppcheck MATCHES "NOTFOUND"))
set(CMAKE_CXX_CPPCHECK "${Cppcheck}"
"--std=c++14" # Задаём стандарт языка
"--enable=style" # Что проверять
"--error-exitcode=1" # Всякая ошибка фатальна
"--inline-suppr" # Разрешить управляющие конструкции вида // cppcheck-suppress ID
"--quiet"
"--suppress=*:*/_deps/*" # Игнорировать проблемы в Googletest
"--suppress=*:*/grammar.hpp" # Игнорировать код от Bison
"--library=${CMAKE_SOURCE_DIR}/googletest.xml" # Разпознавать макрос TEST()
)
endif()
И при сборке проекта cppcheck будет вызываться автоматически для всех файлов Си++.

Date: 2022-08-26 06:21 (UTC)
From: [personal profile] ivanrubilo
Да, наименее геморройная тулза.
Всегда ей пользуюсь - незаменимая вещь вообще.

Date: 2022-08-26 13:20 (UTC)
From: [personal profile] ivanrubilo
Надо попробовать как-нить.
cppcheck подкупает простотой типа `cppcheck --enable=all .`, остальные типа pvs studio занимают недели чтобы затащить в нормальный проект (ну либо по крайней мере так было лет 10 назад).

Date: 2022-08-26 22:06 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Раз уж на то пошло, прикрути ещё copy-paste detector.

Date: 2022-08-27 00:50 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Да, с таблицами перекодировки неудобно получилось.