MDA invalidCERCall
Observação
Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O MDA (Assistente de Depuração Gerenciado) de invalidCERCall
é ativado quando há uma chamada de dentro do gráfico de CER (região de execução restrita) a um método que não tem nenhum contrato de confiabilidade um tem um contrato excessivamente fraco. Um contrato fraco é um contrato que declara que o pior caso de corrupção de estado tem escopo maior do que a instância passou para a chamada, ou seja, o AppDomain ou o estado do processo pode se corromper ou o resultado dele não é sempre computável de forma determinística quando chamado dentro de uma CER.
Sintomas
Resultados inesperados ao executar código em uma CER. Os sintomas não são específicos. Eles poderiam ser uma OutOfMemoryException inesperada, uma ThreadAbortException ou outras exceções na chamada para o método não confiável, porque o runtime não o preparou com antecedência nem o protegeu de exceções ThreadAbortException em runtime. Uma ameaça maior é que qualquer exceção resultante do método em tempo de execução pode deixar o AppDomain ou o processo em um estado instável, o que contraria o objetivo de uma CER. O motivo pelo qual uma CER é criada é para evitar corrupções de estado como essa. Os sintomas de estado corrompido são específicos do aplicativo porque a definição de estado consistente é diferente entre aplicativos.
Causa
O código dentro de uma CER está chamando uma função sem nenhum ReliabilityContractAttribute ou com um ReliabilityContractAttribute fraco que não é compatível com a execução em uma CER.
Em termos de sintaxe de contrato de confiabilidade, um contrato fraco é um contrato que não especifica um valor de enumeração Consistency ou especifica um valor de Consistency de MayCorruptProcess, MayCorruptAppDomain ou None. Qualquer uma das condições a seguir indica que o código de chamada pode impedir os esforços de outro código na CER para manter o estado consistente. CERs permitem que o código trate erros de maneira muito determinística, mantendo invariáveis internas que são importantes para o aplicativo e permitindo que ele continue em execução ao enfrentar erros transitórios, como exceções de memória insuficiente.
A ativação desse MDA indica uma possibilidade de que o método ser chamado na CER pode falhar de forma que o chamador não esperava ou que deixa o AppDomain ou o estado do processo irrecuperável ou corrompido. Naturalmente, o código chamado pode ser executado corretamente e o problema é simplesmente um contrato ausente. No entanto, os problemas envolvidos ao escrever código confiável são sutis e a ausência de um contrato é um bom indicador de que o código pode não ser executado corretamente. Os contratos são indicadores de que o programador codificou de modo confiável e também são promessas de que essas garantias não serão alteradas em revisões futuras do código. Ou seja, os contratos são declarações de intenção e não apenas detalhes de implementação.
Já que qualquer método com um contrato fraco ou inexistente pode vir a falhar de muitas maneiras imprevisíveis, o runtime não tenta remover do método nenhuma das suas próprias falhas imprevisíveis que são introduzidas por compilação JIT lenta, população do dicionário genérico ou anulações de thread, por exemplo. Ou seja, quando esse MDA é ativado, ele indica que o runtime não incluiu o método chamado na CER sendo definida; o grafo de chamadas foi encerrado neste nó porque continuar a preparar essa subárvore ajudaria a mascarar o erro em potencial.
Resolução
Adicionar um contrato de confiabilidade válido para a função ou evitar o uso dessa chamada de função.
Efeito sobre o runtime
O efeito de chamar um contrato fraco de uma CER pode ser a falha da CER em concluir suas operações. Isso pode levar à corrupção do estado do processo AppDomain.
Saída
A seguir, a saída de exemplo deste MDA.
Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.
Configuração
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>