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》
- 百度地图导航路口放大图功能正式登陆特斯拉车机地图 精准导航更进一步
- C++核心准则?SF.10:避免依赖隐式包含的名称
- 小米左右为难,常程和联想恩怨进一步加深,雷军真的用错人了?
- C++核心准则SF.11?:头文件应该可以独立工作
- 高通|高通总裁安蒙:明年会进一步丰富产品线,望ARM保持独立性
- 猎云网|进一步深化产研布局,「猎云网首发」保利威完成过亿元B轮融资
- C++|适合 C++ 新手学习的开源项目——在 GitHub 学编程
- C++|多种编程语言对比简介c/c++/java/python
- 光明网社会|第128届广交会“云端”闭幕,进一步扩大“朋友圈”
- 不二科技君|vivo研发总部在东莞举行开工仪式,科技硬实力进一步扩大
