这篇文章是由塞尔吉奥列霍夫和安德鲁帕多写的
加入了一些新的规则 Visual Studio 2017 15.3中的核心准则检查器 ,则为预先存在的代码生成的警告数量可能会大大增加。C++核心指南包括很多建议,这些建议涵盖C++代码中的各种情况。我们知道,不是每个人都能对遗留的代码库进行大规模重写。此博客文章中的技术将帮助您通过选择性地启用警告或启用选定代码区域上的警告,使用C++核心指南来开始向更干净的代码库的增量旅程。
在某些情况下,这些技术将帮助您处理代码分析中的问题。所有的代码分析本质上都是启发式的,可以在代码实际正确的地方产生警告,我们称之为“误报”。下面列出的方法还可以帮助您抑制代码中可能出现的个别误报情况。
使用规则集筛选警告
VisualStudio提供了一些 预定义规则集 在项目上运行代码分析时选择更合适的质量检查级别。在本版本中,我们添加了规则集,这些规则集中在C++核心指南警告的不同组上。通过选择特定的组,您可以对结果进行切片,并更有效地处理结果。
要查看有关新规则集的信息:打开“项目属性”对话框,选择“代码分析常规”,打开“规则集”组合框中的下拉列表,选择“选择多个规则集”:
我们建议从规则集“C++核心检查规则”开始。该规则集包括并启用所有其他C++核心检查类别。
除了“本地最小”和“本地推荐”规则集之外,还包括C++核心检查规则。 C++代码分析工具的其他检查性能 .
请记住,必须启用C++核心指南检查器扩展,以查看这些规则集的警告。启用后,可以选择要显示的警告和要隐藏的警告。
使用宏过滤警告
C++核心指南检查器带有一个头文件,它定义了方便的宏,以减轻代码中的警告抑制:
ALL_CPPCORECHECK_WARNINGSCPPCORECHECK_TYPE_WARNINGSCPPCORECHECK_RAW_POINTER_WARNINGSCPPCORECHECK_CONST_WARNINGSCPPCORECHECK_OWNER_POINTER_WARNINGSCPPCORECHECK_UNIQUE_POINTER_WARNINGSCPPCORECHECK_BOUNDS_WARNINGS
这些宏对应于规则集,并展开为以空格分隔的警告号列表。
这有什么用?通过使用适当的 pragma构造 您可以配置对您的项目(或者您的部分代码)感兴趣的有效规则集。例如,这里我们只想看到关于 缺少常量修饰符 :
#include <CppCoreCheck/Warnings.h>#pragma warning(disable: ALL_CPPCORECHECK_WARNINGS)#pragma warning(default: CPPCORECHECK_CONST_WARNINGS)
使用属性筛选警告
微软Visual C++编译器对 GSL抑制属性 . 此属性可用于抑制函数内表达式和块语句的警告。您可以使用特定警告号(例如,26400)或来自C++核心指南的规则ID(例如, r、 11个 ). 您还可以抑制整个规则组,如下所示。
// Suppress only warnings from the 'r.11' rule in expression.[[gsl::suppress(r.11)]] new int;// Suppress all warnings from the 'r' rule group (resource management) in block.[[gsl::suppress(r)]]{ new int; }// Suppress only one specific warning number.// For declarations, you may need to use the surrounding block.// Macros are not expanded inside of attributes.// Use plain numbers instead of macros from Warnings.h.[[gsl::suppress(26400)]]{ int *p = new int;}
使用命令行选项对警告进行子集设置
你也可以使用 命令行选项 抑制每个文件或每个项目的警告。例如,可以从项目中选择一个文件,并在其属性页中禁用警告26400:
您甚至可以通过指定“/analyze-”暂时禁用文件的代码分析。这将产生警告D9025“用’/analyze-‘重写’/analyze’,这将提醒您稍后重新启用代码分析。
最后
这些C++核心指南检查器规则集, gsl::suppress
属性和宏在Visual Studio 2017中是全新的。请试用它们,并就您喜欢的内容和希望改进的内容向我们提供反馈。
如果您对我们的C++核心指南检查器或Visual C++的任何部分有任何反馈或建议,请告诉我们。我们可以通过以下评论和电子邮件联系到您( visualcpp@microsoft.com )你可以通过 帮助>报告产品中的问题 ,或通过 开发者社区 . 你也可以在Twitter上找到我们( @视觉 )还有Facebook( msftvisualcpp软件 ).