在C#中产生分段错误的规范方法是什么?

时间:2010-09-22 03:32:04

标签: c# segmentation-fault

我感兴趣的是最短,最新的C#代码可以可靠地产生段错误 - 理想情况下不会直接调用任何非托管代码。

4 个答案:

答案 0 :(得分:7)

你所追求的目标有点不清楚,但我认为这与迄今为止的任何答案都一样好,而且它只是你能得到的最小值。

System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);

答案 1 :(得分:1)

迈克尔的回答并不适合我,也许这个案子现在被抓住了。 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();
    }

答案 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。