2012-05-14 9 views
5

निम्नलिखित कोड एक एमआईएसआरए चेक पर विफल रहता है। ठोस त्रुटि संदेश है:पूर्णांक प्रकार कैसे पूर्ण रूप से परिवर्तित होते हैं?

(मिश्रा सी: 2004 10.1/आर) परोक्ष एक अलग अंतर्निहित प्रकार में परिवर्तित नहीं किया जाएगा, यदि यह एक में रूपांतरण नहीं है पूर्णांक प्रकार की अभिव्यक्ति का मूल्य एक ही signedness

typedef enum _MyEnum { One, Two } MyEnum; 
MyEnum MyVariable; 

int foo(void) 
{ 
    int result = 1; 

    if (One == MyVariable) // fails here with MISRA-C:2004 10.1/R 
    { 
     result = 2; 
    }  
    return result; 
} 
  • के व्यापक पूर्णांक प्रकार क्यों तार्किक व्यंजक बदल जाती है?
  • यहां क्या परिवर्तित किया गया है?
  • जब मैं One और MyVariable स्वैप करता हूं तो कोड एमआईएसआरए चेक क्यों पास करता है?

संपादित: संकलक एक टीआई शामिल मिश्रा के साथ "MSP430 C/C++ संकलक v4.0.0" नियमों की जांच है।

+3

मुझे इस मिसा चीज़ के बारे में पहले से ही खराब क्रूर हैं। आप क्या कर रहे हैं पूरी तरह से ठीक है। – cnicutar

+0

मैं दूसरा संकलक बग परिकल्पना – Alex

+0

करता हूं क्या यह 'if (MyVariable == एक) {}' के लिए एक ही त्रुटि/चेतावनी उत्पन्न करता है? – wildplasser

उत्तर

-1

मुझे एक कंपाइलर बग पर संदेह होगा। आप किस कंपाइलर का उपयोग कर रहे हैं? This post टीआई के कंपाइलर का उपयोग करते समय मिश्रा 10.1/आर विफलताओं के कारण एक कंपाइलर बग का उल्लेख करता है।

+0

लिंक में बग एक और समस्या के लिए referes।यह वही मिस्रा चेक है जो विफल रहता है, लेकिन यह एक सरणी तत्व के गलती से इलाज के लिए है। यह enum और चर के क्रम से संबंधित नहीं है। – harper

+0

मुझे पता है। मैंने अभी इसे मिश्रा चेक का एक उदाहरण बताया है जो एक कंपाइलर बग के कारण विफल रहा। – JesperE

+0

टीआई द्वारा पुष्टि की गई यह एक बग है। – harper

0

मुझे संदेह होगा कि संकलक आंतरिक रूप से enums को unsigned integer के रूप में संभालता है, जब तक enum के भीतर कोई नकारात्मक मूल्य नहीं है।

6

मिसरा चेकर में कोई बग नहीं है, यह सही ढंग से व्यवहार करता है। आपको यह त्रुटि मिलती है क्योंकि सी मानक त्रुटिपूर्ण और अजीब है।

  • One एक गणना स्थायी है:

    दो आइटम हैं। मानक §6.7.2.2/2 बताता है कि यह int के साथ संगत होगा, कोई अपवाद नहीं।

  • MyVariableअंकित प्रकार है। मानक §6.7.7.2/4 बताता है कि यह चार, एक हस्ताक्षरित पूर्णांक प्रकार या एक हस्ताक्षरित पूर्णांक प्रकार के साथ संगत होना चाहिए। लागू होने वाला कौन सा प्रकार कार्यान्वयन-परिभाषित व्यवहार है।

आपके मामले में, कार्यान्वयन से परिभाषित प्रगणित प्रकार अहस्ताक्षरित पूर्णांक के बराबर हो गया लगता है।

तो कोड हस्ताक्षर किए गए int के एक चर को हस्ताक्षरित int में परिवर्तित करने का प्रयास करता है, जो कि मिसरा 2004 10.1 का उल्लंघन है।

मिसा-अनुपालन कोड if (One == (MyEnum)MyVariable) होना चाहिए।

+2

"मानक" सी मानक है? यदि MyVariable एक हस्ताक्षरित int है, तो जब मैं एक और MyVariable स्वैप करता हूं तो चेक सफल क्यों होता है? – harper

+1

@harper हां, सी मानक आईएसओ 98 99: 2011 (सी 9 0 समान है)। खैर, स्वैप तब एक बग होना चाहिए, इससे आपको कोई त्रुटि नहीं देनी चाहिए इससे कोई फर्क नहीं पड़ता कि आप किस ऑर्डर का उपयोग करते हैं। – Lundin

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