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'opérateur de static_cast pour l'exécution d'un downcast.L'opérateur de static_cast peut être utilisé pour effectuer un cast entre des types primitifs. En revanche, pour effectuer un downcast, safe_cast (extensions du composant C++) ou un cast de style C (implémenté en tant que safe_cast (extensions du composant C++)) doit être utilisé.
Une fonction vérifiable ne peut pas contenir d'opérateur de reinterpret_cast (ou tout cast de style C).
Une fonction vérifiable ne peut pas effectuer d'opération arithmétique sur interior_ptr (C++/CLI).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 :