यह कोड एक स्थानीय टॉगल को एक आउटगोइंग नेटवर्क-ऑर्डर बूलियन (जो वास्तव में एक 32 बिट uint है) में परिवर्तित करता है और कम से कम 10 वर्ष पुराना है लेकिन कवरिटी ने इसके बारे में अभी हाल ही में शिकायत करना शुरू किया। मुझे समझ नहीं आ रहा है कि समस्या क्या है और इसे "ऑपरेंड |" कहाँ मिल रहा है से। क्या समस्या यह है कि htonl को केवल 32 बिट मानों पर काम करना चाहिए और हमारे पास 16 बिट वाले के लिए htons हैं? क्या यह झूठी पहचान है?
struct network_response_t {
uint32_t exclusive;
}
bitmap16_t mode_t {
TYPE_MIXED = 0x0,
TYPE_EXCLUSIVE = 0x1,
...
}
mode_t local_mode;
network_response_t response;
response.exclusive = htonl((local_mode & TYPE_EXCLUSIVE) ? 1 : 0);
त्रुटि:
ऑपरेंड परिणाम को प्रभावित नहीं करते (CONSTANT_EXPRESSION_RESULT) result_inनिर्भर_of_operands: (__uint16_t)((__uint32_t)((local_mode & TYPE_EXCLUSIVE) ? 1: 0) और 65535 >> 8 0 है, चाहे इसके ऑपरेंड का मान कुछ भी हो। यह "|" के बिटवाइज़ सेकेंड ऑपरेंड के रूप में होता है।
1 उत्तर
यह एक झूठी सकारात्मक है। एक छोटे-एंडियन प्लेटफॉर्म पर, htonl
एक एंडियन स्वैप करता है, तर्क के बाइट्स को निकालता है और उन्हें बिटवाइज या ऑपरेटर का उपयोग करके विपरीत क्रम में वापस एक साथ रखता है। कवरिटी सही ढंग से महसूस करती है कि उन बाइट्स में से एक हमेशा शून्य होगा क्योंकि इस मामले में मूल तर्क हमेशा 0 या 1 होता है। लेकिन यह निष्कर्ष निकालना गलत है कि तथ्य अनजाने में है।
मेरा सुझाव है कि इसे वापस कवरिटी की सहायता टीम को रिपोर्ट करें ताकि वे इसे ठीक कर सकें।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
uint32_t mode_exclusive = (local_mode & TYPE_EXCLUSIVE) ? 1 : 0; response.exclusive = htonl(mode_exclusive);
एक वैकल्पिक हल होगा?mode_t
uint16_t
लगता है (क्योंकि इसेbitmap16_t
से परिभाषित किया गया है) और यह समस्या हो सकती है। त्रुटि संदेश में__uint16_t
की अतिरिक्त कास्ट इस बात की पुष्टि कर सकती है कि अन्यथा, मुझे इसका कोई कारण नहीं दिखता।