VS 2015 Update 1新增的C++核心准则检测器

[原文发表地址]  VS 2015 Update 1新增的C++核心准则检测器

[原文发表时间] 2015/12/03 7:57 PM

[这篇文章是由Andrew Pardoe和Neil MacIntosh写的]

早在2015 年9月的CppCon 2015上, Neil宣布我们计划发布新的C++代码分析工具,这将执行C++核心准则里的一些规则。(此次谈话的视频:https://www.youtube.com/watch?v=rKlHvAw1z50 和幻灯片:ISOCpp GitHub repo。)

本周早些时候,我们做了这些代码分析工具的第一个系列,作为一个NuGet 包可以被Visual Studio 2015 Update 1的用户免费安装。目前,这个包包括边界类型规则的检测器。并且,Herb Sutter在全员会议上(视频在https://www.youtube.com/watch?v=hEx5DNLWGgA)表示在将来的代码分析工具里我们将支持生命期规则的检查器。

这个包被命名为“Microsoft.CppCoreCheck”,链接:https://www.nuget.org/packages/Microsoft.CppCoreCheck.

为了启用新的代码分析工具,仅仅需要在你的工程中安装NuGet包。

NuGet包新增了一个额外的MSBuild目标文件,当你开启代码分析时调用。这个目标文件将CppCoreCheck作为PREfast代码分析工具的一个插件。你可以通过工程属性对话框里的代码分析区域的复选框开启代码分析功能。无论你选择什么样的规则集---只要你开启了代码分析功能,CPPCoreCheck规则将总是运行。

为了保证Visual Studio的用户受益于C++核心准则的实施,这些工具是很重要的第一步。请注意这个需要Visual Studio Update 1,以前的版本是不支持的。

这里有个这个工具可以找到什么类型的问题的例子:

void main()
{
int arr[10]; // BAD, warning 26494 will be fired
int* p = arr; // BAD, warning 26485 will be fired
[[suppress(bounds.1)]] // This attribute suppresses Bounds rule #1
{
int* q = p + 1; // BAD, warning 26481 would be fired
p = q--; // BAD, warning 26481 would be fired
}
}

有一些有趣的事情需要我们注意。首先,我们来看下警告的全部内容:

· 26494是类型规则5:总是初始化一个对象。

· 26485是边界规则3:禁止数组到指针的转换。

· 26481是边界规则1:不要使用指针运算。使用span。

当安装并开启了CppCoreCheck 代码分析,编译此代码会出现前两个警告。由于定语描述并不会出现第三个警告。开发人员标示此代码块是为了禁止CppCoreCheck 检测任何违反边界规则 1的代码。他也可能标示其它语句以禁止类型规则 5,或甚至通过编写 [[suppress(bounds)]] 而不指定特定的规则号来禁止整个边界规则的检测。C++核心准则有帮助您编写更好更安全的代码,但C++的最终目的是帮助开发人员提高能力来做正确的事。在不需要使用规则检查的实例中,在代码中将其禁止是很简单的。

虽然代码分析工具尚未开源,在NuGet 发布它们意味着我们可以更新以解决任何您可能会发现的问题。我们也期待增加对新规则 (如生命期)的检查器,这是因为它们在准则中被开发。随时通过发邮件至cppcorecheck@microsoft.com提供您的反馈!

包含我们分析工具的 NuGet 包会附属安装一个包含微软实施准则支持库 (GSL) 的包。这个包也支持独立安装:https://www.nuget.org/packages/Microsoft.Gsl。如果你想要遵循核心准则和使用像T*+ length一对参数是GSL中的span<T>类型的结构,此库是必须的。GSL 是开源的,如果你想要看一看库源代码,评论,或作出贡献,请访问https://github.com/Microsoft/GSL

最后,C++核心准则是开放的、 以团队合作为基础的,并本着这种精神我们也想借此机会提醒执行边界和类型规则检查的人员。clang-tidy的开发人员已经在开源的clang-tidy工程里包含了大量的对这些规则的检查。你可以访问https://clang.llvm.org/extra/clang-tidy/得到更多关于clang-tidy和它执行C++核心准则检查的信息。

我们都非常兴奋的看到,所有这些我们在支持核心准则方面迈出的第一步。一如往常,我们欢迎您对使用这些工具和库好坏的反馈,以便我们能不断地改善他们。如果有任何想法,请发邮件至 cppcorecheck@microsoft.com!