Практическое руководство. Миграция в /clr:safe (C++/CLI)
Visual C++ может создавать компоненты с помощью команды /clr:safe, что приводит к возникновению ошибок в компиляторе для каждой не поддающейся проверке конструкции кода.
Заметки
Такие ошибки могут возникать в следующих случаях.
Собственные типы.Даже если эти типы не используются, объявление собственных классов, структур, указателей или массивов может помешать компиляции.
Глобальные переменные
Вызовы функции в неуправляемой библиотеке, включая вызовы функции в среде CLR.
Проверяемая функция не может содержать оператор static_cast для понижающего преобразования.оператор static_cast может использоваться для преобразования среди простых типов, однако, для понижающего преобразования должны использоваться safe_cast (расширения компонентов C++) и преобразование стиля C (реализованного как safe_cast (расширения компонентов C++)).
Проверяемая функция не может содержать оператор reinterpret_cast (или любой другой эквивалент преобразования стиля C).
Проверяемая функция не может выполнять арифметические действия interior_ptr (C++/CLI).Действия могут присваиваться ей и использоваться для разыменования.
Проверяемая функция может только вызывать и принимать указатели для ссылочных типов, поэтому типы значений должны упаковываться перед вызовом.
Проверяемая функция может вызывать только проверяемые функции (вызовы среды 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