Freigeben über


Warnung C6312

Mögliche Endlosschleife: Verwendung der Konstanten EXCEPTION_CONTINUE_EXECUTION im Ausnahmefilterausdruck eines try-except

Hinweise

Diese Warnung gibt die Verwendung der Konstante EXCEPTION_CONTINUE_EXECUTION (oder einer anderen Konstante, die als -1 ausgewertet wird) im Filterausdruck eines strukturierten Ausnahmehandlers an. Die Verwendung des Konstantenwerts EXCEPTION_CONTINUE_EXECUTION könnte zu einer Endlosschleife führen. Wenn beispielsweise eine Ausnahme durch Hardware ausgelöst wurde, wird die Anweisung, die die Ausnahme verursacht hat, neu gestartet. Wenn die Adresse, die die Ausnahme verursacht hat, weiterhin schlecht ist, tritt eine andere Ausnahme auf und wird auf die gleiche Weise behandelt. Das Ergebnis ist eine Endlosschleife.

Ein expliziter Aufruf, der RaiseException nicht direkt zu einer Endlosschleife führt, aber die Ausführung des Codes im geschützten Block wird fortgesetzt. Dieses Verhalten kann unerwartet sein und kann zu einer endlosen Schleife führen, wenn RaiseException verwendet wurde, um die Ableitung eines ungültigen Zeigers zu vermeiden.

In der Regel sollte nur von einer Funktion zurückgegeben werden, die im Filterausdruck aufgerufen wird. Dies hat die Möglichkeit, entweder den Zeiger zu beheben, EXCEPTION_CONTINUE_EXECUTION der die Ausnahme oder den zugrunde liegenden Arbeitsspeicher verursacht hat.

Codeanalysename: EXCEPTIONCONTINUEEXECUTION

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");
  }
}