Практическое руководство. Миграция в /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
    }
    

В проверяемом коде не допускается использование следующих ключевых слов:

См. также

Ссылки

Чистый и проверяемый код (C++/CLI)