在C#中产生分段错误的规范方法是什么?
我对最短的,最新的C#代码感兴趣,它可以可靠地产生段错误 – 理想情况下不需要直接调用任何非托管代码。
你所追求的有点不清楚,但我认为这与迄今为止的任何答案一样好,而且它只是你能得到的最小。
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
迈克尔的回答对我不起作用,也许这个案子现在被抓住了。 Marshal.ReadInt32()只给我一个“SystemError:试图读取或写入受保护的内存”。 在Windows上使用.NET 4.5获取各种传递的值。 我使用以下内容但是在Windows和单声道4.0.4.1下我的哪些段错误:
using System.Runtime.InteropServices; [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void UNMANAGED_CALLBACK(); public void Crash() { var crash = (UNMANAGED_CALLBACK)Marshal.GetDelegateForFunctionPointer((IntPtr) 123, typeof(UNMANAGED_CALLBACK)); crash(); }
使用/unsafe
选项使用csc
进行编译:
class Program { static void Main(string[] args) { unsafe { int *p = null; *p = 5; } } }
正如上面的评论所指出的那样,在Windows中没有像segfault这样的东西,你在Linux上也没有说过mono。 所以我假设你实际上意味着访问违规。
这是获得一个方法:
unsafe { int* a = (int*) -4; *a = 0; }
(必须使用/unsafe
选项进行编译。)
我的第一次尝试使用0作为地址,但结果是抛出一个普通的旧NullReferenceException,你可以得到没有不安全的代码。 但负面地址在我的Vista x64盒子上获得AccessViolationException。