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 static_cast Operator para conversión a versiones anteriores. El static_cast Operator se puede utilizar para convertir entre tipos primitivos, pero para conversión a versiones anteriores, se debe utilizar safe_cast o una conversión de estilo C (que se implemente como safe_cast).
Una función comprobable no puede contener un reinterpret_cast Operator (ni ningún equivalente de conversión de estilo C).
Una función comprobable no puede realizar operaciones aritméticas en interior_ptr. 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á generando 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:
Modificadores __declspec naked y align
__try y __except