VS2022:结构化诊断

news2024/11/24 20:03:12

对于许多 C++ 开发人员来说,如果编译器爆出了大量的编译错误,且错误之间还没有明显的关联,这可就不好玩了。
如果开发环境可以提供更容易理解的错误提示和诊断体验,则开发人员就更加容易的找到错误原因并修复它。

我曾经写了一篇文章 “Concepts Error Messages for Humans”,里面探索了一些新的编译错误呈现的新思路,现在,感谢许多在 Visual Studio 上工作的人的辛勤工作,我们有更好的体验与大家分享。

在 VS2022 v17.8 预览版3 中,如果你使用 MSVC 构建一个 MSBuild 工程,在错误列表中将会显示更加丰富的关于此错误条目的信息。

>> 请移步至 www.topomel.com 以查看图片 <<

点击按钮,一个新的窗口将会显示出来。在默认情况下,它会显示在错误列表相同的位置,但如果你拖动它,则 VS 会记住它最后的显示位置。

>> 请移步至 www.topomel.com 以查看图片 <<

新的窗口我们叫做 问题详情 窗口,该窗口可以提供有关给定问题发生原因的详细结构化信息。如果我们看这些信息,我们可能会想,好吧,为什么 pet(dot) 无法被调用?如果单击它旁边的箭头,你就可以看到原因。

>> 请移步至 www.topomel.com 以查看图片 <<

以类似的方式,我们可以展开其他箭头以查找有关错误的更多信息。此示例由使用 C++20 Concepts 的代码生成,问题详情窗口提供了一种了解错误详细信息的方法。

>> 请移步至 www.topomel.com 以查看图片 <<

对于那些想要使用这个例子代码的用户,生成这些错误所需的代码是:

>> 请移步至 www.topomel.com 以查看图片 <<

记得,请使用 /std:c++20 编译开关进行编译。

输出窗口

作为这项工作的一部分,我们还使输出窗口可视化输出诊断中的任何层次结构。例如,在通过构建上一个示例生成的摘录中:

>> 请移步至 www.topomel.com 以查看图片 <<


这项功能使扫描大型诊断信息集变得更加容易,而不会丢失。

代码分析

问题详情窗口现在还用于具有关联事件的代码分析警告。例如,考虑以下代码,它可能会导致一个 use-after-move 错误。

>> 请移步至 www.topomel.com 以查看图片 <<

如果 should_eat 为真,should_reset 为假,则 my_string 将在移动后使用,这可能会导致不良行为。

幸运的是,我们的静态分析器捕获了此问题,在错误列表中创建了一个条目:

>> 请移步至 www.topomel.com 以查看图片 <<

看到 详细信息 列中的该图标了吗?这意味着有额外的信息。一起来看看:

>> 请移步至 www.topomel.com 以查看图片 <<

这告诉我们静态分析器遵循的过程,得出了可以在此程序中使用移自对象的结论。对于像这样的小函数,我们可能自己解决这个问题,但对于更大或更复杂的函数,Key Events 可以帮助你理解为什么你的代码会收到警告。

如何配置

默认情况下,当你双击或按回车键时,问题详情窗口也将打开,该条目具有关联的详细信息。这可以在文本编辑器> C/C++ > 高级>错误列表>>双击显示问题详细信息的工具>选项中进行配置。

>> 请移步至 www.topomel.com 以查看图片 <<

可以在“项目”>“属性”>“高级”>“启用 MSVC 结构化输出”中启用或禁用整个功能。你可以通过创建一个 Directory.Build.props 文件来影响多个项目,该文件将 UseStructuredOutput 属性定义为 true 或 false。

>> 请移步至 www.topomel.com 以查看图片 <<

工作原理

这项工作利用了SARIF(静态分析结果交换格式)标准。这是一种基于 JSON 的格式,用于以结构化方式表示诊断,使编译器能够在向 IDE 发送信息时保留许多诊断中固有的层次结构。
访问这些数据不需要其他编译器标志,但如果希望编译器在 SARIF 中生成诊断以便将结果与外部工具一起使用,则可以将 /experimental:log 标志传递给 MSVC。

总结

当编译我的小代码时,显然用不上这类”大炮”类工具,但是如果你正在开发举世瞩目的”大玩意儿”,则丰富的,更加有意义的错误信息,将会是你的福音。

最后

Microsoft Visual C++团队的博客是我非常喜欢的博客之一,里面有很多关于Visual C++的知识和最新开发进展。大浪淘沙,如果你对Visual C++这门古老的技术还是那么感兴趣,则可以经常去他们那(或者我这)逛逛。
本文来自:《Structured Diagnostics in the New Problem Details Window》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考-中级】系统集成项目管理工程师-风险管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2020 下 试题三(20分) 2020 下 试题三(20分) 2018 年底&#xff0c;某公司承接了大型企业数据中心的运行维护服务项目&#xff0c;任命经验丰富的王伟为项目经理。 2019 年1月初项目启动会后&#xff0c;王伟根据经验编制了风险管…

超声波清洗机需要注意什么?不能错过的超声波清洗机

超声波清洗机在当今社会已经越来越受到人们的欢迎&#xff0c;它利用超声波的振动来清洁物品表面&#xff0c;能够快速、高效地清除污垢、油脂等。但是&#xff0c;在购买超声波清洗机时&#xff0c;需要注意哪些问题呢&#xff1f;本文将为您介绍购买超声波清洗机需要注意的几…

2015款奔驰B200车发动机故障灯异常点亮

杭州捷盛行汽车服务有限公司 乐翔 乐翔&#xff0c;现任杭州市捷盛行汽车服务有限公司技术经理、开思杭州地区技术顾问及博世车联技术支持&#xff1b;2015年获保时捷全球认证技师资质&#xff1b;2016年取得汽车维修高级技师资格证书。 故障现象 一辆2015款奔驰B200车&#x…

python批量将多年降水的nc数据处理为季节性平均降水量或年降水量

本代码目的: 1.批量读取nc降水数据集。 2.按照季节平均来粗略绘制降水量图。 3.保存所有处理后的数据集,以备下次精细化绘图。 原始数据请见美国2013-2021年每日降水的nc数据集资源-CSDN文库 ##1.导入需要的库和函数 import xarray as xr import os from netCDF4 impo…

Oracle基础学习

文章目录 1. oracle数据库安装2. sqlplus连接数据库方式3. 创建用户信息4. 基本概念5. 基本SQL语句6. Springboot开发 1. oracle数据库安装 安装教程 安装包地址 2. sqlplus连接数据库方式 无用户信息登录 使用用户信息登录 登录最高权限管理员&#xff0c;如果不加上as …

如何利用PHP快速抓取音频数据?

以下是一个使用Dusk库和PHP编写的爬虫程序&#xff0c;用于爬取海量的音频数据。这个程序使用了https://www.duoip.cn/get_proxy的代码。 <?php // 引入Dusk库 require Dusk.php;// 创建Dusk对象 $dusk new Dusk();// 设置代理 $dusk->setProxy(127.0.0.1, 8080);// 使…

《算法通关村第一关——链表青铜挑战笔记》

《算法通关村第一关——链表青铜挑战笔记》 Java如何构造出链表 概念 如何构造出链表&#xff0c;首先必须了解什么是链表&#xff01; 单向链表就像一个铁链一样&#xff0c;元素之间相互链接&#xff0c;包含多个节点&#xff0c;每个节点有一个指向后继元素的next指针。…

无纸记录仪接线方法和接线图

一、彩色无纸记录仪输入和输出信号接线 彩色无纸记录仪主要有以下几种接线方法 1、通讯线的连接: RS-485通讯线的连接 RS485通讯线请使用屏蔽双绞线&#xff0c;通讯线长度不能超过1000米。在通讯线长度大于100米的条件下进行通讯时&#xff0c;为减少反射和回波&#xff…

轻松搞定99%以上物联网应用系统快速交付:揭秘宏电三三开源物联网平台

万物互联的时代物联网技术涉及到了终端、通讯、平台、应用等多个层级&#xff0c;覆盖工业、电力、农业、商业等多领域。物联网需求是海量的、碎片化的&#xff0c;导致多元异构的物联网平台技术堆栈复杂&#xff0c;开发周期长、实现难度大。 如何低成本、高效地接入基于各类…

什么牌子的电容笔性价比高?口碑好的电容笔推荐

如今&#xff0c;随着生活的智能化程度不断提高&#xff0c;一些人已经把传统的笔记本电脑换成了平板电脑。我发现&#xff0c;用iPad平板画图&#xff0c;或者用iPad平板记笔记&#xff0c;真的很方便。根据我对电容笔的深刻理解&#xff0c;如果你只是想要用电容来记录&#…

这些并发测试知识点,你掌握了吗?

一、Apache Benchmark ab 命令会创建很多的并发访问线程&#xff0c;模拟多个访问者同时对某一 URL 进行访问&#xff0c;可用来测试 Apache 的负载压力&#xff0c;也可以测试 Web 服务器的压力。 安装 liunx 安装&#xff1a;yum install httpd Windows安装&#xff1a;下…

lvgl 页面管理器

lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存&#xff0c;界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举&#xff0c;用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…

JMeter安装及环境配置

1. JMeter 介绍 Apache组织开发的基于Java的压力测试工具 100%纯Java开发、完全的可移植性 可以用于测试静态和动态资源 多协议—HTTP/FTP/socket/Java/数据库(JDBC) 完全多线程 高可扩展性 2. 安装jdk并配置jdk环境 因为jmeter运行依赖jdk环境&#xff0c;所以在安装j…

以太网UDP数据回环实验

一、TCP/IP协议簇 前面说到TCP/IP是一个协议簇&#xff0c;其中包含有IP协议、TCP协议、UDP协议、ARP协议、DNS协议、FTP协议等。设备之间要想完成通信&#xff0c;就必须通过这些网络通信协议。 物理层的主要作用就是传输比特流&#xff08;将1、0转化为电流强弱来进行传输&am…

SpringBoot + 自定义注解 + AOP 高级玩法打造通用开关

前言 最近在工作中迁移代码的时候发现了以前自己写的一个通用开关实现&#xff0c;发现挺不错&#xff0c;特地拿出来分享给大家。 为了有良好的演示效果&#xff0c;我特地重新建了一个项目&#xff0c;把核心代码提炼出来加上了更多注释说明&#xff0c;希望xdm喜欢。 案例 …

图解Dubbo,Dubbo 服务治理详解

目录 一、介绍1、介绍 Dubbo 服务治理的基本概念和重要性2、阐述 Dubbo 服务治理的实现方式和应用场景 二、Dubbo 服务治理的原理1、Dubbo 服务治理的架构设计2、Dubbo 服务治理的注册与发现机制3、Dubbo 服务治理的负载均衡算法 三、Dubbo 服务治理的实现方式1、基于 Docker 容…

Flowable介绍及使用示例

文章目录 Flowable简介底层实现JavaSpring FrameworkMyBatisActiviti Flowable的使用示例引入依赖创建流程定义部署流程定义启动流程实例启动流程实例处理任务监控流程实例 高级用法流程监听器事件驱动定时任务其他高级功能 使用时可能遇到的问题和注意事项结论参考文献 Flowab…

微信群发消息怎么发?群发消息,只要这4个步骤!

微信是我们日常生活中使用最广泛的社交软件之一。用户通过微信可以向好友、家人、同事等联系人发送文字、图片、视频、语音、文件等信息&#xff0c;是一款非常实用的即时通信应用程序。 除了与好友进行单独聊天&#xff0c;我们有时候可能也需要将信息进行群发。但是还有很多…

又要报销了,还在手动下载整理发票吗?

大多数公司都是每个月定期提交报销&#xff0c;一般报销用的发票都是电子发票发到邮箱&#xff0c;每次要报销时都需要登录邮箱&#xff0c;点开邮件&#xff0c;一个个下载整理&#xff0c;工作量不大&#xff0c;但是发票多了也着实很烦。这个月终于下决心把这个过程自动化一…

事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?

分布式锁和事务是分布式系统中两个重要的概念&#xff0c;它们都用于解决分布式环境下的数据一致性问题。 一、概念 分布式锁 分布式锁是一种用于在分布式环境中控制对共享资源访问的锁。分布式锁可以防止多个进程或线程同时访问共享资源&#xff0c;从而避免数据冲突和资源…