Cómo: Migrar a /clr:safe (C++/CLI)

Visual C++ puede generar componentes comprobables mediante /clr:safe, que hace que el compilador genere errores para cada construcción de código no comprobable.

Comentarios

Los problemas siguientes generan errores de verificabilidad:

  • Tipos nativos.Aun cuando no se utilice, la declaración de clases nativas, estructuras, punteros o matrices impide la compilación.

  • Variables globales

  • Llamadas a funciones en cualquier biblioteca no administrada, incluso las llamadas a funciones de Common Language Runtime

  • Una función comprobable no puede contener un operador static_cast para conversión a versiones anteriores.El operador static_cast se puede utilizar para convertir entre tipos primitivos, pero para conversión a versiones anteriores, se debe utilizar safe_cast (Extensiones de componentes de C++) o una conversión de estilo C (que se implemente como safe_cast (Extensiones de componentes de C++)).

  • Una función comprobable no puede contener un operador de reinterpret_cast (ni ningún equivalente de conversión de estilo C).

  • Una función comprobable no puede realizar operaciones aritméticas en interior_ptr (C++/CLI).Sólo puede asignársela y desreferenciarla.

  • Una función comprobable sólo puede producir o detectar punteros a tipos de referencia, por lo que se debe aplicar una conversión boxing de los tipos de valor antes de la producción.

  • Una función comprobable solo puede llamar a funciones comprobables (las que llaman a Common Language Runtime no están permitidas, incluidas AtEntry/AtExit; por tanto, los constructores globales no están permitidos).

  • Una clase comprobable no puede utilizar Explicit.

  • Si se está compilando un EXE, una función principal no puede declarar ningún parámetro, por lo que se debe utilizar GetCommandLineArgs para recuperar los argumentos de la línea de comandos.

  • Realizar una llamada no virtual a una función virtual.Por ejemplo:

    // 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
    }
    

Además, no se pueden utilizar las siguientes palabras clave en el código comprobable:

Vea también

Referencia

Código puro y comprobable (C++/CLI)