साथ अभिन्न अतिप्रवाह का पता लगा रहा जब हाल ही में answering another question, मैं के साथ एक समस्या की खोज की कोड की तरह:scanf
int n;
scanf ("%d", &n);
strtol
के साथ, आप अतिप्रवाह, क्योंकि उस स्थिति में, अधिकतम मूल्य अनुमति n
और errno
में डाला जाता है पता लगा सकते हैं , अतिप्रवाह से संकेत मिलता है के रूप में C11 7.22.1.4 The strtol, strtoll, strtoul, and strtoull functions /8
प्रति सेट है:
तो सही मान प्रदर्शनीय मूल्यों की सीमा के बाहर है, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, ULONG_MAX, या ULLONG_MAX मैं वापस लौटा (वापसी के प्रकार और मूल्य के संकेत के अनुसार, यदि कोई हो), और मैक्रो ERANGE का मान गलत में संग्रहीत किया जाता है।
हालांकि, मानक, scanf
के साथ काम कर विशेष रूप से C11 7.21.6.2 The fscanf function /10
के वर्गों में, हम देखते हैं:
इस वस्तु के लिए एक उपयुक्त प्रकार नहीं है, तो या रूपांतरण के परिणाम नहीं दर्शाया जा सकता है, तो वस्तु में, व्यवहार अपरिभाषित है।
अब, मुझे करने के लिए, कि किसी भी मान दिया जा सकता है इसका मतलब है और errno
का कोई जिक्र नहीं कुछ भी करने के लिए स्थापित किया जा रहा है। इसका कारण यह है ऊपर लिंक सवाल का प्रश्नकर्ता एक 32-बिट int
में 9,999,999,999
प्रवेश कर रहा है और वापस 1,410,065,407
हो रही प्रकाश में आया, एक मूल्य के 233
बहुत छोटा, यह दर्शाता है यह बस के आसपास प्रकार की सीमा पर लपेटा था।
जब I ने कोशिश की, तो मुझे 2,147,483,647
वापस मिला, सबसे बड़ा संभव 32-बिट हस्ताक्षरित मूल्य।
तो मेरे सवाल का इस प्रकार है। scanf
फ़ंक्शन के परिवार का उपयोग करते समय आप पोर्टेबल तरीके से अभिन्न ओवरफ़्लो का पता कैसे लगाते हैं? क्या यह भी संभव है?
अब मुझे लगता है कि उल्लेख करना चाहिए, अपने सिस्टम (डेबियन 7) पर, errno
वास्तव में इन परिस्थितियों में ERANGE
करने के लिए सेट है, लेकिन मैं मानक कि इस जनादेश में कुछ भी नहीं मिल सकता है। साथ ही, scanf
से वापसी मान 1
, आइटम स्कैनिंग में सफलता का संकेत देती है।
मैं एक कारण है कि 'errno' अच्छी तरह से यहाँ काम नहीं करता देख सकते हैं:' scanf' विभिन्न रूपांतरण हो सकता है। उनमें से कौन सा 'errno' लागू होता है? ('Errno' रूपांतरण विफलता के बराबर थे की स्थापना करते हैं, तो यह है कि स्पष्ट हो सकता है, लेकिन जाहिरा तौर पर यह मामला नहीं है, नहीं भी' strtol' में।) –
आपके सिस्टम क्या है? आप कहते हैं कि अपने सिस्टम 'errno' ..._ –
@iharob _on: डेबियन 7, मैं सवाल का अद्यतन कर देंगे लेकिन मैं वास्तव में एक कार्यान्वयन विशेष बात के बाद नहीं बल्कि एक है कि" कोषेर "है मानक के अनुसार कर रहा हूँ,। यह संख्या सफल रूपांतरण देता है - – paxdiablo