如何通过CMakeLists.txt在MSVC中使用自定义规则集启用静态分析?

rqdpfwrv  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(103)

我使用cmake(3.23+)为MSVC生成解决方案文件(通过CMakeLists.txt)。
我想对生成的项目启用静态分析,并让它使用我的自定义规则集。我知道MSVC支持一个CmakeSettings.json文件,可以做到这一点,但我不明白它如何与CMakeLists.txt/如何应该包括在这里。
我试过通过命令行参数来实现:

target_compile_options ( ${PROJECT_NAME}
    PRIVATE /MP /analyze /analyze:ruleset ${CMAKE_CURRENT_SOURCE_DIR}/use-after-move.ruleset
)

但是编译器将规则集视为另一个.cpp文件进行编译。生成的命令行如下所示:

CL.exe /c ...list of include directories... /Zi /nologo /W1 /WX- /diagnostics:column /MP /Od /Ob0 /D _MBCS /D WIN32 /D _WINDOWS /D "CMAKE_INTDIR=\"Debug\"" /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++latest /Fo"editor-lib.dir\Debug\\" /Fd".\vsbuild\lib\Debug\editor-lib-d.pdb" /external:W1 /Gd /TP /analyze /errorReport:prompt path/to/use-after-move.ruleset ...list of source files...

我试着用双引号把/analyze:ruleset括起来,但结果是一样的。我也试着用单引号把它括起来,这样它就可以在编译选项中显示出来了,不过是这样的:

'/analyze:ruleset' path/to/ruleset

我也可能错误地使用了这些选项,因为当我手动将它们插入项目属性时,分析不会执行。只有当我删除/analyze:ruleset并只保留/analyze时,分析才会执行(但它默认为Microsoft的所有规则)。

q8l4jmvw

q8l4jmvw1#

我在这条帖子里找到了答案:How to add Property to Affect Code Analysis in CMake
创建用户属性表(另存为EnableUseAfterMoveAnalysis.props):

<Project>
    <PropertyGroup>
        <RunCodeAnalysis>true</RunCodeAnalysis>
        <CodeAnalysisRuleset>path/to/use-after-move.ruleset</CodeAnalysisRuleset>
    </PropertyGroup>
</Project>

然后在CMakeLists.txt中使用set_property将其绑定到项目:

set_property(
    TARGET ${PROJECT_NAME}
    PROPERTY VS_USER_PROPS "path/to/EnableUseAfterMoveAnalysis.props"
)

相关问题