2010-08-25 4 views
16

में VS2010 की मेरी नकल में, stdlib.h (लाइनों 353-355)बीच में बंद करें() (noreturn) __declspec नहीं है VS2010

_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code); 
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code); 
_CRTIMP void __cdecl abort(void); 

मुझे लगता है यह अजीब है कि abort() पर कोई noreturn एनोटेशन शामिल हैं। क्या किसी को इसके लिए कोई कारण पता है? क्या यह एक बग है?

संपादित करें: VS2008 में, यह एक ही है, लेकिन लाइनों stdlib.h

की 371-373 noreturn एनोटेशन की कमी error C4716 ट्रिगर कर रहा है।

आगे संदर्भ: C++0x proposal for standardization of the noreturn annotation, जो कहता है कि abort यह करना चाहिए।

संपादित करें: ऐसा लगता है कि एक हटाए गए उत्तर के साथ चर्चा का एक गुच्छा गायब हो गया है, लेकिन इसका सारांश Defect Report #048 में शामिल है।

+0

अच्छा सवाल पर एक बग के रूप में रिपोर्ट करना चाहिए! लिनक्स दुनिया के libc में यह noreturn के रूप में चिह्नित किया गया है। –

उत्तर

6

मुझे लगता है कि यह निश्चित रूप से गलत है क्योंकि std mandates के बावजूद, विजुअल स्टूडियो के साथ भेजे गए निरस्त() कार्यान्वयन कभी भी निरस्त नहीं होगा। आप SIGABRT के लिए सिग्नल हैंडलर में कुछ भी नहीं कर सकते हैं जो विजुअल स्टूडियो के निरंतर() कार्यान्वयन के अंत में _exit (3) को बुलाएगा (मैं फाइल abort.c, लाइन 137 को देख रहा स्रोतों में देख रहा हूं वीएस 2005)।

इसलिए चूंकि __declspec (noreturn) एक कार्यान्वयन की बात है और चूंकि विजुअल स्टूडियो में निरस्त करने की अपूर्णता कभी भी सामान्य रूप से वापस नहीं आती है, इसलिए निरस्त() को __declspec (noreturn) के साथ टैग किया जाना चाहिए।

यह इस प्रकार है कि यह की अनुपस्थिति एक बग है।

मुझे लगता है कि आप https://connect.microsoft.com/VisualStudio/

+0

मानक के किस हिस्से आपको लगता है कभी एक अनुरूप कार्यान्वयन 'बीच में बंद करें()' से वापस जाने के लिए अनुमति होगी करते हैं? AFAICT 'SIGABRT' नजरअंदाज नहीं किया जा सकता है। पीओएसईक्स ने "सिग्नल हैंडलर कभी वापस नहीं लौटा" का कुछ उल्लेख किया है जो बताता है कि निरस्त किया जा सकता है कि 'लांगजंप' (या सी ++ अपवादों के साथ लागू समकक्ष) द्वारा रद्द किया जा सकता है लेकिन वापसी के माध्यम से नहीं। –

+0

मुझे नहीं पता कि std का कौन सा हिस्सा होगा या नहीं और मुझे लगता है कि इससे कोई फर्क नहीं पड़ता कि std क्या कहता है। एमएस का निरस्त() कार्यान्वयन कभी वापस नहीं आएगा। इसलिए यह एक कार्यान्वयन बग है कि इसे नोरटर्न टैग नहीं किया गया है। –

संबंधित मुद्दे