Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

C# safe код не всегда safe
int0x25
#1 Оставлено : 10 ноября 2010 г. 18:33:53(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 17.09.2008(UTC)
Сообщений: 90
Баллов: 270
Откуда: Russia St.Petersburg

Было скучно на работе и мы с другом решили поиграться с указателями в c# и проверить насколько же в реальности безопасен managed код.
Вот получился довольно таки забавный пример.
Код:

[StructLayout(LayoutKind.Sequential)]
class A
{
public override string ToString()
{
return "I'am type A";
}
}

[StructLayout(LayoutKind.Sequential)]
class B
{
public override string ToString()
{
return "I'am type B";
}
}

class Foo
{
static void Main()
{
A a = new A();
B b = new B();
GCHandle h = GCHandle.Alloc(a, GCHandleType.Pinned);
GCHandle hb = GCHandle.Alloc(b, GCHandleType.Pinned);
Marshal.WriteInt32((IntPtr)((int)h.AddrOfPinnedObject() - 4), Marshal.ReadInt32((IntPtr)((int)hb.AddrOfPinnedObject() - 4)));
Console.WriteLine(a);
}
}

В итоге выводится "I'am type B" [;)]
Если кратко по коду, сначала происходит фиксация объектов в памяти, чтобы они не сдвинулись при сборке мусора и указатели на них были бы валидны. И потом меняется указатель на тип А на значение указателя на тип B;
Вот так вот без строчки unsafe кода можно изменить поведение объектов.

<i><font color="green">Anyone who has never made a mistake has never tried anything new</font id="green"></i>
<i><font color="green">Anyone who has never made a mistake has never tried anything new</font id="green"></i>
Реклама
Margarita.Lukina
#2 Оставлено : 14 ноября 2010 г. 3:26:08(UTC)
Ранг: Активный Участник

Группы: Зарегистрированные пользователи
Зарегистрирован: 10.02.2006(UTC)
Сообщений: 156
Баллов: 468
Откуда: Russia Spb

<blockquote id="quote"><font size="1" face="Verdana, Helvetica, Arial" id="quote">quote:<hr height="1" noshade id="quote">
Вот так вот без строчки unsafe кода можно изменить поведение объектов.
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">
с маленьким замечанием:
msdn.m...2.aspx
<blockquote id="quote"><font size="1" face="Verdana, Helvetica, Arial" id="quote">quote:<hr height="1" noshade id="quote">Marshal - класс: Предоставляет коллекцию методов для <b>выделения неуправляемой памяти, копирования блоков неуправляемой памяти и преобразования управляемых типов в неуправляемые, а также прочих разнообразных методов, используемых при взаимодействии с неуправляемым кодом </b>.<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

Margarita Lukina
Margarita Lukina
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.