Visual Studio 2017 15.6 Preview 2 中的C++核心准则检查
[原文发表地址]:C++ Core Check in Visual Studio 2017 15.6 Preview 2
[原文发表时间]:2018年1月18日
[作者]:Andrew Pardoe [MSFT]
这篇文章是由Sergiy Oryekhov写的。
请注意,docs.microsoft.com的某些链接尚未解决。 并非所有的官方文档都是为这个主题撰写的。
Visual Studio 2017 15.6 Preview 2包含一组对C++ 核心准则检查扩展的更新。 我们添加了更多检查来帮助您完成代码更清洁,更安全和可维护的工作。 本文档是对新规则的简要概述。 有关这些规则的更多详细信息以及可用规则的更新列表可以在此处找到:
- Visual Studio 2017 15.6预览2中的C ++ 核心检测:整数溢出规则
- Visual Studio 2017 15.6预览2中的C ++ 核心检测:生命周期规则
- C ++核心准则检查参考
本版本还对本地代码分析工具的用户体验进行了总体改进:Visual Studio 2017 15.6 预览 2的C ++静态分析改进
新的规则集
本版本中引入了两个新的规则类别,其中可以在项目配置中选择相应的规则集文件以过滤静态分析结果:
- 算术规则
这些规则专注于算术运算可能导致数据丢失,未定义行为或溢出的情况。
- 生命周期规则
这套规则以前以实验性C ++核心检查的形式发布(目前仍然可用)。 对于15.6,它被完全重写,并且它的第一个版本已准备好进行评估。 主要焦点是捕获非常危险的情况,在这种情况下,代码访问由于其内容的生命周期结束而不再有效的内存位置(例如,局部变量不在范围内并被销毁)。
新规则
- 类规则
- C26433 OVERRIDE_EXPLICITLY当一个方法重写一个基本的虚函数时,它应该使用' override’ '说明符清楚地说明这一点。
- C26435 SINGLE_VIRTUAL_SPECIFICATION方法应该使用单个说明符(virtual’, ‘override’, or ‘final’)来清楚地说明它们的虚拟行为。
- C26443 NO_EXPLICIT_DTOR_OVERRIDE析构函数是非常特殊的方法,它们的准则与OVERRIDE_EXPLICITLY规则不同:如果基类具有虚拟析构函数,建议依赖隐式重写。
- 声明规则
- C26444 NO_UNNAMED_RAII_OBJECTS此规则有助于检测那些潜在的昂贵的对象被创建并被立即丢弃的常见状况。 这通常表示忽略调用结果或资源处理效率低下。
- 算术规则
- C26450 RESULT_OF_ARITHMETIC_OPERATION_PROVABLY_LOSSY常量的算术运算有时会导致意外溢出,这在用户代码中不明显,但可以通过自动工具轻松识别。
- C26451 RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE由于操作顺序和不明显的溢出,向更宽泛类型转换可能无效并导致意外结果。 例如,算术运算在转换为64位类型之前可能会导致32位整数结果溢出。
- C26452 SHIFT_COUNT_NEGATIVE_OR_TOO_BIG如果操作数类型移位计数不适用于左移,则移位整数值可能导致未定义的行为。
- C26453 LEFTSHIFT_NEGATIVE_SIGNED_NUMBER负符号整数的左移有未定义的结果。
- C26454 RESULT_OF_ARITHMETIC_OPERATION_NEGATIVE_UNSIGNED此规则检测减法运算是否导致将负数转换为无符号类型,这总是溢出。
- 生命周期规则
- C26486 LIFETIMES_FUNCTION_PRECONDITION_VIOLATION如果将指针传递给某个函数,则应该指向一个有效的内存位置,即指向具有有效对象或nullptr的位置。
- C26487 LIFETIMES_FUNCTION_POSTCONDITION_VIOLATION如果函数返回一个指针,它必须指向一个有效的对象,该对象将超出该函数或是nullptr。
- C26489 LIFETIMES_DEREF_INVALID_POINTER此规则尝试捕获本地指针获取指向临时对象的值的场景。 如果在目标可能不存在的地方访问这样的指针,这显然会导致灾难性的结果。
最后
好的工具可以帮助您维护和升级您的代码。 C ++核心准则是一个很好的开始,C ++核心准则检查器可以帮助您清理代码并保持清洁。 尝试Visual Studio 2017 15.6版中扩展的C ++核心指南检查器,并让我们知道您的想法。
如果您对我们有任何意见或建议,请告诉我们。 我们可以通过以下评论,通过电子邮件(visualcpp@microsoft.com)与您联系,您可以通过产品中的帮助>报告问题或通过开发者社区提供反馈。 您还可以在Twitter(@VisualC)和Facebook(msftvisualcpp)上找到我们。