निम्नलिखित कोड में, फ़ंक्शन foo
एक बार फिर से बार-बार कॉल करता है। आंतरिक कॉल एक पहुंच उल्लंघन का कारण बनता है। बाहरी कॉल अपवाद पकड़ता है।क्या __Finally EXCEPTION_CONTINUE_SEARCH के बाद चलाना चाहिए?
#include <windows.h>
#include <stdio.h>
void foo(int cont)
{
__try
{
__try
{
__try
{
if (!cont)
*(int *)0 = 0;
foo(cont - 1);
}
__finally
{
printf("inner finally %d\n", cont);
}
}
__except (!cont? EXCEPTION_CONTINUE_SEARCH: EXCEPTION_EXECUTE_HANDLER)
{
printf("except %d\n", cont);
}
}
__finally
{
printf("outer finally %d\n", cont);
}
}
int main()
{
__try
{
foo(1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("main\n");
}
return 0;
}
यहाँ की उम्मीद उत्पादन हालांकि, outer finally 0
सुस्पष्ट वास्तविक उत्पादन से लापता है
inner finally 0
outer finally 0
inner finally 1
except 1
outer finally 1
होना चाहिए। क्या यह एक बग है या क्या कुछ विवरण है जो मैं देख रहा हूं?
पूर्णता के लिए, x64 के लिए संकलन VS2015 के साथ होता है। आश्चर्यजनक रूप से यह x86 पर नहीं होता है, जिससे मुझे विश्वास होता है कि यह वास्तव में एक बग है।
यह तकनीकी रूप से अपरिभाषित व्यवहार के दायरे में पड़ सकता है, क्योंकि आप एक शून्य सूचक को असाइन कर रहे हैं। क्या आपने 'RaiseException' का उपयोग करके नियमित अपवाद फेंकने की कोशिश की है? – OmnipotentEntity
अच्छा, अच्छा नहीं है। यह एक नया मुद्दा नहीं है, वीएस2013 वही तरीके से व्यवहार करता है। ऐसा लगता है कि मेरे लिए सुरक्षात्मक सीमा/सुरक्षा, रिकर्सन के लिए विशिष्ट है, यह एक गैर-पुनरावर्ती मामले में ठीक काम करता है। बहुत संदिग्ध कोई भी इस समस्या को ठीक कर सकता है, इसके बारे में connect.microsoft.com को पिंग करने के लिए सबसे अच्छा है। –
@ ओमनीपोटेंट एंटीटी: एक शून्य सूचक को असाइन करना * अपरिभाषित व्यवहार * है, जहां तक सी ++ भाषा मानक का संबंध है। विंडोज प्लेटफार्म पर, हालांकि, यह अच्छी तरह परिभाषित है: निर्देश एक प्रवेश उल्लंघन बढ़ाता है, जिसे एक एसईएच अपवाद के माध्यम से उपयोगकर्ता कोड को सूचित किया जाता है। – IInspectable