Partager via


Comment : effectuer une migration vers /clr:safe (C++/CLI)

Visual C++ peut générer des composants vérifiables en utilisant /clr:safe, ce qui contraint le compilateur à générer des erreurs pour chaque construction de code non vérifiable.

Notes

Les problèmes suivants génèrent des erreurs de vérifiabilité :

  • Types natifs. Même si elle n'est pas utilisée, la déclaration de classes natives, de structures, de pointeurs ou de tableaux empêche toute compilation.

  • Variables globales

  • Appels de fonction dans toute bibliothèque non managée, notamment les appels de fonction du Common Language Runtime

  • Une fonction vérifiable ne peut pas contenir d'static_cast Operator pour l'exécution d'un downcast. L'static_cast Operator peut être utilisé pour effectuer un cast entre des types primitifs. En revanche, pour effectuer un downcast, safe_cast ou un cast de style C (implémenté en tant que safe_cast) doit être utilisé.

  • Une fonction vérifiable ne peut pas contenir d'reinterpret_cast Operator (ou tout cast de style C).

  • Une fonction vérifiable ne peut pas effectuer d'opération arithmétique sur interior_ptr. Elle peut uniquement lui effectuer une assignation et annuler une référence à celui-ci.

  • Une fonction vérifiable peut uniquement lever ou intercepter des pointeurs vers des types référence. Par conséquent, les types valeur doivent être convertis avant d'être levés.

  • Une fonction vérifiable peut uniquement appeler des fonctions vérifiables (par exemple les appels au Common Language Runtime ne sont pas autorisés, notamment AtEntry/AtExit, et il en est de même pour les constructeurs globaux).

  • Une classe vérifiable ne peut pas utiliser Explicit.

  • En cas de génération d'un fichier EXE, une fonction principale ne peut pas déclarer tous les paramètres ; par conséquent, GetCommandLineArgs doit être utilisé pour récupérer des arguments de ligne de commande.

  • Appel non virtuel à une fonction virtuelle. Par exemple :

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

En outre, les mots clés suivants ne peuvent pas être employés dans du code vérifiable :

Voir aussi

Référence

Code pur et vérifiable (C++/CLI)