2022-08-25

vak: (Default)
Освоил clang-tidy в качестве инструмента для чистки кода на Си++. Господи, до чего же тормозная штука. И интерфейс сделан в худших традициях. Но пользы от неё много, однако.

Предварительно надо сконфигурить и собрать проект в каталоге build (с помощью cmake). Обязательно указать для cmake флаг -DCMAKE_EXPORT_COMPILE_COMMANDS=ON. Он нужен, чтобы образовался файл build/compile_commands.json со списком команд компиляции. Он нужен для clang-tidy.

Вот так выглядит вызов этой хрени. Ужас просто.
clang-tidy -p=build --checks=-*,bugprone-*,cert-*,clang-analyzer-*,cppcoreguidelines-*,misc-*,modernize-*,performance-*,portability-*,readability-*,-bugprone-easily-swappable-parameters,-bugprone-reserved-identifier,-cert-dcl37-c,-cert-dcl51-cpp,-clang-analyzer-deadcode.DeadStores,-cppcoreguidelines-avoid-c-arrays,-cppcoreguidelines-avoid-magic-numbers,-cppcoreguidelines-init-variables,-cppcoreguidelines-macro-usage,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-constant-array-index,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-type-cstyle-cast,-cppcoreguidelines-pro-type-union-access,-cppcoreguidelines-pro-type-vararg,-modernize-avoid-c-arrays,,-modernize-deprecated-headers,-modernize-return-braced-init-list,-modernize-use-trailing-return-type,-modernize-use-using,-performance-move-const-arg,-readability-braces-around-statements,-readability-function-cognitive-complexity,-readability-identifier-length,-readability-implicit-bool-conversion,-readability-magic-numbers,-readability-redundant-access-specifiers,-cppcoreguidelines-avoid-goto,-cert-env33-c,-cert-err58-cpp,-bugprone-exception-escape --header-filter=. --warnings-as-errors=* --export-fixes=tidy-fixes.yaml --use-color --line-filter="[{'name':'grammar.hpp','lines':[[9999999,9999999]]},{'name':'grammar.cpp','lines':[[9999999,9999999]]},{'name':'location.hh','lines':[[9999999,9999999]]},{'name':'.h'},{'name':'.cpp'}]" src1.cpp src2.cpp ... srcN.cpp
Флаг --checks задаёт список правил, которые проверять или не проверять. Пришлось долго подбирать под свой проект.

Флаг --line-filter отключает проверку для файлов, сгенерённых посредством Bison. В них слишком много проблем, исправлять которые я не намерен.
vak: (Default)
Вызов 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 будет вызываться автоматически для всех файлов Си++.