Freigeben über


C6312

Warnung C6312: Mögliche Endlosschleife: Verwendung der EXCEPTION_CONTINUE_EXECUTION-Konstanten im Ausnahmefilterausdruck einer try-except-Anweisung.

Diese Warnung weist auf die Verwendung der EXCEPTION_CONTINUE_EXECUTION-Konstanten (oder einer anderen Konstante, die zum Ergebnis -1 ausgewertet wird) im Filterausdruck eines strukturierten Ausnahmehandlers hin. Die Verwendung des EXCEPTION_CONTINUE_EXECUTION-Konstantenwerts kann u. U. zu einer Endlosschleife führen. Wenn die Hardware beispielsweise eine Ausnahme auslöst, wird die Anweisung, die die Ausnahme veranlasst hat, neu gestartet. Ist die Adresse, die die Ausnahme veranlasst hat, nach wie vor ungültig, tritt eine andere Ausnahme auf, die auf dieselbe Weise behandelt wird. Dadurch entsteht eine Endlosschleife.

Ein expliziter Aufruf von RaiseException führt nicht direkt zu einer Endlosschleife, aber er verursacht die Fortsetzung der Codeausführung im geschützten Block. Dies kann unerwartet auftreten und zu einer Endlosschleife führen, wenn mithilfe von RaiseException die Dereferenzierung eines ungültigen Zeigers vermieden werden sollte.

In der Regel sollte EXCEPTION_CONTINUE_EXECUTION nur von einer Funktion zurückgegeben werden, die im Filterausdruck aufgerufen wurde, wodurch die Möglichkeit besteht, entweder den Zeiger, der die Ausnahme veranlasst hat, oder den zugrunde liegende Speicher zu korrigieren.

Beispiel

Der folgende Code generiert diese Warnung:

#include <excpt.h>
#include <stdio.h>
#include <windows.h>

void f (char *ptr)
{
  __try 
  {
    // exception occurs if the caller passes null ptr
    // code...   
   *ptr = '\0';
  } 
  __except (EXCEPTION_CONTINUE_EXECUTION)
    // When EXCEPTION_CONTINUE_EXECUTION is used, the handler
    //  block of the structured exception handler is not executed. 
  {
    puts("This block is never executed");
  }
}

So korrigieren Sie die Warnung unter Verwendung des folgenden Codes

#include <excpt.h>
#include <stdio.h>
#include <windows.h>

void f (char *ptr)
{
  __try 
  {
    // exception occurs if the caller passes null ptr
    // code...
    *ptr = '\0';
  } 
  __except (GetExceptionCode()== EXCEPTION_ACCESS_VIOLATION ? 
               EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
  {
    puts("Error Occurred");
  }
}