C++代码分析:从命令行配置规则

这篇文章由Sunny Chatterjee和Andrew Pardoe撰写

null

Visual Studio 15.7预览版3引入了一个新的MSVC编译器开关, /analyze:ruleset ,配置代码分析运行。这种转换的主要动机是使使用C++代码分析的开发人员不使用MSBug来过滤规则。但是,将代码分析与MSBuild结合使用的开发人员也可以从这种切换中获益:代码分析运行速度更快,提高了编译吞吐量。

什么是代码分析规则集?

代码分析规则集允许您选择在分析代码时看到的代码分析结果。代码分析规则集位于“项目”>“属性”>“代码分析”>“常规”中。默认情况下,一个新的C++项目选择了规则集“微软本地推荐规则”。

图片[1]-C++代码分析:从命令行配置规则-yiteyi-C++库

可以使用突出显示的下拉列表从要应用于项目的规则集中进行选择。

VisualStudio附带了一些内置规则集,您可以从中选择。它们位于 %VSINSTALLDIR%Team ToolsStatic Analysis ToolsRule Sets . 我们正在增加这套规则,请关注 VC博客 了解更多信息。

您还可以创建自己的自定义规则集并将其应用于项目。要创建自定义规则集,请转到“文件”>“新建”>“文件”>“常规”>“代码分析规则集”。

图片[2]-C++代码分析:从命令行配置规则-yiteyi-C++库

在VisualStudio 2017版本15.7预览3之前,每次运行C++代码分析时都会运行所有规则。当您为给定项目运行代码分析时,像C++核心检查这样的检查程序会生成一个缺陷列表。代码分析完成后,会有一个MSBuild任务,它将缺陷列表合并在一起,并根据为项目选择的规则集对它们进行筛选。仅显示适用于当前选定代码分析规则集的警告。

如果您在VS环境中进行构建,那么旧的机制非常有效,但是有几个方面还不够。首先,如果您在自定义构建环境中使用VS编译器工具集,则无法通过规则集获得任何配置选项。您必须根据需要编写自己的工具来过滤缺陷。第二,在当前VS环境本身中,规则集过滤机制本质上是一个后处理工具——checker完成生成缺陷的所有工作,然后最终过滤掉缺陷。我们补充道 /analyze:ruleset 在MSVC编译器工具集中克服这些缺点的代码分析经验。

你怎么知道的/analyze:ruleset work?

新的 /analyze:ruleset 选项可用于任何生成配置:在VS内部或外部,使用MSBuild、Ninja或自定义生成系统。这个新选项允许编译器根据规则集中指定的规则集直接过滤出缺陷。既然编译器知道哪些规则是活动的,它就可以将这些知识传递给各个checker,这样他们就可以做出明智的决定。例如,如果规则集只指定类型安全的规则,则更昂贵的检查(如生存期)可以自行关闭,因此您只需支付分析成本方面所需的费用。不必运行未选定的规则意味着您的代码分析体验更快、更流畅。

使用/analyze:ruleset

利用这个新开关很简单:只需定义自己的规则集文件,并在运行代码分析时将该选项传递给编译器。最好用一个逐步的例子来说明这一点。在本例中,我们将检测程序中与未初始化变量相关的所有缺陷。

  1. 首先,我们需要确定一组规则来检测未初始化的变量和内存。在本例中,我们选择两个有帮助的规则,C6001和C26494。
  2. 现在需要创建一个包含所选规则集的规则集文件。我们可以在visualstudio中这样做,也可以通过编写简单的XML来手动创建规则集。
  3. 现在我们有一个规则集文件,它看起来像下面我们保存为 UninitVariable.ruleset .

    [xml文件]<?xml version=“1.0”encoding=“utf-8”?>[/xml]

  4. 对于这个例子,我们的测试文件如下所示。我们称之为 test.cpp .
    int f( bool b ){   int i;   if ( b )   {      i = 0;   }   return i; // i is unintialized if b is false}
  5. 我们在没有任何配置选项的情况下运行代码分析,并观察以下警告:
    E:	est>cl.exe /c test.cpp /analyze:plugin EspXEngine.dllMicrosoft (R) C/C++ Optimizing Compiler Version 19.14.26329 for x86Copyright (C) Microsoft Corporation.  All rights reserved.test.cppe:	est	est.cpp(8) : warning C6001: Using uninitialized memory 'i'.: Lines: 3, 4, 8e:	est	est.cpp(3) : warning C26494: Variable 'i' is uninitialized. Always initialize an object (type.5).e:	est	est.cpp(1) : warning C26497: The function 'f' could be marked constexpr if compile-time evaluation is desired (f.4).e:	est	est.cpp(1) : warning C26440: Function 'f' can be declared 'noexcept' (f.6).
  6. 接下来,我们传递附加的编译器选项,以指定用于标识未初始化变量的自定义规则集: /analyze:ruleset UninitVariable.ruleset .
    E:	est>cl.exe /c test.cpp /analyze:plugin EspXEngine.dll /analyze:ruleset UninitVariable.rulesetMicrosoft (R) C/C++ Optimizing Compiler Version 19.14.26329 for x86Copyright (C) Microsoft Corporation.  All rights reserved.test.cppe:	est	est.cpp(8) : warning C6001: Using uninitialized memory 'i'.: Lines: 3, 4, 8e:	est	est.cpp(3) : warning C26494: Variable 'i' is uninitialized. Always initialize an object (type.5).

/analyze:ruleset 选项,代码分析只运行未初始化变量的规则,与这些规则无关的其他警告不再显示。

最后

我们希望你能找到 /analyze:ruleset 用于配置在专用生成环境中运行的代码分析的选项。我们已经开始利用它了!例如,我们在visualstudio中的代码分析目标文件现在通过 /analyze:ruleset 运行代码分析时编译器的选项。这样我们就可以根据所选的规则集优化检查。我们将在未来引入新的默认规则集,以及在VisualStudio中支持在CnGueNuja和VisualStudio等构建环境中运行C++代码分析。

一如既往,我们欢迎您的反馈。我们可以通过下面的评论或电子邮件联系我们( visualcpp@microsoft.com ).

如果您在Visual Studio 2017中遇到MSVC的其他问题,请联系我们 帮助>报告产品中的问题 ,或通过 开发者社区 . 把你的建议告诉我们 用户语音 . 你也可以在Twitter上找到我们( @视觉 )还有Facebook( msftvisualcpp软件 ).

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享