C6312

تحذير C6312: تكرار حلقي لا نهائية محتملة: استخدم من EXCEPTION_CONTINUE_EXECUTION ثابتة في التعبير تصفية ‏‏ استثناء محاولة-باستثناء

يشير هذا التحذير استخدم من EXCEPTION_CONTINUE_EXECUTION(أو another ثابت that evaluates إلى-1) ثابتة في تعبير عامل تصفية من معالج ‏‏ استثناء مصنفة. استخدم الثابت القيمة EXCEPTION_CONTINUE_EXECUTIONمما قد يؤدي إلى على تكرار حلقي لا نهائية. على سبيل المثال، إذا تم مرفوع استثناء بواسطة أجهزة، التعليمة التي تسببت ‏‏ استثناء سيتم إعادة تشغيل. إذا كان العنوان الذي سبب ‏‏ استثناء لا تزال غير صحيحة، يحدث ‏‏ استثناء آخر و أن hوled بنفس الطريقة. ويتسبب هذا في تكرار حلقي لا نهائية.

يوجد استدعاء صريح إلى RaiseExceptionمباشرة لا يتسبب تكرار حلقي لا نهائية، ولكن سيستمر تنفيذ تعليمات برمجية في حظر المحمية. يمكن أن يكون هذا غير متوقع، و مما قد يؤدي إلى تكرار حلقي لا نهائية إذا RaiseExceptionتم استخدامه لتجنب dereferencing على مؤشر غير صالح.

بشكل عام، 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");
  }
}