最近,我们在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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。