为啥此代码会使 Visual Studio 2015 崩溃?

Posted

技术标签:

【中文标题】为啥此代码会使 Visual Studio 2015 崩溃?【英文标题】:Why does this code crash Visual Studio 2015?为什么此代码会使 Visual Studio 2015 崩溃? 【发布时间】:2019-01-14 21:21:48 【问题描述】:

出于某种原因,即使在 Visual Studio 中将其键入 C# 文件也足以导致它立即崩溃。为什么?

unsafe struct node 
    node*[] child;

当 IDE 开始对关键字等进行着色时似乎会发生这种情况。

在 TIO 中尝试它会吐出 csc.exe exited with code 1 这不是很有帮助。

虽然 C# 中的数组声明与 C/C++ 中的不同,但上面的似乎应该是完全有效的。为什么不是,为什么它会导致 Visual Studio 崩溃?

我的 Visual Studio 版本是 14.0.23107。

【问题讨论】:

VS 2012 产生编译错误:Cannot take the address of, get the size of, or declare a pointer to a managed type VS2017 瞬间,立即关闭 同上 LINQPad。 ***Exception。 我发现了一个存在的错误:github.com/dotnet/roslyn/issues/24978 FWIW 您的代码无效,因为您不能将指针指向包含 C# 中托管对象的结构。数组是托管对象。因此,即使 VS 没有崩溃,该代码也不会编译。 【参考方案1】:

这是known bug in Roslyn。此错误将影响任何使用 Roslyn 的 Visual Studio 版本。

如果我正确解释了VersionOf.net,那么第一个内置 Roslyn 的 Visual Studio 版本是 2015 年。在此之前,我认为它只能作为扩展使用。因此,Visual Studio 2013 及之前的版本应该不受影响。

它将在milestone 16 release 中修复。目前,该版本尚未安排。

因为这是 Roslyn 中的一个错误,您可以通过在早于 Roslyn 的旧版 Visual Studio 中编辑和编译包含 unsafe struct 的代码来“绕过”它。 Visual Studio 2012 应该可以工作。然后,您可以在当前软件中使用生成的 .DLL。

如果您从 this branch 自己构建 Roslyn,则可以使用未经验证的修复。修复是在this commit 中进行的。

【讨论】:

据此,您有资格获得第 3 步或第 4 步:meta.stackexchange.com/a/132704/382678,介于出色和传奇之间。 正确回答这个问题的好方法:这个问题可能是当今 10k 工具中最好的问题。所以来了 20k ;) @Jean-FrançoisFabre 什么是“当今 10k 工具最佳问题”? ***.com/tools。这个问题确实是#1。看来我是对的:) LarsTechLucas Trzesniewski 的 cmets(问题,不是这里)可以明显看出,目前的代码是无效的,因为如果结构包含引用类型,则您不能采用指向该结构的指针,数组是引用类型。 因此,关于使用旧编译器编译和移植 DLL 的部分答案可能无关紧要。 除非有人知道受此错误影响但实际上会使用 Visual Studio 2012(或其他非 Roslyn 编译器)?顺便说一句,我认为 Mono 编译器还有其他问题(允许过多使用指针)。

以上是关于为啥此代码会使 Visual Studio 2015 崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Roslyn 在尝试重写此 lambda 时会崩溃? (Visual Studio 2015 更新 1)

译如何在 Visual Studio 中调试异步代码

为啥 MPI 在 Visual Studio 2015 中不起作用?

Visual Studio 2012 上的计算机错误中缺少 GDAL201.dll

为啥Visual Studio这么垃圾?

错误记录安装 Visual Studio 2013 中文语言包报错 ( 需要 Microsoft Visual Studio Test Agent , 但此计算机上并为安装它 )