Я только что понял, что сейчас там System.Runtime.CompilerServices.Unsafe
. Вы можете создать консольное приложение, написать
Unsafe.AddByteOffset(ref (new int[1])[0], (IntPtr)Int32.MaxValue) = 42;
, и вы получите System.AccessViolationException
.
, скомпилированный без блоков /unsafe
, fixed
или unsafe
, просто так , Как с net472, так и с netcore.
Я бы подумал, что если я явно не скажу компилятору, что я хочу делать небезопасные вещи, нарушения памяти невозможны (безопасные ошибки во время выполнения).
Итак когда была потеряна эта гарантия и что ее заменило?
Кроме того, зачем создавать сборку, которая в любом случае позволяет вам делать то, что вы можете делать с unsafe
блоками и указателями? Такая сборка не прошла бы PEverify, и это правильно. Теперь ситуация такова, что любая сборка, очищенная PEverify, все еще может использовать Unsafe
и быть абсолютно небезопасной на практике, верно? Пахнет странно.