共用方式為


C6312

警告 C6312: 可能的無限迴圈: 在 try-except 的例外狀況篩選條件運算式中使用常數 EXCEPTION_CONTINUE_EXECUTION

這則警告指出在結構化例外處理常式的篩選條件運算式中使用常數 EXCEPTION_CONTINUE_EXECUTION (或評估為 -1 的另一個常數)。 使用常數值 EXCEPTION_CONTINUE_EXECUTION 可能會導致無限迴圈。 例如,如果例外狀況是由硬體所引發,則造成此例外狀況的指令將會重新啟動。 如果造成例外狀況的位址仍會發生錯誤,則會發生另一個例外狀況,並以相同方式處理。 這會導致無限迴圈。

對 RaiseException 的明確呼叫不會直接導致無限迴圈,但會在受保護的區塊中繼續執行程式碼。 如果使用了 RaiseException 以防止取值無效的指標,則是無法預期的且可能會導致無限迴圈。

一般而言,只有在篩選條件運算式中呼叫函式時才會傳回 EXCEPTION_CONTINUE_EXECUTION,而可利用此一機會修正造成例外狀況的指標,或是基礎記憶體。

範例

下列程式碼將產生出這個警告:

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

若要更正這則警告,請使用下列程式碼:

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