Существует несколько инструментов статического анализа, разработанных для C / C ++, но они не особенно полезны для тестирования источников CUDA.
поскольку лязг версия 6 В состоянии скомпилировать CUDA, я хотел проверить, какие у меня есть варианты с использованием clang-tidy, который, похоже, не имеет опции для переключения архитектур.
Есть ли способ заставить его работать? Например, переключатель времени компиляции для включения синтаксического анализатора CUDA, расширение в форме пользовательской проверки или это запланированная функция?
Одна из проблем с инструментами на основе Clang заключается в том, что они не Разбор файлов точно так же, как это делает Clang.
Первая проблема заключается в том, что в отличие от компиляции C / C ++, компиляция CUDA компилирует исходный код несколько раз. По умолчанию clang создает несколько заданий компиляции, когда вы даете ему файл CUDA, и это отключает многие инструменты, которые ожидают только одну компиляцию. Для того чтобы обойти это нужно пройти --cuda-host-only
вариант лязгать.
Вам также может понадобиться пройти --cuda-path=/path/to/your/CUDA/install/root
поэтому Clang может найти заголовки CUDA.
Другая проблема, с которой вы можете столкнуться, связана с включением путей. Производные от Clang инструменты не имеют тех же стандартных путей включения, которые использует сам Clang, что иногда вызывает странные проблемы. По крайней мере, Clang-Tidy необходимо найти __clang_cuda_runtime_wrapper.h
который устанавливается вместе с лязгом. Если вы бежите clang-tidy your-file.c -- -v
он будет печатать аргументы clang и включать пути поиска, которые он использует. Сравните это с чем clang -x c /dev/null -fsyntax-only -v
печать. Возможно, вам придется дать clang-tidy
дополнительные пути включения, чтобы соответствовать тем, которые используются clang
сам. Обратите внимание, что вы должны не явно добавить путь к CUDA включает в себя здесь. Он будет добавлен в нужном месте автоматически --cuda-path=...
,
После того, как все будет готово, clang-tidy должен работать с файлами CUDA.
Что-то вроде этого:
clang-tidy your-file.cu -- --cuda-host-only --cuda-path=... -isystem /clang/includes -isystem /extra/system/includes
Других решений пока нет …