How to: Migrate to /clr:safe (C++/CLI)

 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at How to: Migrate to -clr:safe (C++/CLI).

Visual C++ can generate verifiable components by using /clr:safe, which causes the compiler to generate errors for each non-verifiable code construct.

Remarks

The following issues generate verifiability errors:

  • Native types. Even if it isn't used, the declaration of native classes, structures, pointers, or arrays will prevent compilation.

  • Global variables

  • Function calls into any unmanaged library, including common language runtime function calls

  • A verifiable function cannot contain a static_cast Operator for down-casting. The static_cast Operator can be used for casting between primitive types, but for down-casting, safe_cast or a C-Style cast (which is implemented as a safe_cast) must be used.

  • A verifiable function cannot contain a reinterpret_cast Operator (or any C-style cast equivalent).

  • A verifiable function cannot perform arithmetic on an interior_ptr (C++/CLI). It may only assign to it and dereference it.

  • A verifiable function can only throw or catch pointers to reference types, so value types must be boxed before throwing.

  • A verifiable function can only call verifiable functions (such that calls to the common language runtime are not allowed, include AtEntry/AtExit, and so global constructors are disallowed).

  • A verifiable class cannot use Explicit.

  • If building an EXE, a main function cannot declare any parameters, so GetCommandLineArgs must be used to retrieve command-line arguments.

  • Making a non-virtual call to a virtual function. For example:

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

Also, the following keywords cannot be used in verifiable code:

See Also

Pure and Verifiable Code (C++/CLI)