Захват всех вызовов компилятора и параметров командной строки во время сборки

Я хочу запустить инструменты для статического анализа кода C / C ++ (и, возможно, Python, Java и т. Д.) Для большого программного проекта, созданного с помощью make, Как известно, make (или любой другой инструмент сборки) вызывает компилятор и подобные инструменты для указанных файлов исходного кода. Также возможно управлять компиляцией, определяя переменные окружения, которые впоследствии будут передаваться компилятору через его аргументы.

Ключом к точному статическому анализу является предоставление определений и включение путей в точности так, как они были переданы компилятору (в основном все его -D а также -I аргументы). Таким образом, инструмент сможет следовать тем же путям кода, что и компилятор.

Проблема в том, что высокая сложность проекта означает, что нет возможности статически определить такую ​​среду, так как разные файлы создаются с разными наборами путей определения / включения и другими флагами компиляции.

Идея заключается в том, что должна быть возможность каким-то образом захватывать отдельные вызовы компилятора, передавая ему все аргументы для каждого входного файла. Наличие такой информации и ее прямая фильтрация (например, нет необходимости знать -O уровни оптимизации или -W настройки предупреждений) должна быть возможность вызывать статический анализатор для каждого входного файла с идентичным набором определений / включений, используемых только для этого входного файла.

Вопрос в том: Существуют ли инструменты / рабочие процессы, которые реализуют идею, которую я описал? Меня больше всего интересует решение для систем POSIX, но идеи для Windows также приветствуются.

Несколько идей, к которым я пришел самостоятельно.

  • Наиболее тривиальным решением было бы собрать make вывести и обработать его потом. Тем не менее, некоторые проекты имеют правила make-файлов, которые дают очень краткий вывод, а не подробный, поэтому может потребоваться некоторая работа с Make-файлами, что не всегда желательно. Параллельные сборки могут также иметь смешанный вывод на консоли и их невозможно проанализировать. Адаптация к другим системам сборки (Cmake) также не будет тривиальной, так что это далеко не самый удобный способ.

  • Бег make под ptrace и запись всех вызовов exec* системные вызовы, которые соответствуют запуску новых приложений, включая вызовы компилятора. Тогда нужно будет разобрать ptraceвыходной. Этот подход не зависит от системы сборки и языка (отлавливает все вызовы любого компилятора для любого языка) и должен работать для параллельных сборок. Однако это кажется более технически сложным. Снижение производительности в процессе сборки из-за ptrace сидя на makeнепонятно также. Также будет сложнее перенести его на Windows, так как API трассировки программ там несколько другой.

  • Фирменный статический анализатор для C ++ в Windows (и недавно в Linux AFAIK) PVS-Studio, похоже, реализует второй подход, однако подробности о том, как они это делают, приветствуются. Если есть другие IDE / инструменты, которые уже имеют что-то похожее на то, что мне нужно, пожалуйста, поделитесь информацией о них.

1

Решение

Существуют следующие способы сбора информации о параметрах компиляции в Linux:

  1. Переопределить переменные окружения CC / CXX. Используется в утилите скан-сборки от Clang Analyzer. Этот метод надежно работает только с простыми проектами для Make.

  2. PROCFS — вся информация о процессах хранится в /proc/PID/... , Чтение с диска — медленный процесс, возможно, вы не сможете получить информацию обо всех процессах сборки.

  3. Трассирование утилита (библиотека ptrace). Вывод этой утилиты содержит много полезной информации, но требует сложного анализа, потому что информация записывается случайным образом. Если вы не используете много потоков для сборки проекта, это довольно надежный способ сбора информации о процессах. Используется в PVS-Studio.

  4. База данных компиляции JSON в CMake. Вы можете получить все параметры компиляции, используя определение -DCMAKE_EXPORT_COMPILE_COMMANDS=On, Это надежный метод, если проект не зависит от нестандартных переменных среды. Также проект для CMake может быть написан с ошибками и приводить к некорректному Json, хотя это не влияет на сборку проекта. Поддерживается в PVS-Studio.

  5. нести утилита (подстановка функции с использованием LD_PRELOAD). Вы можете получить JSON Database Compilation для любого проекта. Но без переменных окружения будет невозможно запустить анализатор для некоторых проектов. Кроме того, вы не можете использовать его с проектами, которые уже используют LD_PRELOAD для сборки. Поддерживается в PVS-Studio.

Сбор информации о компиляции в Windows для PVS-Studio:

  1. Visual Studio API для получения параметров компиляции стандартных проектов;

  2. MSBuild API для получения параметров компиляции стандартных проектов;

  3. Win API для получения информации о любых процессах компиляции, как, например, Windows Task Manager.

3

Другие решения

VERBOSE=true это опция make по умолчанию для отображения всех команд со всеми параметрами. Это также работает с CMake, например.

Вы можете посмотреть на Coverity. Они присоединяют свой инструмент к компилятору, чтобы получить все, что получает компилятор. Вы можете перезаписать переменные среды CC или же CXX сначала собрать все, а затем вызвать компилятор как обычно.

0

По вопросам рекламы [email protected]