2010-02-09 9 views
6

मैं यह कैसे कर सकते:सी, यूनिक्स डोमेन सॉकेट, सहायक डेटा, और जीसीसी; का उपयोग करते हुए CMSG_DATA मैक्रो

*(int *)CMSG_DATA(hdr) = fd2pass; 

जीसीसी के बिना इस को ऊपर उठाने:

error: dereferencing type-punned pointer will break strict-aliasing rules 

एक तरह से इन विकल्पों के साथ संगत में:

-Wall -Werror -pedantic 

उत्तर

-2

-fno गुजर प्रयास करें -स्टिक-एलियासिंग जीसीसी में।

सख्त एलियासिंग विषय पर प्रकाश डालने के लिए, यह question देखें।

+0

धन्यवाद, गोंजालो। मैं मेकफ़ाइल में इसका समाधान नहीं करना चाहता था, क्योंकि मैं सिर्फ एक मौजूदा लाइब्रेरी में एक सुविधा जोड़ रहा हूं, लेकिन अब जब मैं इसे देख रहा हूं, तो यह किसी समस्या की तरह नहीं दिखता है। –

+0

हा। आसान। मुझे मेकफ़ाइल के डर को खत्म करने की जरूरत है। –

+2

कंपाइलर चेतावनियों को प्राप्त करने के लिए सुविधाओं को अक्षम करना आम तौर पर एक बुरा विचार है। चेतावनी को समझना और आपके कोड को संशोधित करना बेहतर है। जब आप बस अपनी संकलन रेखा पर -फनो-सख्त-अलियासिंग को थप्पड़ मारते हैं तो आप कह रहे हैं कि कंपाइलर गलत है। आम तौर पर, यह मानना ​​एक अच्छा विचार है कि आपका कोड समस्या है। ऐसा कहा जा रहा है कि डोमेन सॉकेट के माध्यम से फ़ाइल डिस्क्रिप्टर को पास करने के लिए प्रत्येक कोड नमूना मैंने कभी देखा है मूल प्रश्न में dereferencing योजना का उपयोग करके लिखा गया था। जीसीसी ने हाल ही में इसके बारे में चेतावनी शुरू कर दी है। – petrsnd

6

जब तक कि कुछ गलत नहीं होता है, तब तक कोई वास्तविक एलियासिंग नहीं चल रहा है - * (int *) CMSG_DATA (hdr) द्वारा निर्दिष्ट ऑब्जेक्ट एचडीआर के लिए उपनाम नहीं है - यह एचडीआर के अंत में है। चेतावनी गलत है।

आपको इसके चारों ओर memcpy के साथ काम कर सकते हैं:

memcpy(CMSG_DATA(hdr), &fd2pass, sizeof(int)); 

-fno-सख्त अलियासिंग उपयोग न करें: कि अनुकूलन नहीं है जो सख्त अलियासिंग मान अक्षम करता है; यह काफी खराब कोड उत्पन्न कर सकता है।

तकनीकी विवरण के लिए, glibc bug 16197 देखें।

+1

मैं आपके साथ सहमत हूं, लेकिन यदि आप प्रदर्शन से चिंतित नहीं हैं, तो '-फनो-सख्त-एलियासिंग' विकल्प एक अच्छा समाधान है, जब तक कि आपके द्वारा उपयोग किए जाने वाले सभी कंपाइलर्स इसका समर्थन करते हैं। –

+1

समझने के बिना कंपाइलर चेतावनियों को अनदेखा करना आलसी और खतरनाक है। बहुत से लोग इस प्रश्न में आ जाएंगे और केवल गैर-सख्त-अलियासिंग के प्रभावों को समझे बिना स्वीकार किए गए उत्तर के साथ आगे बढ़ेंगे। Memcpy समाधान मेरे लिए एक अधिक स्वीकार्य सामान्य सिफारिश की तरह लगता है। – petrsnd

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