Gewusst wie: Migrieren auf /clr:safe

Aktualisiert: November 2007

Visual C++ 2005 kann unter Verwendung von /clr:safe überprüfbare Komponenten generieren. Dadurch gibt der Compiler für jedes nicht überprüfbare Codekonstrukt einen Fehler aus.

Hinweise

In den folgenden Fällen werden Überprüfbarkeitsfehler ausgegeben:

  • Systemeigene Typen. Auch wenn sie nicht verwendet wird, verhindert eine Deklaration systemeigener Klassen, Strukturen, Zeiger oder Arrays die Kompilierung.

  • Globale Variablen

  • Funktionsaufrufe in eine nicht verwaltete Bibliothek, einschließlich der Common Language Runtime-Funktionsaufrufe

  • Eine überprüfbare Funktion darf keinen static_cast Operator für die Abwärtskonvertierung enthalten. Der static_cast Operator kann zur Typkonvertierung zwischen primitiven Typen verwendet werden, für die Abwärtskonvertierung muss jedoch safe_cast oder eine Umwandlung im C-Format (als safe_cast implementiert) verwendet werden.

  • Eine überprüfbare Funktion darf keinen reinterpret_cast Operator (oder eine entsprechende Umwandlung im C-Format) enthalten.

  • Eine überprüfbare Funktion kann keine Arithmetik mit einem interior_ptr ausführen. Es sind nur Zeigerzuweisungen und -dereferenzierungen zulässig.

  • Eine überprüfbare Funktion darf lediglich Zeiger auf Referenztypen auslösen oder abfangen, daher müssen Werttypen vor dem Auslösen geschachtelt werden.

  • Eine überprüfbare Funktion darf lediglich überprüfbare Funktionen aufrufen (CRT-Aufrufe sind daher nicht zulässig, denn sie enthalten AtEntry/AtExit, sodass globale Konstruktoren unzulässig sind).

  • Eine überprüfbare Klasse kann nicht Explicit verwenden.

  • Beim Erstellen einer EXE-Datei dürfen in einer Hauptfunktion keine Parameter deklariert werden, sodass GetCommandLineArgs zum Abrufen der Befehlszeilenargumente verwendet werden muss.

  • Ausführen eines nicht virtuellen Aufrufs einer virtuellen Funktion. Beispiel:

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

Auch die folgenden Schlüsselwörter sind aus überprüfbarem Code auszuschließen:

Siehe auch

Referenz

Reiner und überprüfbarer Code