Практическое руководство. Миграция в /clr:safe
Обновлен: Ноябрь 2007
Visual C++ 2005 может создавать компоненты с помощью /clr:safe, что приводит к возникновению ошибок в компиляторе для каждой не поддающейся проверке конструкции кода.
Заметки
Такие ошибки могут возникать в следующих случаях.
Собственные типы. Даже если эти типы не используются, объявление собственных классов, структур, указателей или массивов может помешать компиляции.
Глобальные переменные
Вызовы функции в неуправляемой библиотеке, включая вызовы функции в среде CLR.
Проверяемая функция не может содержать static_cast Operator для понижающего преобразования. static_cast Operator может использоваться для преобразования среди простых типов, однако, для понижающего преобразования должны использоваться safe_cast и преобразование стиля C (реализованного как safe_cast).
Проверяемая функция не может содержать reinterpret_cast Operator (или любой другой эквивалент преобразования стиля C).
Проверяемая функция не может выполнять арифметические действия interior_ptr. Действия могут присваиваться ей и использоваться для разыменования.
Проверяемая функция может только вызывать и принимать указатели для ссылочных типов, поэтому типы значений должны упаковываться перед вызовом.
Проверяемая функция может вызывать только проверяемые функции (вызовы среды CLR не допускаются, включая AtEntry/AtExit, глобальные конструкторы также не допускаются).
Класс переменной не может использовать Explicit.
При сборке EXE главная функция не может объявлять параметры, поэтому для извлечения аргументов командной строки необходимо использовать GetCommandLineArgs.
Невиртуальный вызов к виртуальной функции. Пример.
// not_verifiable.cpp // compile with: /clr ref struct A { virtual void Test() {} }; ref struct B : A {}; int main() { B^ b1 = gcnew B; b1->A::Test(); // Non-virtual call to virtual function }
В проверяемом коде не допускается использование следующих ключевых слов:
модификаторы naked и align __declspec
__try и __except