2016-08-24 10 views
6

मुझे पता है कि सी मानक कार्यान्वयन जहांरियल कार्यान्वयन जहां sizeof (size_t) <sizeof (अहस्ताक्षरित int)

(sizeof(unsigned) > sizeof(size_t)) 

या

(sizeof(int) > sizeof(ptrdiff_t)) 

सच है के लिए अनुमति देता है। लेकिन क्या कोई वास्तविक कार्यान्वयन है जहां इनमें से एक सच है?

पृष्ठभूमि

मैं asprintf() करने के लिए एक समारोह समान लिखा था (के बाद से asprintf() पोर्टेबल नहीं है), और snprintf() एक int लौट लेकिन एक size_t तर्क की जरूरत है, तो मैं जाँच करनी चाहिए अगर leni (नीचे दिखाया गया है) कम नहीं है इस कोड में SIZE_MAX से अधिक?

va_copy(atmp,args) 
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string 
va_end(atmp); 
if(leni<0) 
    //do some error handling 
if(leni>=SIZE_MAX) //do i need this part? 
    //error handling 
size_t lens = ((size_t)leni)+1; 
char *newString = malloc(lens); 
if(!newString) 
    //do some error hanling 
vsnprintf(newString,lens,format,args)!=lens-1) 
+0

मुझे यकीन नहीं है कि वास्तव में यह संभव है, अन्यथा 'आकार (char [LARGE_NUMBER]) हमेशा काम नहीं करेगा। –

+0

@ ओलिवर चार्ल्सवर्थ यह सब काम नहीं करता है, अगर आप char str [1024ULL * 1024ULL * 1024ULL * 5] जैसे कुछ लिखते हैं, तो आपको 32 बिट मशीनों पर कम से कम एक संकलन त्रुटि मिलेगी (कम से कम मेरे मामले में gcc -m32 के साथ) (लेकिन नहीं AMD64 पर) – 12431234123412341234123

+0

@ ओलिवर चार्ल्सवर्थ इसे करने की ज़रूरत नहीं है। यदि ब्रैकेट में निरंतर अभिव्यक्ति एक ऑब्जेक्ट बनाती है जिसे size_t द्वारा प्रदर्शित नहीं किया जा सकता है, जो आकार का परिणाम होगा, तो संकलक एक त्रुटि उत्पन्न करेगा। – 2501

उत्तर

3

जबकि मानक न करे यह नहीं है कि INT_MAX SIZE_MAX की तुलना में छोटे नहीं होगा, समारोह vsnprintf गारंटी देता है कि दिए गए मान SIZE_MAX से अधिक नहीं होना होगा।

यदि कार्य सफल होते हैं, तो वापसी मान अपने दूसरे तर्क से कम होना चाहिए। इस तर्क में आकार size_t है, इस प्रकार वापसी मान SIZE_MAX से कम होना चाहिए। ।

और यदि आप आश्वस्त नहीं हैं, तो आप हमेशा प्रीप्रोसेसर निर्देश का उपयोग कर सकते हैं जो INT_MAX> SIZE_MAX का मूल्यांकन करता है, और फिर आवश्यक कोड शामिल करता है जो बनामप्रिंटफ के परिणाम की जांच करता है।


पहचानकर्ता n नीचे मानक प्रशस्ति पत्र में उल्लेख किया है, vsnprintf को दूसरा तर्क है।

(से उद्धरित: आईएसओ/आईईसी 9899: 201x 7.21.6.12 vsnprintf समारोह 3)
vsnprintf समारोह वर्ण होता है कि लिखा गया है की संख्या रिटर्न n किया गया था पर्याप्त रूप से बड़े, गिनती नहीं एक एन्कोडिंग त्रुटि उत्पन्न होने पर शून्य वर्ण को समाप्त करना, या एक नकारात्मक एटिव मान। इस प्रकार, शून्य-समाप्त आउटपुट पूरी तरह लिखा गया है और केवल तभी लौटाया गया है जब वापस लौटा हुआ मूल्य न हो और एन से कम हो।

+0

क्षमा करें अगर मैं आपको 100% समझ नहीं पा रहा हूं। लेकिन अगर आप 0 से 0 सेट करते हैं, (मैं क्या करता हूं) लौटाई गई संख्या एन से बराबर या कम नहीं होनी चाहिए, तो क्या यह नहीं हो सकता कि लौटाया गया मूल्य SIZE_MAX से बड़ा हो? – 12431234123412341234123

+0

@ 12431234123412341234123 मानक का तात्पर्य है कि वापसी मूल्य एन से अधिक नहीं होना चाहिए, जिसमें SIZE_MAX की सीमा है। अगर आपको लगता है कि सत्तारूढ़ भरोसेमंद होने के लिए बहुत अस्पष्ट है, तो केवल प्रीप्रोसेसर निर्देशों द्वारा संरक्षित चेक जोड़ें और इसके बारे में भूल जाओ। – 2501

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