MSVC 和 Visual Studio 代码诊断的未来
我们正在努力改进 MSVC 和 Visual Studio 中的诊断体验。 我们从 Visual Studio 2022 版本 17.3 开始这项工作,虽然还没有开发完成,但我们想在这里分享早期的进展。
>> 请移步topomel查看图片 <<
动机与原则
新的 C++ 特性(如 Concept 和 Range)为更具表达力的代码和定义更好的 API 提供了机会。 然而,为了充分利用它们,集成开发环境需要对代码进行更好的诊断,以便查明和解决代码约束问题。
正如开发者社区中的许多人所指出的那样,我们知道,在代码诊断这个领域,我们还有很大的改进空间,我们现在正在积极投资这一领域。
我们的开发倡导者 Sy Brand 向 WG21 提交了一篇论文,其中讨论了编译器诊断的关键原则,以及如何改进 C++ 编译器的最新技术。 我们使用本文档作为我们工作设计的指导。
作为第一步,我们正在研究编译器,以确保它收集所有可用信息,并能以一种工具友好的方式输出,以便日后使用。 我们还在 Visual Studio 中添加了新的诊断可视化功能,以便更轻松地导航和理解大的代码错误。
编译器的变化
1. 模板实例化上下文的最后一条消息现在显示发生错误的文本列。
2. 编译器现在列出函数调用的所有候选并解释每个候选失败的原因。
3. 未满足的关联约束的错误消息将扩展为详细说明未满足哪些基础约束。
源代码
>> 请移步topomel查看图片 <<
17.2 中的编译器输出
>> 请移步topomel查看图片 <<
17.4 中的编译器输出
>> 请移步topomel查看图片 <<
IDE 的变化
17.4 中的 IDE 体验(内置查看器)
>> 请移步topomel查看图片 <<
17.4 中的 IDE 体验(SARIF 查看器扩展)
>> 请移步topomel查看图片 <<
编译器更改通常会生成更多文本,并且有时会使理解它们变得更加困难。 我们正在尝试使用新的编译器选项将诊断结果输出到静态分析结果交换格式 (SARIF)。 输出将由 Visual Studio 加载以可视化消息的层次结构,以便于导航。
目前,单击 Visual Studio 错误列表中与 SARIF 输出相关的错误将弹出一个带有可折叠诊断信息的弹出窗口。 我们还在开发 SARIF 查看器扩展,以提供更丰富的体验。
技术细节
以下是编译器现在关注的三个领域。
一般基础设施(源代码位置)
错误消息中的列信息是在 Visual Studio 2017 中添加的。但是,它有时会丢失或不正确。
> 缺少列信息通常是因为编译器并不总是在函数之间传播列信息。
> 有时会产生不正确的列信息,因为编译器没有在嵌套上下文中维护必要的信息(例如,实例化模板特化)并且其值被错误地修改。
我们将继续审核操纵源位置的 API,以确保它们传播和维护列信息。
仍然存在列信息不正确的情况(这在编译器生成的函数中很常见),所以如果你遇到这些情况,请告诉我们!
重载解析
重载解析的错误消息取决于函数是全局函数还是成员函数,是否是运算符,并且对可用候选者的数量敏感。 这会导致不一致,例如:
> 编译器通常只列出它尝试过的最后一个候选者。
> 编译器有时会列出所有候选者,但没有解释每个候选者失败的原因。
> 编译器经常忽略模板候选。
我们现在调整这些场景中的行为以更加一致:我们总是列出包括模板在内的所有候选者,并解释每个候选者失败的原因。
Concept(未满足的关联约束)
以前,编译器仅针对未满足的关联约束发出一条通用消息。
现在,编译器将发出导致给定失败的所有相关约束。 其中一些会有解释,而另一些则不会。
我们仍在研究后者,因为我们的大多数语义分析逻辑还没有将原因传播回调用者——约束验证逻辑只知道某些事情失败了。
总结
有了更加丰富的错误信息,妈妈再也不用担心我编写模板代码了。
从此,天书变成了儿童读物。
最后
Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《The Future of C++ Compiler Diagnostics in MSVC and Visual Studio》
相关文章
- Visual Studio 2015 添加类、添加现有项失败
- 如何利用 Visual Studio 自定义项目或工程模板(转载)
- Visual Studio VS如何统计代码行数
- C# .NET Visual Studio VS2008如何显示行号
- Visual Studio VS2010 如何修改默认的编辑语言
- [E2E] Visual Differing Tests with Puppeteer and PixelMatch
- macos安装android studio(Android Studio 2021.1.1)
- How To Compile Qt 4.7 with Visual Studio 2010
- Visual Studio 统计代码行数
- 使用Visual Studio宏来自动生成代码 [ Visual Studio | 宏 | 自动生成代码 ]
- 让Visual Studio 也支持JS代码折叠 —— 续 [ Visual Studio | Js | ScriptOutline | SmallOutline ]
- Visual Studio 未能解析主引用 该框架版本高于当前目标框架
- Visual Studio 2008项目中WinForm窗体图标显示为类图标,只能打开代码而无法打开视图问题解决
- Visual Studio 2010生成SQL Server测试数据
- 63. 如何使用 Visual Studio Code 查看和浏览 ABAP 代码
- Visual Studio Code UI5 Language Assistant 扩展介绍
- Visual Studio调试服务端程序:w3wp进程消失 解决办法
- Visual Studio 未能解析主引用 该框架版本高于当前目标框架
- Visual Studio 2010生成SQL Server测试数据
- 吐槽Visual Studio 2010
- Visual Studio 2008项目中WinForm窗体图标显示为类图标,只能打开代码而无法打开视图问题解决
- Visual Studio Code 保存代码时报Applying code action Organize Imports
- Paper:《NÜWA: Visual Synthesis Pre-training for Neural visUal World creAtion,女娲:用于神经视觉世界创造的视觉》翻译与解读
- DL之IDE:深度学习环境安装之Visual Studio 2015版本+CUDA8.0+Cudnn8.0+OpenCV 3.1.0版本完美搭配安装图文教程之详细攻略
- 【错误记录】Visual Studio 中配置 NDK 头文件路径
- 在 VS14 上安装 Visual F# Power Tools
- 使用 Visual Studio Code (VSCODE)写 C51 (持续更新 2018-04-09)
- Visual Studio中的C++更新及WSL2
- 试试Visual Studio中新的远程文件查看器
- Visual Studio对CMake工程ARM64的支持
- Visual Studio C++模块快速入门
- 关于Visual Studio 2019使用sprintf函数编译问题