1

看看下面的代码:

static void Main(string[] args)
{
    string s = null;
    string[] myArray = new string[1];

    { } // do something evil here

    if (s.GetType() == typeof(int))
    {
        Console.WriteLine("This should not happen!"); 
    }
    Console.ReadLine();
}

有什么办法可以This should not happen写吗?有人会假设不是。但是,可以使用调试器来完成:在行中放置断点{ } // do something evil here并在立即窗口中执行以下命令,然后再继续:

((object[])myArray)[0] = 99;
s = myArray[0];

继续执行This should not happen并将被打印。使用 Visual Studio 2008 测试;这是一个屏幕截图:

截屏

这种诡计是否只有调试器才有可能,还是有某种方法可以在代码中进行这种“不安全的分配”?

(显然,我只是出于对科学的好奇。这个问题和相关评论让我问了这个问题。)

4

1 回答 1

2

一种技术是LayoutKind.Explicit用来实现一个联合,该联合可用于将任意对象重新解释为字符串。先把一个int框起来,然后赋值给objectunion的字段,然后读出string字段。

[StructLayout(LayoutKind.Explicit)]
public struct Evil
{
    [FieldOffset(0)]
    public string s;

    [FieldOffset(0)]
    public object o;
}

string ReinterpretCastToString(object o)
{
    Evil evil=new Evil();
    evil.o=o;
    return evil.s;
}

void Main()
{
    string s = ReinterpretCastToString(1);

    if (s.GetType() == typeof(int))
    {
        Console.WriteLine("This should not happen!"); 
    }
}

这很可能是可能随时停止工作的未定义行为。显然你不应该在真正的程序中使用它。

于 2013-07-14T20:52:22.277 回答