共用方式為


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