2017-05-13 10 views
9

निम्नलिखित उदाहरण पर विचार सीमित करने के लिए:-Wtype सीमा एक अहस्ताक्षरित पूर्णांक

unsigned short c = // ... 
if (c > 0xfffful) 
    c = 0xfffful; 

unsigned short के बाद से वास्तव में 16 बिट से भी बड़ा हो सकता है, मैं एक के लिए हेक्स प्रारूप में snprintf यह पहले मूल्य को सीमित करना चाहते निश्चित आकार बफर।

हालांकि, जीसीसी (लेकिन झुकाव नहीं) चेतावनी देता है: comparison is always false due to limited range of data type [-Wtype-limits]

क्या यह जीसीसी में एक बग है या मुझे कुछ याद आया? मैं समझता हूं कि मेरी मशीन unsigned short बिल्कुल 16 बिट्स है, लेकिन यह अन्य प्लेटफॉर्म पर होने की गारंटी नहीं है।

+0

@WhiZTiM: हाँ, यह सवाल का आधार है। अब ओपी एक ही कोड को एक मंच पर ले जाता है जहां 'std :: uint_least16_t' 16 बिट्स से अधिक है। क्या होता है? –

+0

मैंने व्याकुलता से बचने के लिए 'unsd :: uint_least16_t' को 'unsigned short' के साथ बदल दिया है (समस्या विशेष रूप से 0iरूप में नहीं है)। – danpla

+0

यह निराशाजनक है; मैंने सोचा था कि इससे पहले कि आप जानबूझकर 'std :: uint_least16_t' का उपयोग करें, ताकि आप विशेष रूप से कम से कम 16 बिट्स (निश्चित-चौड़ाई प्रकार के संभावित प्रदर्शन दंड के बिना) का उपयोग कर सकें। एक 'हस्ताक्षरित शॉर्ट' के साथ मैं वास्तव में उस लाभ में नहीं देख सकता जो आप पूछ रहे हैं। ओह अच्छा। –

उत्तर

0

यह एक बग की तरह प्रतीत नहीं होता है (शायद यह एक थोड़ा अनुभवहीन सुविधा समझा जा सकता है), लेकिन मैं देख सकता हूँ तुम क्यों पोर्टेबिलिटी के लिए इस कोड चाहते हैं।

किसी मानक मैक्रोज़ की अनुपस्थिति में आपको यह बताने के लिए कि आपके प्लेटफ़ॉर्म पर किस प्रकार का आकार है (और कोई भी नहीं है), मेरे पास शायद मेरी बिल्ड प्रक्रिया में एक कदम होगा जो इसे बाहर करता है और पास करता है -D परिभाषा के रूप में आपके कार्यक्रम के लिए।

उदा।

if ... 
    CFLAGS += -DTRUNCATE_UINT16_LEAST_T 
endif 

तो:

#ifdef TRUNCATE_UINT16_LEAST_T 
    if (c > 0xfffful) 
     c = 0xfffful; 
#endif 
एक कदम से उत्पादन पर Makefile सशर्त प्रतिपादित साथ configure में

, या कुछ अन्य सी ++ प्रोग्राम है जो बस sizeof रों बाहर प्रिंट के निष्पादन मेक में। अफसोस की बात है कि पार संकलन के नियम।

लंबे समय तक मैं जीसीसी लोगों को अधिक बुद्धिमान व्यवहार का सुझाव देने का प्रस्ताव करता हूं, क्योंकि जब इन विशेष प्रकार के उपनाम उपयोग में होते हैं।

+0

मैंने पाया कि '>' के बजाय '> =' का उपयोग चेतावनी को चुप कर देगा। फिर भी, मुझे लगता है कि यह एक बग है: मैं पोर्टेबल और सुरक्षित कोड लिखने की कोशिश कर रहा हूं, जबकि जीसीसी ने मुझे विपरीत करने के लिए प्रोत्साहित किया है। – danpla

+0

@ डैनप्ला, जो इस मुद्दे को चुप करता है क्योंकि जब 'c = 0xfffful' if कथन सत्य है। अगर कथन अब हमेशा झूठा नहीं है। मुझे लगता है कि जीसीसी स्मार्ट तरीके से काम नहीं कर रहा है। – chessofnerd

+1

@chessofnerd हां, यह उस कामकाज का पूरा बिंदु है। हालांकि, यह अभी भी एक कामकाज है, जो थोड़ा अजीब दिखता है और मेरा इरादा सीधे व्यक्त नहीं करता है। – danpla

2

मैं कहूंगा कि यह एक बग नहीं है। जीसीसी का दावा है कि if (c > 0xfffful) हमेशा झूठा होगा, जो आपकी मशीन पर सच है। जीसीसी इसे पकड़ने के लिए काफी स्मार्ट था, झगड़ा नहीं था। अच्छी नौकरी जीसीसी!

दूसरी ओर, जीसीसी नहीं बहुत चालाक सूचना के लिए कि यह हमेशा अपने मशीन पर झूठा था, जबकि इसकी जरूरी हमेशा किसी और के मशीन पर झूठा नहीं था,। जीसीसी पर आओ!

नोट में सी ++ 11, *_least##_t प्रकार appear (मैं का अधिकार सुरक्षित रखते गलत साबित किया जा करने के लिए!) कि typedef द्वारा कार्यान्वित किया जाना है। जब तक जीसीसी इसकी चेतावनी जांच चला रहा है, तब तक इसकी कोई संकेत नहीं है कि मूल डेटा प्रकार uint_least16_t था। यदि ऐसा है, तो कंपाइलर का यह कहने का कोई तरीका नहीं होगा कि तुलना अन्य प्रणालियों पर सच हो सकती है। याद रखने के लिए जीसीसी बदलना मूल डेटा प्रकार क्या बेहद मुश्किल हो सकता है। मैं जीसीसी की बेवकूफ चेतावनी का बचाव नहीं कर रहा हूं लेकिन सुझाव दे रहा हूं कि इसे ठीक करना क्यों मुश्किल हो सकता है।

मुझे यह देखने के लिए उत्सुकता होगी कि जीसीसी लोग इसके बारे में क्या कहते हैं। क्या आपने उनके साथ filing an issue माना है?

+0

यदि आप कोई समस्या दर्ज करते हैं, तो मैं आपके शब्दों में सावधान रहूंगा। मैंने आपको अपनी बग रिपोर्टिंग मार्गदर्शिका का एक लिंक दिया है लेकिन मुझे अभी भी यह कहना है कि यह प्रति बग नहीं है। एक अति उत्साही चेतावनी के अधिक। – chessofnerd

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