clang-tidy на Windows с MSVC2015

Я пытаюсь использовать clang-tidy на Windows - пока без успеха.

В качестве предварительного условия я установил LLVM 3.9.1.

Мой обычный компилятор - MSVC 2015, моя система сборки - QBS 1.7.2. Используя QBS, я сгенерировал compile_commands.json, Конечно, этот файл содержит MSVC 2015 cl.exe флаги / аргументы. Вот выдержка, показывающая запись для одного файла:

{
    "arguments": [
        "C:/Programs/MVS14/VC/bin/amd64/cl.exe",
        "/nologo",
        "/c",
        "/EHsc",
        "/Zi",
        "/MDd",
        "/IC:\\some_ci_job_folder\\src\\some_component\\include",
        "/IC:\\some_ci_job_folder\\src\\some_needed_component\\include",
        "/IC:\\Programs\\Qt\\Online\\5.6\\msvc2015_64\\include",
        "/IC:\\Programs\\Qt\\Online\\5.6\\msvc2015_64\\include\\QtCore",
        "/IC:\\Programs\\Qt\\Online\\5.6\\msvc2015_64\\mkspecs\\win32-msvc2015",
        "/IC:\\some_ci_job_folder\\target\\build\\win64-vc14-qt56x-debug\\some_component.win64-vc14-qt56x.ce20db24\\qt.headers",
        "/D_MBCS",
        "/DWIN32",
        "/DQT_CORE_LIB",
        "/DNOMINMAX",
        "/DQT_DISABLE_DEPRECATED_BEFORE=0x000000",
        "/DVERSION_ID=\"MAJOR_UNDEF.MINOR_UNDEF-REVISION_UNDEF\"",
        "/DVERSION_MAJOR=0",
        "/DVERSION_MINOR=0",
        "/DVERSION_REVISION=0",
        "/DUSES_QT",
        "/D_DEBUG",
        "/D__mswin__",
        "/DUSE_RVALUE_REFS=1",
        "/D_CRT_SECURE_NO_DEPRECATE",
        "/D_SCL_SECURE_NO_WARNINGS",
        "/DWINVER=0x0502",
        "/D_WIN32_WINNT=0x0502",
        "/D_WIN32_WINDOWS=0x0502",
        "/TP",
        "/FS",
        "/Zm200",
        "/W4",
        "/FS",
        "/GR",
        "/wd4018",
        "/wd4063",
        "/wd4100",
        "/wd4121",
        "/wd4127",
        "/wd4150",
        "/wd4189",
        "/wd4238",
        "/wd4239",
        "/wd4244",
        "/wd4245",
        "/wd4267",
        "/wd4290",
        "/wd4389",
        "/wd4510",
        "/wd4512",
        "/wd4610",
        "/wd4718",
        "/wd4481",
        "/FoC:\\some_ci_job_folder\\target\\build\\win64-vc14-qt56x-debug\\some_component.win64-vc14-qt56x.ce20db24\\.obj\\f27fede2220bcd32\\foo.cpp.obj",
        "/FdC:\\some_ci_job_folder\\target\\build\\win64-vc14-qt56x-debug\\some_component.win64-vc14-qt56x.ce20db24\\.obj\\f27fede2220bcd32\\",
        "C:\\some_ci_job_folder\\src\\some_component\\src\\foo.cpp"
    ],
    "directory": "C:/some_ci_job_folder/target/build/win64-vc14-qt56x-debug/some_component.win64-vc14-qt56x.ce20db24/.obj",
    "file": "C:/some_ci_job_folder/src/some_component/src/foo.cpp"
},

Переключение на папку задания / проекта C:/some_ci_job_folder/ и работает

clang-tidy -p target\build\win64-vc14-qt56x-debug src\some_component\src\foo.cpp 1>clang-tidy.txt 2>&1

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

... warnings and 1 error generated.
Error while processing C:\some_ci_job_folder\src\some_component\src\foo.cpp.
warning: /DNOMINMAX: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /DQT_CORE_LIB: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
... more warnings about defines ...
warning: /D_WIN32_WINDOWS=0x0502: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /D_WIN32_WINNT=0x0502: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /D__mswin__: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /EHsc: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /FS: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /FdC:\some_ci_job_folder\target\build\win64-vc14-qt56x-debug\some_component.win64-vc14-qt56x.ce20db24\.obj\f27fede2220bcd32\: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /FoC:\some_ci_job_folder\target\build\win64-vc14-qt56x-debug\some_component.win64-vc14-qt56x.ce20db24\.obj\f27fede2220bcd32\foo.cpp.obj: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /GR: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\Programs\Qt\Online\5.6\msvc2015_64\include: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\Programs\Qt\Online\5.6\msvc2015_64\include\QtCore: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\Programs\Qt\Online\5.6\msvc2015_64\mkspecs\win32-msvc2015: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\some_ci_job_folder\src\shared\some_needed_component\include: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\some_ci_job_folder\src\shared\some_component\include: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\some_ci_job_folder\target\build\win64-vc14-qt56x-debug\some_component.win64-vc14-qt56x.ce20db24\qt.headers: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /MDd: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /TP: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /W4: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /Zi: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /Zm200: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /c: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /nologo: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /wd4189: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
... more warnings ...
warning: /wd4718: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
C:\some_ci_job_folder\src\some_component\src/foo.h:71:10: error: 'some_needed_component/bar.h' file not found [clang-diagnostic-error]
#include "some_needed_component/bar.h"
         ^

Любая идея, почему clang-tidy не интерпретирует cl варианты правильно (по умолчанию)?

Хорошо, после поиска в Google я обнаружил, что добавление --driver-mode=cl может улучшить вещи. Но

clang-tidy -p target\build\win64-vc14-qt56x-debug src\some_component\src\foo.cpp -- --driver-mode=cl 1>clang-tidy.txt 2>&1

все еще дает мне

1 warning and 1 error generated.
Error while processing C:\some_ci_job_folder\src\some_component\src\foo.cpp.
warning: unknown argument ignored in clang-cl: '-resource-dir=C:\Programs\LLVM-3.9.1\bin\..\lib\clang\3.9.1' [clang-diagnostic-unknown-argument]
C:\some_ci_job_folder\src\some_component\src/foo.h:71:10: error: 'some_needed_component/bar.h' file not found [clang-diagnostic-error]
#include "some_needed_component/bar.h"
         ^

Так что он больше не жалуется на аргументы пути включения, но насколько я могу судить, эти аргументы просто игнорируются?

Кстати: я бегу clang-tidy изнутри Developer Command Prompt for VS2015, Пока я не совсем уверен, требуется ли это?

Есть идеи... как решить проблему, как отладить оценку аргументов пути включения,...?

2 ответа

Я разработчик Cppcheck.

clang-tidy был интегрирован в графический интерфейс Cppcheck.

Вы можете запустить clang-tidy на компилируемых базах данных или в решениях Visual Studio, используя графический интерфейс Cppcheck. Cppcheck GUI использует собственный анализатор базы данных компиляции, который, возможно, работает не так, как встроенный синтаксический анализатор clang-tidy.

Это бесплатный инструмент с открытым исходным кодом (GPL). Его можно скачать здесь: http://cppcheck.sf.net/

Вот несколько скриншотов: http://cppcheck.sf.net/clangtidy/index.html

Не стесняйтесь попробовать и не стесняйтесь сказать мне, если есть что-нибудь, что мы можем исправить.

Вы можете использовать расширение электроинструментов Clang для VS2015/VS2017 вместо прямого вызова clang-tidy. Работает непосредственно из IDE, вы можете выбрать, какие проверки вы хотите активировать, и он может даже применить автоматические исправления кода для проверок modernize-*.

Другие вопросы по тегам