C++|VS2019: 进一步新增了C++代码分析规则( 三 )


这就是为什么已有禁止这种滥用的规则的原因 。考虑以下示例:

foo()函数的目的是比较两个值 , 并在它们相等时返回S_OK 。但是 , 如果值相等 , 它将返回S_FALSE , 如果值不同 , 则返回S_OK 。这与预期的行为完全相反 。但是 , 此代码可能会编译得很好 , 而不会收到有关此潜在缺陷的警告 。幸运的是 , C++代码分析可以检测到此情况 , 并将报告C6216警告 , 这是有关将布尔值隐式转换为HRESULT的常规警告 。
在布尔值和HRESULT值的各种潜在滥用中 , 我们了解到 , 一种特定情况比其他情况更常发生 , 并导致更明显的错误 。我们创建了一个额外的扩展来解决这种情况 – HResultCheck 。
HResult规则HResultCheck扩展发现从函数以HRESULT值返回C样式BOOL FALSE的情况 , 导致在意图可能返回失败结果时返回S_OK:
> C33020:检测到错误的HRESULT用法 。
> C33022:检测到可能不正确的HRESULT用法(低置信度) 。
C33020规则这是一个高置信度警告 , 指示HRESULT返回函数返回FALSE 。在许多情况下 , 开发人员将FALSE视为失败值 , 并从函数中返回它以指示失败 。但是 , FALSE的值为0 。 当解释为HRESULT值时 , 该值变为S_OK , 表示成功 。
这是一个简化的示例:

可以固定返回正确的HRESULT值:

C33022警告如果返回最终结果的行上某处存在FALSE , 则对于返回HRESULT的函数 , 这是低置信度警告 。
这是一个简化的示例:

可以固定返回正确的HRESULT值:

在Visual Studio中启用HResult规则可以通过为项目选择不同的规则集 , 在Visual Studio中启用HResult规则 , 如下所示:

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


推荐阅读