Перейти к содержимому

Clazy

Категории:   Разработка
Снимок экрана Clazy
Clazy — подключаемый модуль для компилятора Clang, выводящий предупреждения, связанные с лучшими практиками Qt.
Установить на
Linux
Для использования этой функции требуется центр приложений Discover или другой центр приложений, поддерживающий работу с AppStream. Такое приложение также может быть установлено из системы управления пакетами используемого дистрибутива.

Выпуски RSS

1.17 2026-02-15

This release fixes the following bugs:

  • Fix non-pod-static check emitting warning for each entry of a container
  • Fix use-arrow-operator-instead-of-data emitting false positive when value is casted
  • Do not whitelist QVariant for detaching-temporary. QVariant::toString will provide a QString that is not detached
  • detaching-temporary properly checks conditions when more than two method calls are chained
  • Fixits for detaching-temporary/detaching-member are more reliable with fixit ranges for operator calls
  • When using QT_NAMESPACE, clazy properly handles Qt classes being in this specific namespace
  • Fix wrong replacement method for QMap::operator[]
  • Make project compile with LLVM22. qhash-namespace, fully-qualified-moc-types, old-style-connect tests are fixed
  • Adjust readlock-detaching check to work properly with Qt 6.11 changes
  • Move qstring-ref to manuallevel since it is not compatible with Qt6

This release adds the following feature:

  • New checks: - compare-member-check: Checks whether comparison operators do not use all member variables of a class.

C++20 is now required for compilation

qt6-\* porting checks are removed

1.16 2025-09-03

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

  • unused-result-check: исправлено аварийное завершение при невозможности разрешения объявления метода;
  • use-chrono-in-qtimer: исправлено аварийное завершение при использовании предварительно скомпилированных заголовков;
  • qt6-qhash-signature: адаптирована проверка для использования более корректной логики преобразований типов и исправлено аварийное завершение в крайних случаях;
  • Обеспечена корректная работа clang21 с clazy и вывод тех же номеров строк и символов, что и ранее (при несоответствиях в вызовах операторов);
  • non-pod-global-static: устранён ложный срабатывание с Q_IMPORT_PLUGIN в Qt-6.10;

В этом выпуске добавлены следующие возможности:

  • Clazy теперь можно интегрировать в clang-tidy — одна команда для управления всеми проверками;
  • включить все проверки; для этого используйте «clazy-<имя_проверки>», например:
  • `clazy-qstring-arg,clazy-qfileinfo-exists`; включение всех проверок с помощью
  • `clazy-*` также включает ручную проверку; рекомендуется использовать более детальную настройку.
  • Модуль загружается с помощью `-load=ClazyClangTidy.so`; для этого плагин
  • Должна находиться в переменной окружения LD_LIBRARY_PATH; либо можно указать абсолютный путь.
  • Добавлены подсказки по исправлению для всех сценариев использования isempty-vs-count;
  • длина теперь проверяется с использованием «== 0», «< 1», «> 0»; об этом сообщается и доступны исправления.
  • qt6-\* Проверки переноса считаются устаревшими и будут удалены в следующем выпуске clazy;
  • В проверках detaching-temporary и detaching-member реализованы автоматические исправления для методов, имеющих константные аналоги.
  • Теперь в clazy работают все директивы NOLINT, NOLINTNEXTLINE, NOLINTBEGIN и NOLINTEND;
  • ожидаемо. Отдельные проверки clazy можно отключить при использовании «clazy-»;
  • Например, «NOLINTNEXTLINE(clazy-qfileinfo-exists, clazy-qstring-arg)»;
1.15 2025-06-12

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

  • install-event-filter: исправлено аварийное завершение при отсутствии дочернего элемента на указанной глубине. ОШИБКА: 464372;
  • fully-qualified-moc-types: исправлена неверная обработка перечислений и классов перечислений. ОШИБКА: 423780
  • Исправлено аварийное завершение в сравнении строки с неявным символом;
  • Исправлено аварийное завершение при обработке сигналов с выражениями типа «std::bitset<int(8)>» в модуле `fully-qualified-moc-types`;
  • Исправлено аварийное завершение при создании экземпляра шаблона QVariant;

В этом выпуске добавлены следующие возможности:

  • Новые проверки:
  • отсоединение при блокировке чтения;
  • Минимальная версия Clang/LLVM обновлена до 19;
  • `clazy-standalone --version` содержит номер версии git (результат выполнения `git describe`), если это не фиксация с меткой;
  • Добавлены отсутствующие методы для проверки отсоединения временных списков, карт или их членов;
1.14 2025-04-27

Предупреждения Clazy для следующей строки можно отключить, например: clazy: exclude-next-line=check1,check2

Поддержка компиляции с использованием Clang 20

Увеличена детализация некоторых предупреждений

проверки `function-args-by-value` и `function-args-by-ref`: в сообщение предупреждения добавлено имя функции и параметра

проверки `unused-non-trivial-variable` и `non-pod-global-static`: добавлено имя переменной в предупреждение

В этом выпуске добавлены следующие возможности:

  • Новые проверки:
  • преобразование QByteArray в стиль C;
1.13 2024-12-28

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • Проверка неиспользуемых переменных;

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

  • Проверка qstring-arg предоставляет исправление;
  • Исправлено предупреждение «unused-non-trivial-variable» при установке атрибута «[[maybe_unused]]»;
  • Исправлена функция QString::arg() для будущей версии Qt 6.9;
  • Исправлено ложное срабатывание fully-qualified-moc-types для модификаторов const обобщённых аргументов;
  • Отключено ложное предупреждение «non-pod-global-static» при инициализации модуля QML;
  • Исправлена ложная срабатываемость функции «function-args-by-value», которая вызывала ошибку компиляции;
  • в конструкторах копирования, операторах присваивания и проверках на равенство;
  • Исправлены ложные срабатывания для `Q_EMIT(someSignal())`;
1.12 2024-06-30

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • Ключевое слово «emit» в Qt;
  • очистка ключевого слова inline;
1.11 2022-01-21

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • использование оператора «->» вместо метода «data»;
  • использовать статические объекты QRegularExpression;
  • неожиданное значение перечислителя флага;
  • Удалена проверка inefficient-qlist (исправлено в Qt6);
1.10 2021-07-20

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

  • Требуется C++17;
  • Исправлены ошибки:
  • Исправлено ложное срабатывание диагностики -Wclazy-lambda-in-connect.
  • Исправлено аварийное завершение в copyable-polymorphic при включённом PCH;
1.9 2021-01-10

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

  • Исправлено замедление clazy, появившееся в версии 1.8; теперь он может работать до 4 раз быстрее.
  • Диагностика range-loop разделена на range-loop-detach и range-loop-reference;
  • Исправлены ложные срабатывания диагностики -Wclazy-connect-non-signal;
1.8 2020-11-22

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • Сигнатура qHash для Qt6;
  • Исправления заголовков Qt6;
  • Исправления устаревшего API Qt6;
  • использование chrono в QTimer;
  • Исправление для отсутствующего макроса Q_OBJECT;
1.7 2020-06-29

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • перегруженный сигнал;
  • некорректные подписи JNI;
  • сравнение строки с неявным символом;
  • Замена `QLatin1String` на `QString` в Qt6;
  • heap-allocated-small-trivial-type: уменьшено число ложных срабатываний;

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

  • connect-non-signal: исправлен случай, когда pmf не находился;
  • Предупреждение при использовании QLatin1String::arg(int) из-за приведения к QChar;

Сборка самого clazy ускорилась на 30 %

1.6 2019-10-12

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • выделение в куче малых тривиальных типов;
  • сигнал с возвращаемым значением;
  • qproperty-type-mismatch, реализовано Jean-Michaël Celerier.

Удалён уровень 3. Все проверки этого уровня перенесены в ручной режим. Их одновременное включение не имеет смысла.

Каждый из них должен быть тщательно проанализирован.

Минимальная версия LLVM увеличена до 5.0

В Clazy больше не выполняется прямая перезапись файлов, чтобы избежать конфликтов при одновременном изменении одного и того же заголовка.

Теперь Clazy экспортирует файл YAML с заменой, который можно применить с помощью clang-apply-replacements.

Так же, как это делает любой другой инструментарий clang.

Теперь для включения перезаписи кода используется параметр: -Xclang -plugin-arg-clazy -Xclang export-fixes для clang

или -export-fixes=somefile.yaml для clazy-standalone

Удалены все остальные аргументы и переменные окружения fixit.

Благодарим Christian Gagneraud за вклад в создание экспорта yaml для исправлений!

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

  • Исправлены регрессии в LLVM 9.0;
  • Инфраструктура быстрого исправления была полностью переработана;
1.5 2019-01-31

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • Ошибка в директиве препроцессора #ifndef/#define.
  • нижний регистр в имени типа QML;
  • qrequiredresult-candidates
  • Новые автоматические исправления;
  • В анализаторе range-loop реализована поддержка добавления отсутствующих ссылок или константных ссылок;
  • Цикл range-loop теперь поддерживает добавление qAsConst();
  • проверка «function-args-by-ref» теперь добавляет отсутствующие ссылки или константные ссылки (экспериментально);
  • Добавлена переменная окружения CLAZY_FIXIT_SUFFIX;

Удалена поддержка малоиспользуемого параметра «-DCLAZY_BUILD_UTILS_LIB» для упрощения файла CMakeLists.txt.

Переименован плагин clazy с «ClangLazy.so» на «ClazyPlugin.so».

fully-qualified-moc-types теперь предупреждает о возвращаемых значениях слотов и вызываемых методов. Для QML они должны быть полностью квалифицированы.

В этом выпуске исправлена следующая ошибка:

  • Исправлено аварийное завершение (утверждение clang) в функции raw-environment-function;
1.4 2018-09-23

В этом выпуске добавлены следующие возможности:

  • Добавлены проверки:
  • подключение по названию;
  • пропущенный базовый метод;
  • qstring-varargs;
  • полная квалификация типов MOC.
  • Ключевые слова Qt, с включённой функцией автоматического исправления;
  • qhash с ключом-указателем на символ;
  • неправильное приведение типа qevent;
  • статический указатель на функцию-член;
  • функция необработанного окружения;
  • пустая строка QStringLiteral;
  • В auto-unexpected-qstringbuilder добавлена проверка лямбда-выражений, возвращающих QStringBuilder;

Оптимизация производительности

Добавлен параметр -header-filter=<regex> для clazy-standalone. Проверяться будут только заголовки, соответствующие регулярному выражению.

имеют предупреждения, кроме файла .cpp из единицы трансляции, который никогда не исключается.

Добавлен параметр -ignore-dirs=<regex> для clazy-standalone и эквивалентная ему переменная окружения CLAZY_IGNORE_DIRS.

Добавлена переменная окружения CRAZY_HEADER_FILTER, реализующая указанную функциональность как для clazy, так и для clazy-standalone.

Для параметра «unused-non-trivial-variable» добавлена возможность «unused-non-trivial-variable-no-whitelist».

Добавлена поддержка пользовательских чёрного и белого списков для переменной unused-non-trivial-variable.

Проверка container-inside-loop теперь выполняется вручную, а не на уровне 2.

Уровень «Hidden» переименован в «Manual».

Модуль connect-3arg-lambda теперь предупреждает о передаче лямбда-выражения в QTimer::singleShot() или QMenu::addAction().

без объекта контекста

Теперь old-style-connect проверяет также QMenu::addAction() и QMessageBox::open()

1.3 2017-11-26

В этом выпуске добавлены следующие возможности:

  • Новые проверки:
  • Использование слотов в потоках
  • lambda с тремя аргументами в connect;
  • Свойство Q_PROPERTY без сигнала NOTIFY;
  • виртуальный сигнал;
  • переопределённый сигнал;
  • Проверка пространства имён в qhash;
  • Константные сигналы и слоты;
  • уникальное подключение сигнала с помощью лямбда-выражения;

Проверка missing-qobject-macro перемещена с уровня 1 на уровень 2, так как Q_OBJECT может быть опущен намеренно.

Добавлен параметр «-only-qt», при котором clazy немедленно прекращает анализ файлов, не относящихся к Qt. Под файлом Qt понимается файл, для которого задан макрос «-DQT_CORE_LIB», что является стандартной практикой в большинстве систем сборки.

Добавлен параметр «-qt-developer» для сборки Qt с использованием clazy, обеспечивающий соблюдение определённых рекомендаций для Qt. На данный момент их немного, но список будет пополняться.

1.2 2017-07-08

В этом выпуске добавлены следующие возможности:

  • Новые проверки:
  • Установлен фильтр событий;
  • Создание цвета из строкового литерала;
  • строгие итераторы;
  • Проверка использования функции connect() с нормализацией сигналов и слотов;

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

  • Исполняемый файл clazy-standalone теперь позволяет запускать clazy с использованием базы данных компиляции в формате JSON вместо работы в качестве плагина; это хороший обходной способ, поскольку clang-tidy не поддерживает загрузку внешних модулей (https://github.com/llvm/llvm-project/issues/32086);
  • режим совместимости с Qt5: позволяет отключить специфичные для Qt5 проверки, передав параметры -Xclang -plugin-arg-clazy -Xclang qt4-compat;
  • возврат данных из временного объекта теперь проверяет приведение временных объектов QByteArray к char* при возврате;
  • В модуле «returning-data-from-temporary» теперь проверяются не только операторы возврата, но и присваивания;
  • unused-non-trivial-variable теперь предупреждает о неиспользуемых типах QList, QVector и многих других;
  • Добавлена поддержка проверок на основе ASTMatchers;
  • Поддержка clang 3.7 прекращена из-за несовместимости исходного кода ASTMatchers;
  • Использование clazy v1.1 для поддержки clang >= 3.6;
  • Библиотека clazylib.so больше не собирается по умолчанию; собирается только плагин ClangLazy.so. Передайте параметр -DCLAZY_BUILD_UTILS_LIB=ON для включения сборки библиотеки утилит, если вы разрабатываете инструменты с использованием вспомогательных функций clazy, что маловероятно;
  • Параметр CLAZY_INSTALL_NO_HEADERS удалён. Теперь библиотека утилит и заголовочные файлы устанавливаются либо полностью, либо не устанавливаются вовсе. По умолчанию устанавливаются только плагин и страницы руководства;
1.1 2017-02-20

В этом выпуске добавлены следующие возможности:

  • Поддержка macOS и Windows;
  • Новые проверки:
  • Приведение типа QObject в обработчике дочерних событий;
  • Конструктору не передан аргумент родительского класса;
  • возврат данных из временного объекта;
  • Макросы Qt;
  • событие базового класса;
  • подключение к несигнальному слоту;
  • некорректный вызов сигнала;
  • Недословный перевод;
  • Исправления:
  • clang 4.0;
  • Qt 5.9;
  • Замечания:
  • Производительность увеличена на 60%.
  • Исправлено множество ложных срабатываний;
1.0 2016-09-12
0.0.1 2015-06-10
Первый выпуск