【于2020年8月更新,展示了实现实验能力的新方法】
在 Visual Studio 2019版本16.6预览版2 我们很高兴宣布一个新的预览功能,帮助C++开发人员识别和修复代码缺陷,因为他们编写代码。用于C++检查的智能代码代码 你的代码 “当你打字的时候 , “ 下划线 问题 在 编辑 ,灯泡行动提供 建议的修复方法。
这个新特性是基于VisualStudio中C++的现有智能感知能力构建的。这意味着 s 提供结果的速度比 背景代码分析 . 为了确保IntelliSense保持尽可能快的速度,过梁检查的重点是eas 不小心被发现了 问题。这个 新的 linter检查补充了现有的代码分析工具(如 背景代码分析 使用MSVC或 叮当声 )处理复杂的分析。
你今天可以通过启用i 从实验窗格中删除 在里面 这个 工具 > 选项 菜单,在文本编辑器> C/C++下。
设计目标
在决定什么是好的细毛检查时, 我们 克 pt公司 少许 目标 记住。
- 我 让C++开发者惊讶的缺陷 – 尤其是来自其他语言的多语言开发人员。 l 埋 检查 将 光滑的 一些C++语言特征的学习曲线 .
- O 弗尔建议修复 锿 为了这个问题 s . 正如IntelliSense错误可以帮助您确定什么时候代码会由于语法错误而无法生成一样,linter帮助 s 您可以在之前识别并修复逻辑和运行时错误 代码甚至可以生成 .
- 我 找出需要解决的问题。这最终是一个代码风格和哲学的问题,但总的来说 他们是 福库 塞德 引起真正错误的缺陷种类 .
新支票
有了这些g OAL公司 考虑到这一点,我们实施了以下检查 在里面 预览2。
算术溢出
这张支票是f inds案例 用32位类型对算法求值,然后 分配给更广泛的类型。分配给更宽的类型很好地表明开发人员希望表达式值超出32位类型的范围 . 我 N+ C++的表达式 将 评估为32位 , 可能会溢出来, 和 然后 为分配而加宽。
分配给浮点的整数除法
这个 检查发现有 整数除法 是 分配给 浮点 类型。分配给 浮点 类型是一个很好的指示,表明开发人员希望得到结果的小数部分 . 我 n+C++,整数除法将 评价的, 小数部分将在 结果是 分配 预计起飞时间 到 浮点 类型。
逻辑/位不匹配
这项检查发现 逻辑运算符 已使用 带整数 价值观 或使用位运算符 布尔值。C++允许这种转换是因为隐式转换,但实践是 容易出错并损害代码的可读性。
赋值/相等不匹配
在条件表达式中使用赋值运算符在语法上是正确的,但是 可能是 逻辑错误。此检查查找正在分配变量的情况 从 条件中的常数 . 这个 几乎总是不正确的,因为它强制条件始终为真或假。
意外复制
这个 auto
关键字在C++中是一个很大的特性,特别是在与模板代码交互时。它有一个微妙的行为,可能会混淆或容易忽视的所有技能水平的C++开发人员。 auto
不推断引用,因此在从返回引用的表达式赋值声明变量的情况下,会生成一个副本。这不是 总是 一个bug,但我们想帮助开发人员意识到正在制作一个拷贝,而这可能是不需要的。
未初始化的本地
默认情况下,C++中的原始变量不会初始化为任何值。这可能导致运行时的不确定性行为。此检查的当前实现非常激进,将在没有初始值设定项的任何声明上发出警告。
马上就来
新的绒布还在使用中 正在进行的工作 ,但我们 是 很高兴能出货 一 预发布 开发商 c 一 试行 . 下面是一些即将推出的功能 未来版本。
- 配置 : 当前该功能已启用或禁用。当前版本中没有启用/禁用或更改单个检查的严重性的方法。
- 压制 : 许多代码分析工具 可以 按实例抑制警告。这通常是在源代码中完成的 一 注释 (例如#pragma或代码注释) . 过梁当前不支持抑制。
- 与集成 其他代码 分析工具 : t型 他 linter检查只在IDE中运行 所以 当前不能用作 CI或构建的一部分。 基于编译器的工具(MSVC和clangtidy) )应该 继续使用。当背景代码分析 如果启用了sis,您可能会得到绿色的波形 来自MSVC或Clang Tidy 那个 与过梁重叠 结果在编辑器中。
我们一直在努力制作一个编辑器,帮助开发人员“左移”,并在开发循环的早期发现bug。我们希望你发现C++的新的智能代码代码是有用的。请试一试,让我们知道你的想法。 我们可以通过下面的评论,电子邮件( visualcpp@microsoft.com ),和Twitter( @视觉 ). 最好的方法是通过 开发者社区 . 快乐的编码!