我感兴趣的是最短,最新的C#代码可以可靠地产生段错误 - 理想情况下不会直接调用任何非托管代码。
答案 0 :(得分:7)
你所追求的目标有点不清楚,但我认为这与迄今为止的任何答案都一样好,而且它只是你能得到的最小值。
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
答案 1 :(得分: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();
}
答案 2 :(得分:0)
使用csc
选项与/unsafe
进行编译:
class Program
{
static void Main(string[] args)
{
unsafe
{
int *p = null;
*p = 5;
}
}
}
答案 3 :(得分:0)
正如上面的评论所指出的那样,在Windows中没有像segfault这样的东西,你在Linux上也没有说过mono。所以我假设你实际上意味着访问违规。
这是获得一个方法:
unsafe {
int* a = (int*) -4;
*a = 0;
}
(必须使用/unsafe
选项进行编译。)
我的第一次尝试使用0作为地址,但结果抛出一个普通的旧NullReferenceException,你可以得到没有不安全的代码。但负面地址在我的Vista x64盒子上获得了AccessViolationException。