Como migrar para /clr:safe (C++/CLI)
Visual C++ pode gerar componentes verificáveis usando /clr:safe, que faz com que o compilador gerencia erros para cada construção não gerencie o código.
Comentários
Os seguintes problemas gerenciem erros de verificabilidade:
Tipos nativos. Mesmo se não for usada, a declaração de classes nativas, de estruturas, de ponteiros, ou de matrizes impedirá a compilação.
Variáveis globais
Chamadas de função em qualquer biblioteca não gerenciado, incluindo chamadas de função de Common Language Runtime
Uma função verificável não pode conter Operador static_cast para a conversão para baixo. Operador static_cast pode ser usado para converter entre tipos primitivos, mas para a conversão para baixo, o safe_cast (Extensões de Componentes C++) ou a c a conversão de estilo (que é implementada como safe_cast (Extensões de Componentes C++)) deve ser usada.
Uma função verificável não pode conter Operador reinterpret_cast (ou qualquer equivalente convertido de estilo 2.0 - c).
Uma função verificável não pode executar a aritmética em interior_ptr (C++/CLI). Só pode atribuir e desreferenciar-la.
Uma função verificável só pode gerar ou captura ponteiros para referenciar tipos, assim os tipos de valores devem ser boxed antes de gerar.
Uma função verificável só pode chamar funções verificáveis (tais que as chamadas para Common Language Runtime não sejam permitidos, incluem AtEntry/AtExit, e assim que os construtores globais são desaprovados.)
Uma classe verificável não pode usar Explicit.
Se estiver compilando EXE, uma função principal não pode declarar nenhum parâmetro, de modo que GetCommandLineArgs deve ser usado para recuperar argumentos de linha de comando.
Fazendo uma chamada não virtual para uma função virtual. Por exemplo:
// 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 }
Além disso, as seguintes palavras-chave não podem ser usados no código verificável:
não gerenciado e pragmas de bloco
despido e modificadores de alinhar__declspec
__try e __except