Программы, написанные на C++, не обладают свойством типовой безопасности Программы
же на управляемом C++ должны гарантированно обладать указанным свойством Однако,
из-за того, что программы C++ могут содержать неуправляемый код, они не обязательно
обладают свойством типовой безопасности Нельзя производить арифметические операции
с управляемыми указателями Кроме того, нельзя приводить тип управляемого указателя
к неуправляемому Поэтому можно доказать безопасность только тех программ на
C++, которые содержат лишь управляемые код и данные [Управляемый C++ может генерировать
код, гарантированно обладающий свойством типовой безопасности, если избегать
использования некоторых особенностей языка, таких, как неуправляемые указатели
или приведение типов Для проверки типовой безопасности сборки можно использовать
утилиту Pevenfy.exe]. Тем не менее, любая программа на C++, в которой выполняются
арифметические действия над неуправляемыми указателями или приводятся типы управляемых
указателей к неуправляемым, является потенциально опасной.
Следующая программа является примером небезопасного кода на C++, в котором
выполняется приведение указателя pumc на неуправляемый объект к указателю на
переменную типа j_nt В этом случае подобная операция не является опасной, но
в общем случае ее выполнение может представлять опасность Затем выполняется
// Unmanaged.срр
# using <mscorllib.dll>
class UnmanagedClass
// класс UnmanagedClass
{
public:
int i;
};
_gc class ManagedClass
// класс сборщика мусора ManagedClass
{
public:
int i;
};
void main(void)
{
UnmanagedClass *pumc = new UnmanagedClass;
pumc->i = 10;
int * pi = (int *}pumc; // Опасно приведение указателя
pi = (int *)(pumc+1); // Опасность: арифметика над указателями
ManagedClass *pmc = new ManagedClass; pmc->i = 10;
//pi = (int *)pmc; // Ошибка: приведение _gc //(сборщик мусора)
* к *
//pi = (int *)(pmc+1); // Ошибка, арифметика над _gc // (сборщик
мусора) *
}