官宣IntelliSense Code Linter for C++
在Visual Studio 2019 v16.6 Preview 2中,我们高兴的宣布一项针对C++开发者的新功能:IntelliSense Code Linter for C++。这项新功能旨在帮助C++开发者在编写代码的时候能快速定位和修正可能存在的代码缺陷。它会在你编写代码的时候,在编辑器中以下划线的方式,实时地的显示代码中存在的问题并给出建议的修改措施。
有图有真相
这项新功能构建在Visual Studio现有的C++ IntelliSense基础之上。
这意味着,代码扫描将比之前的后台代码分析更快,从而更早地给出分析结果。
为了确保IntelliSense组件以尽可能快的速度运行,旧版的linter组件主要关注在那些很容易被发现的问题上。
新版本的linter将作为现有代码分析工具(例如MSVC的后台代码分析或者Clang-Tidy)的一个重要补充,同时可以对复杂的代码场景进行分析处理。
你可以在Visual Studio的[工具-选项]菜单中打开这个预览版功能,如下图所示:
设计目标
当我们考虑要怎么做才能实现出一个比较好的代码分析工具时,我们将如下的几个目标作为Linter的设计目标。
1) 我们希望Linter能尽可能地找出那些让C++开发者感到意外的代码缺陷,尤其是来自其他语言的开发者。通过这样的代码检查,可以使某些C++语言功能的学习曲线变得平滑。
2) 这个工具应该可以提供针对具体问题的建议。就像IntelliSense可以侦测出可能会导致构建失败的语法错误一样,Linter应该可以帮助您在代码构建之前就识别并修复逻辑和运行时错误。
3) Linter应该能找出那些可以被解决的问题。虽然最终这只是代码风格和哲学问题,但总的来说,它们只关注导致实际Bug的代码缺陷。
我们根据上面提到的三个设计目标,我们在Preview 2版本中实现了以下的几个代码检查。
Arithmetic Overflow
此代码检查将查找:使用32位数据类型进行算术运算,然后赋值给更宽的类型的情况。将一个32位的变量分配给更宽的类型,可以很好地表明开发者认为变量的值可能超出32位类型的范围。在C++中,表达式将被认为32位的,这可能会算术溢出,然后将溢出后的值赋值给更宽的类型变量。
Integer Division Assigned to Floating Point
此代码检查将查找:将整数除法的结果赋值给一个浮点数的情况。将一个表达式赋值给一个浮点类型,可以很好地表明开发者想要结果的小数部分。在C++中,会先对整数除法求值,并且在将结果分配给浮点类型之前,舍弃小数部分。
Logical/Bitwise Mismatch
此代码检查将查找:将逻辑运算符与整数值一起使用或将按位运算符与布尔值一起使用的情况。在C ++中,由于存在隐式转换而允许这样做,但是这种做法容易出错,并且会降低代码的可读性。
Assignment/Equality Mismatch
在条件表达式中使用赋值运算符在语法上是正确的,但在逻辑上可能是错误。此代码检查将会查找在条件语句中将一个常量分配给变量的情况。这几乎总是不正确的,因为它会导致条件语句始终为true或false。
Accidental Copy
C++中的auto关键字是一个很棒的功能,尤其是在和模板代码打交道时。这个关键字有一种很微妙的行为,会让一些C++开发者混淆或轻易忽略。auto不会推断出引用,因此,如果将返回引用的表达式赋值给了一个声明的变量,则会导致变量复制。虽然这并不总是一个错误,但是我们想帮助开发人员意识到当前语句会导致复制,尽管有时可能这是并不是开发者想要的。
Uninitialized Local
默认情况下,C++中的内置类型变量没有是不会被初始化的。这可能导致运行时不确定的行为。这项代码检查的实现是非常激进的,它会在没有变量已声明但是没有初始化的情况下发出警告。
接下来
新的Linter仍在开发中,下面列出了一些将来版本中会出现的新功能。
1) 配置:当前这个功能只能被整体的启用或禁用。目前还不能支持启用/禁用或更改某个检查的严重级别。
2) 禁用某些警告:许多代码分析工具可以按实例里禁用警告。这通常是通过在源代码中使用注释(例如使用#pragma或代码注释)来实现,但是当前Linter还不支持这种功能。
3) 与其他代码分析工具集成:Linter检查目前只能在IDE中运行,因此它不能作为持续集成流程中的一部分。如果有这种集成需求,则需要继续使用基于编译器的代码分析工具(例如,MSVC和Clang-Tidy)。
当启用[后台代码分析]后,您可能会从MSVC或Clang-Tidy的代码分析中看到绿色的波浪提示,这将导致它与编辑器中的Linter检查出现重叠,进而你会看到重复的检查结果。
总结
有段时间,我还认真地研究过一个C++的Linter插件。
那个时候,需要手动在Visual Studio中进行配置才能使用。
后来怎么着了:写代码的时间都不够了,哪有什么功夫对代码进行分析呐。
生活真是不易啊!