invalidCERCall – pomocník spravovaného ladění (MDA)
Poznámka:
Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.
Pomocník invalidCERCall
spravovaného ladění (MDA) se aktivuje, když se v grafu omezené oblasti provádění (CER) volá metoda, která nemá žádný kontrakt spolehlivosti nebo nadměrně slabý kontrakt. Slabý kontrakt je kontrakt, který deklaruje, že nejhorší případ poškození stavu je větší rozsah než instance předaná volání, to znamená, AppDomain že stav procesu nebo proces může být poškozen nebo že jeho výsledek není vždy deterministicky computable při volání v rámci CER.
Příznaky
Neočekávané výsledky při provádění kódu v cer. Příznaky nejsou specifické. Můžou se jednat o neočekávané OutOfMemoryExceptionvýjimky , ThreadAbortExceptionnebo jiné výjimky při volání do nespolehlivé metody, protože modul runtime ho předem nepřipravil nebo ho chránil před ThreadAbortException výjimkami za běhu. Větší hrozbou je, že jakákoli výjimka vyplývající z metody za běhu by mohla opustit AppDomain nestabilní stav nebo proces, což je v rozporu s cílem CER. Důvodem vytvoření CER je zabránit poškození stavu, jako je tento. Příznaky poškozeného stavu jsou specifické pro aplikaci, protože definice konzistentního stavu se mezi aplikacemi liší.
Příčina
Kód v rámci CER volá funkci bez ReliabilityContractAttribute nebo slabou ReliabilityContractAttribute , která není kompatibilní se spuštěním v CER.
Z hlediska syntaxe kontraktu spolehlivosti je slabý kontrakt kontrakt, který neurčuje Consistency hodnotu výčtu MayCorruptProcessnebo určuje Consistency hodnotu , MayCorruptAppDomainnebo None. Každá z těchto podmínek značí, že volaný kód může bránit úsilí druhého kódu v CER k zachování konzistentního stavu. CERS umožňují kódu zacházet s chybami velmi deterministickým způsobem, přičemž udržují interní invarianty, které jsou pro aplikaci důležité, a umožňují pokračovat v provozu v případě přechodných chyb, jako jsou výjimky mimo paměť.
Aktivace tohoto MDA značí možnost, že volána metoda v CER může selhat způsobem, který volající neočekával, nebo že opustí AppDomain stav procesu poškozený nebo neopravitelný. Samozřejmě, volaný kód se může spustit správně a problém je prostě chybějící kontrakt. Problémy, které se týkají psaní spolehlivého kódu, jsou ale jemné a absence kontraktu je dobrým indikátorem, že se kód nemusí správně spustit. Kontrakty jsou indikátory, které programátor spolehlivě naprogramoval, a také slibuje, že se tyto záruky v budoucích revizích kódu nezmění. To znamená, že kontrakty jsou deklarace záměru, a ne pouze podrobnosti implementace.
Vzhledem k tomu, že jakákoli metoda se slabým nebo neexistující kontraktem může potenciálně selhat mnoha nepředvídatelnými způsoby, modul runtime se nepokouší z metody odebrat žádné vlastní nepředvídatelné chyby, které zavádí opožděné kompilace JIT, populace obecného slovníku nebo přerušení vlákna, například. To znamená, že když je tato mdA aktivována, znamená to, že modul runtime nezahrnul volanou metodu do definice CER; Graf volání byl ukončen v tomto uzlu, protože pokračování v přípravě tohoto podstromu by pomohlo maskovat potenciální chybu.
Rozlišení
Přidejte do funkce platný kontrakt spolehlivosti nebo se vyhněte použití volání této funkce.
Vliv na modul runtime
Výsledkem volání slabého kontraktu z CER může být selhání cer dokončení operací. To může vést k poškození AppDomain stavu procesu.
Výstup
Následuje ukázkový výstup z tohoto 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.
Konfigurace
<mdaConfig>
<assistants>
<invalidCERCall />
</assistants>
</mdaConfig>