首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

VS2019:新的边界检查规则

最近,我们在Visual Studio v16.10 Preview 3中添加了一项新的实验性的静态分析规则:C26458,

WARNING_PATH_SENSITIVE_USE_GSL_AT。

这项新的警告相比之前的C26446(WARNING_USE_GSL_AT)会显得更加精确和没那么冗杂。这两项分析规则会对容器的未经检查的访问发出警告:”Prefer to use gsl::at() instead of unchecked subscript operator (bounds.4).”

新的警告会使用路径敏感的方法来追踪缓冲区大小校验调用,以提供一种简明的,更加面向目标的精确警告(和C26446警告相比)。

基于路径敏感的分析方法并非一项简单的操作:分析每个函数所需要的复杂度和时间取决于被追踪函数的长度,分支操作的数量和独立属性的数量。路径模拟器将会遍历函数,然后模拟它所遇到的所有分支和循环,然后基于代码中不同的猜测来更新函数内部的状态。让我们来看看下面的代码:

当模拟器执行到分支时,分析组件将会复制它的状态到两个不同的分支中。在一个分支中,它会追踪到:i比v.size()小,在另一个分支中:i会大于等于v.size()。

分析组件并不需要知道i的实际值或者容器v中所包含的元素数量。它只需要知道这两个变量比较的关系。当分析组件执行到一个循环语句时,也会使用相同的手法。

一个例子并和C26446相比

在基于路径的检查中,通过一个模拟的分支模拟器知道v并为空,所以访问其中的第一个元素是一项安全的操作,但是在另一个分支中,v是空的,这就是为什么第二个访问会导致警告。而C26446警告会在任何未调用gsl::span时访问operator[]触发。

为什么这项警告是实验性质的?

当前C26458并不会追踪容器的扩展操作。这就意味着,类似于对push_back,emplace,insert等之类的调用尚未被支持,另外对元素的移除也不会被追踪。但是,与容器的扩展不同,减少需要完全重新验证容器的边界。 在以后的更新中将添加对容器扩展/减少的支持。

如何在VS中启用C26458警告

在工程的属性页面的如下路径可以找到此警告的设置:

[Properties -> Code Analysis -> Microsoft and select C++ Core Guidelines Experimental Rules],如下图所示:

另外,你也可以将C26458配置到当前的规则集合中。

我们建议:当使用了警告C26458后,禁用C26446,这样可以避免一些重复的警告提示。

总结

积极使用静态分析,有助于提前发现代码中的一些容易被开发者忽略的错误,是个好东西。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新的开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。

本文来自:《New Static Analysis Rule for Bounds Checking》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。

我想:你值得拥有。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210523A02RG200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券