VS2015中C/C++代码分析

[原文发表地址]:C/C++Code analysis in VS2015

[原文发表时间]:2015/2/24 1:00 PM

来自 Joe Morris & Jim Springfield (MSFT)

本篇博客给出以下2个问题的答案。

  • VS2015中C/C++代码分析有什么新功能?
  • VS2015CTP6 版本的C/C++代码分析中支持和不支持的功能是什么?

在我们开始之前,让我们在本页中提出一些术语。

代码分析: C/C++代码分析即为/analyze。它有时被称为“静态代码分析”或简称“代码分析”。它们都是同样的意义。

前端和后端编译器: 微软的C/C++编译器由两部分组成(一个前端和一个后端)。前端读取源代码、词、语法,做语义分析并发出中间语言。后端读取中间语言并执行代码生成和优化。在这篇文章的其余部分涉及代码分析中的“编译器”术语仅指前端。

现在专业术语已经不会造成障碍,让我们深入探讨在VS2015 的C/C++代码分析中的改变。

什么是VS2015的C/C++代码分析中的新部分?

让我们从没有改变的部分开始。

  • 代码分析在Visual Studio的所有版本中同VS2013中一样仍旧是可用的。
  • 在VS2013和VS2015之间没有添加额外的检查器

改变了两个重点项目:

  • 前端更新: 我们在后台执行代码分析。这是一个管道的改变,并且不会影响用户的工作流程。
  • 统一的错误集中器: 我们向用户呈现代码分析出问题的窗口。不再另外附加分离的代码分析窗口,而是替换为一个由编译、生成、链接所共享的统一的错误集中器。

前端更新

这更多的是一个管道的改变,并且不会影响用户的工作流程。但是如果您想知道我们为什么做管道改变,请继续阅读。

我们本机的代码分析工具使用一些相同的代码作为编译器。事实上,它创建于相同的资源树,即便它有成千上万的#if,预处理程序块会完成它。代码分析工具通过捕捉碎片与常规编译器解析为整个函数创建一个抽象的语法树(AST)。当然,这种捕获的AST与编译器真正使用的其数据结构具有实质性的不同,通常会导致不一致性。

此外,由于添加新的语言功能,大多数需要被执行两次:一次针对编译器,另一次针对代码分析。这会导致2个不同的代码路径和二进制文件(c1xx.dll和c1xxast.dll),一个用于代码生成和代码分析。

这是我们的一大难点,一年多之前我们开始的一个项目对编译器代码库进行了重大改革。我们期望针对AST以及代码生成和代码分析能够拥有统一的代码路径。因此,我们除掉了c1xxast.dll。

通过这个管道改变,后台的/analyze现在工作如下…当/analyze传递给编译器时,我们使用相同的用于正常编译的DLL(c1.dll和c1xx.dll),同时我们将建立相同的内部数据结构。在/analyze下有一些我们保留时间较长的附加信息,但现在的总体结构是相同的。以前,我们将发出IL(中间语言)供编辑器后端解析函数体,但现在我们将在发出IL之前在内部捕获整个函数体。

这会允许我们使用相同的树进行分析,代码生成以及执行新编译器的功能,例如返回推导类型和“常量表达式”,这需要检查整个功能以及评估编译时间的能力。综合这些,我们期望我们的代码分析能力能够变得更好。

统一的错误集中器

在VS2013中,代码分析窗口是从错误列表窗口中分离出的一个单独的窗口。未分析的相关错误/警告直接进入错误列表窗口,已分析的错误/警告直接进入代码分析窗口。

关于VS2015,我们正在摒弃代码分析窗口,现在所有代码分析的错误/警告如下面的截图所示,将直接进入错误列表窗口。

我们确定所有功能块的功能均存在于代码分析窗口中,并且在新的错误列表窗口中可获得,即以下:

  • 问题的排序
  • 问题的分类
  • 问题的详细信息
  • 问题抑制方法
  • 问题的拷贝并将其黏贴至电子邮件

这里总结了我们对VS2015中代码分析的2个重大改变。当然,您在使用CTP6的时候请注意,我们并没有完成有关前端更新的全部工作。

什么是VS2015CTP6 版本的C/C++代码分析中支持的部分?

到目前为止,/analyze在VS2015 CTP版本的C/C++代码分析中是不可用的。在CTP6中,我们对C代码启用了/analyze。

在CTP6中支持的部分:

  • C分析和大多数代码分析检查

什么是VS2015CTP6 版本的C/C++代码分析中不支持的部分?

针对C++代码的分析仍旧是不可用的,并且我们在努力使它在未来的版本中可以使用。

在CTP6中不支持的部分:

  • C++代码分析
  • C/C++并发性检查
  • 使用WDK工具进行附加驱动程序检查

我们功能的组员专注于尽可能快地完成不支持的设计功能。敬请期待!

PS:本篇博客未涉及任何关于托管代码分析的内容。如果您想要了解托管代码分析,请参阅如下所示的讲座或博客。

托管代码分析的讲座 /博客