Aracılığıyla paylaş


C6312

uyarı C6312: Olası sonsuz döngü: deneme haricinde bir özel süzgeç ifadesinde EXCEPTION_CONTINUE_EXECUTION sabiti kullanımı

Bu uyarı, yapılandırılmış özel durum işleyicinin süzgeç ifadesinde EXCEPTION_CONTINUE_EXECUTION sabitinin (ya da -1 olarak değerlendiren başka bir sabit) kullanımını gösterir.EXCEPTION_CONTINUE_EXECUTION sabit değerinin kullanımı sonsuz bir döngüye neden olabilir.Örneğin, donanım tarafından özel durum oluştuğunda, özel duruma neden olan yönerge yeniden başlatılacaktır.Eğer özel duruma neden adres hala hatalı ise, başka bir özel durum ortaya çıkar ve aynı şekilde ele alınabilir.Bu sonsuz bir döngüye neden olur.

RaiseException 'a yapılan açık bir çağrı doğrudan sonsuz bir döngüye neden olmayacaktır, ancak korumalı blok içindeki kodu yürütmeye devam edecek.Bu beklenmedik olabilir ve sonsuz bir döngüye neden olabilir, eğer RaiseException geçersiz bir işaretçi referansından ayırmayı önlemek için kullanılıyorduysa.

Genellikle, EXCEPTION_CONTINUE_EXECUTION yalnızca temelindeki bellek ya da özel duruma neden işaretçinin düzeltme şansı olan süzgeç ifadesinde bir fonksiyon çağrısı tarafından döndürülmelidir.

Örnek

Aşağıdaki kod bu uyarıyı üretir:

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

Bu uyarıyı düzeltmek için aşağıdaki kodu kullanın:

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