作者:乔·莫里斯和吉姆·斯普林菲尔德(MSFT)
这个博客提供了以下两个问题的答案。
- VS2015中C/C++代码分析有什么新进展?
- VS2015 CTP6发布中C/C++代码分析中支持和不支持的是什么?
在我们开始之前,让我们在一些术语上保持一致。
代码分析 C/C++代码分析也被称为分析。它有时被称为“静态代码分析”或简称为“代码分析”。他们的意思都一样。
前端和后端编译器 微软的C/C++编译器由两部分组成(前端和后端)。 前端读取源代码、词法分析、语法分析、语义分析并发出IL。 后端读取IL并执行代码生成和优化。 在本文的其余部分中,当提到代码分析时,术语“编译器”的使用只涉及前端。
现在术语已经过时了,让我们深入了解一下VS2015的代码分析中发生了什么变化。
VS2015中C/C++代码分析有什么新进展?
让我们从没有改变的开始。
- 代码分析在所有版本的VisualStudio中仍然可用,就像在VS2013中一样。
- 在VS2013和VS2015之间没有添加额外的跳棋。
改变的是两个关键项目:
• 前端恢复 :我们在幕后进行代码分析的方式。这是一个管道变化,对用户的工作流程没有影响。 • 统一错误中心 :窗口,向用户显示代码分析问题。不再有单独的代码分析窗口,而是一个统一的错误中心,由编译、构建、链接等其他提供者共享。
前端恢复
这更多的是一个管道的变化,对用户的工作流程没有影响。但如果你想了解为什么我们要改变管道,请继续阅读。
我们的原生代码分析工具确实使用了一些与编译器相同的代码。 事实上,它是由同一个源代码树构建的,尽管有成千上万个if预处理器块来完成这一任务。 代码分析工具通过在常规编译器进行解析时捕获片段,为整个函数构建抽象语法树(abstractsyntax tree,AST)。然而,这种捕获的AST与实际编译器用于其数据结构的AST有本质的不同,后者常常导致不一致。
另外,随着新语言特性的增加,大多数特性必须实现两次:一次用于编译器,另一次用于代码分析。这产生了两个不同的代码路径和二进制文件(c1xx.dll和c1xxst.dll),一个用于代码生成和代码分析。
这对我们来说是一个主要的痛点,一年多前我们开始了一个项目,最终对我们的编译器代码库进行了一次大的修改。我们希望ASTs有一个用于代码生成和代码分析的代码路径。所以,我们去掉了c1xxast.dll。
有了这个改变,/analyze在封面下的工作方式如下…当/analyze被传递到编译器时,我们使用与正常编译相同的DLL(c1.DLL或c1xx.DLL),并构建相同的内部数据结构。 有一些额外的信息,我们保留了更长的时间下/分析,但整体结构现在是相同的。 以前,在解析函数体时,我们会开始为编译器后端发出IL(中间语言),但现在在发出IL之前,我们会在内部捕获整个函数体。
这允许我们使用同一棵树进行分析、代码生成,并实现新的编译器特性,如返回类型推断和“constexpr”,这需要能够在编译时检查整个函数并对其求值。 通过这种统一,我们期望我们的代码分析能力会变得更好。
统一错误中心
在VS2013中,代码分析窗口是与错误列表窗口分开的窗口。非分析相关的错误/警告被定向到错误列表窗口,分析错误/警告被定向到代码分析窗口。
使用VS2015,我们摆脱了代码分析窗口,现在将所有代码分析错误/警告导入错误列表,如下面的屏幕截图所示。
我们确保代码分析窗口中存在的所有特性功能在新的错误列表窗口中也可用,即以下…
- 问题的分类
- 问题的分类
- 发行详情
- 抑制发行
- 问题副本并粘贴到电子邮件中
这总结了我们在VS2015中对代码分析所做的两个关键更改。但是,当您使用CTP6时,请注意,我们尚未完全完成前端恢复所涉及的工作。
VS2015 CTP6发布中C/C++代码分析中支持什么? 到现在为止,分析被禁用在VS2015 CTP的C和C++代码分析。在CTP6发行版中,我们已经为C代码启用了/analyze。
CTP6支持:
- C分析和大多数代码分析检查
在VS2015 CTP6发布中C++代码分析中不支持什么? C++代码的分析仍然是禁用的,我们正在努力使它在即将发布的版本中。
CTP6不支持:
- C++代码分析
- C和C++并发检查
- 使用WDK工具的附加驱动程序检查
我们的功能团队致力于尽快完成不支持的功能。敬请期待!
PS:这个博客没有涉及任何关于托管代码分析的内容。如果你想知道,这是什么交易,请参阅下面列出的会谈和博客。
托管代码分析讲座/博客
- 使用实时代码分析器提高代码质量– https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/714
- 使用Roslyn为您的API编写实时代码分析器– https://msdn.microsoft.com/en-us/magazine/dn879356.aspx