Cómo: Migrar a /clr:safe

Actualización: noviembre 2007

Visual C++ 2005 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 anular las referencias a ella.

  • 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 sólo 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:

Vea también

Referencia

Código puro y comprobable