Skip to content

Conversation

@sefrolov
Copy link

@sefrolov sefrolov commented Sep 27, 2025

Данное дополнение позволяет анализировать файлы test/* и src/* на наличие всех необходимых и отсутствие лишних заголовочных файлов.
В случае локального использования выдаёт результаты проверки, как warning'и при билде, при этом не мешая далее запуститься стандартному тестированию решения на тестах. При недоступности include-what-you-use для CMake, будет выдано предупреждение при сборке CMake.
В случае тестов с помощью GitHub Actions, по ходу подготовки к билду скачивает include-what-you-use (sudo apt-get install -y iwyu) и проводит проверку. Предупреждения, выданные им, показываются по всем файлам, но после билда ран завершится с exit 1, таким образом, тесты не пропустят решение с лишними/недостающими заголовочными файлами.

Для корректности работы проверок и получения ожидаемого результата добавлен mapping file libstdcxx.imp который поясняет iwyu какому приватному заголовку соответствует стандартный публичный заголовок (при поиске нужного заголовка iwyu может найти приватный заголовк-источник символа). Такая проблема гораздо меньше проявляется в libc++, потому что в нём публичные заголовки лучше обрабатывают приватные и iwyu находит публичные версии. Необходимость такого маппинга видна при использовании в коде, например, std::vector в сборке с debug.
image
Такой mapping file получается с помощью поставляемого с include-what-you-use файла iwyu-mapgen-libstdcxx.py, который сопоставляет каждому приватному заголовку публичный заголовок, который его включает.

Далее несколько примеров вывода тестирования в разных условиях:

  1. Базовая ситуация, всё соответствует требованиям, ничего лишнего не выводится, тест завершается положительно при условии прохождения тестов задания:
image
  1. В коде solution2.cpp есть #include <type_traits>, но ничего из него не используется. При этом используется std::vector без соответствующего заголовка, но программа компилируется, так как в solution.h есть #include <vector>. При тестировании вывелись связанные с этим предупреждения и тесты завершились с exit 1:
image
  1. Недочёты по неаккуратному использованию заголовочных файлов имеются в нескольких файлах. При этом соответствующие предупреждения выведены для всех файлов, после чего тесты завершились с exit 1:
image
  1. Пример вывода в CLion при лишнем #include <set> в solution.cpp:
image
  1. Warning при отсутствии доступа к include-what-you-use, сборка продолжена, просто проверка будет отключена при локальном тестировании:
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants