यह कोड एक स्थानीय टॉगल को एक आउटगोइंग नेटवर्क-ऑर्डर बूलियन (जो वास्तव में एक 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 है, चाहे इसके ऑपरेंड का मान कुछ भी हो। यह "|" के बिटवाइज़ सेकेंड ऑपरेंड के रूप में होता है।

0
Glebbb 5 फरवरी 2021, 06:02
क्या uint32_t mode_exclusive = (local_mode & TYPE_EXCLUSIVE) ? 1 : 0; response.exclusive = htonl(mode_exclusive); एक वैकल्पिक हल होगा? mode_t uint16_t लगता है (क्योंकि इसे bitmap16_t से परिभाषित किया गया है) और यह समस्या हो सकती है। त्रुटि संदेश में __uint16_t की अतिरिक्त कास्ट इस बात की पुष्टि कर सकती है कि अन्यथा, मुझे इसका कोई कारण नहीं दिखता।
 – 
Craig Estey
5 फरवरी 2021, 06:14

1 उत्तर

सबसे बढ़िया उत्तर

यह एक झूठी सकारात्मक है। एक छोटे-एंडियन प्लेटफॉर्म पर, htonl एक एंडियन स्वैप करता है, तर्क के बाइट्स को निकालता है और उन्हें बिटवाइज या ऑपरेटर का उपयोग करके विपरीत क्रम में वापस एक साथ रखता है। कवरिटी सही ढंग से महसूस करती है कि उन बाइट्स में से एक हमेशा शून्य होगा क्योंकि इस मामले में मूल तर्क हमेशा 0 या 1 होता है। लेकिन यह निष्कर्ष निकालना गलत है कि तथ्य अनजाने में है।

मेरा सुझाव है कि इसे वापस कवरिटी की सहायता टीम को रिपोर्ट करें ताकि वे इसे ठीक कर सकें।

4
Scott McPeak 5 फरवरी 2021, 06:16
स्पष्टीकरण के लिए धन्यवाद, यह अब बहुत समझ में आता है और कवरिटी के हिस्से पर एक अजीब धारणा है।
 – 
Glebbb
5 फरवरी 2021, 06:54
चेक का मूल विचार ध्वनि है: यदि एक पूर्ण अभिव्यक्ति हमेशा परिवर्तनीय इनपुट होने के बावजूद स्थिरांक का मूल्यांकन करती है, तो शायद कुछ गलत है (यह कुछ हद तक ऑपरेटर प्राथमिकता गलतियों के कारण होता है)। लेकिन यहां, यह केवल एक उप-अभिव्यक्ति है जो स्थिर है, जो अकेले (आईएमओ) एक खोज को वारंट करने के लिए पर्याप्त सबूत नहीं है।
 – 
Scott McPeak
5 फरवरी 2021, 07:30