Condividi tramite


Procedura: migrare a /clr:safe (C++/CLI)

In Visual C++ è possibile generare componenti verificabili mediante l'opzione /clr:safe, che indica al compilatore di generare errori per ciascun costrutto di codice non verificabile.

Note

Di seguito sono elencati alcuni problemi che possono generare errori di verificabilità:

  • Tipi nativi. Anche se non viene utilizzata, la dichiarazione di classi native, strutture, puntatori o matrici impedirà la compilazione.

  • Variabili globali.

  • Chiamate di funzione in una qualsiasi libreria non gestita, incluse le chiamate di funzione di Common Language Runtime.

  • Una funzione verificabile non può contenere un static_cast Operator per il downcast. L'static_cast Operator può essere utilizzato per il cast tra tipi primitivi. Per il downcast, invece, deve essere utilizzato safe_cast o un cast di tipo C (implementato come safe_cast).

  • Una funzione verificabile non può contenere un reinterpret_cast Operator (o un cast equivalente di tipo C).

  • Una funzione verificabile non può eseguire operazioni aritmetiche su un interior_ptr. Può solo eseguire assegnazioni e annullarne i riferimenti.

  • Dato che una funzione verificabile può solo generare o intercettare puntatori a tipi di riferimento, è necessario eseguire il boxing dei tipi di valore prima della generazione.

  • Una funzione verificabile può chiamare soltanto funzioni verificabili (non sono consentite chiamate al Common Language Runtime, incluse AtEntry/AtExit, e non sono consentiti costruttori globali).

  • Una classe verificabile non può utilizzare Explicit.

  • Se si sta compilando un file exe, non è possibile dichiarare eventuali parametri in una funzione main. Di conseguenza, è necessario utilizzare il metodo GetCommandLineArgs per recuperare gli argomenti della riga di comando.

  • Chiamata non virtuale a una funzione virtuale. Di seguito è riportato un esempio.

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

Inoltre, le parole chiave elencate di seguito non possono essere utilizzate nel codice verificabile.

Vedere anche

Riferimenti

Codice pure e verificabile (C++/CLI)