2010-01-06 21 views
6

मान लिया जाये कि मैं निम्नलिखित की तरह एक struct है:क्या उपयोगकर्ता कोड द्वारा स्ट्रक्चर पैडिंग सुरक्षित रूप से उपयोग किया जा सकता है?

struct Struct { 
    char Char; 
    int Int; 
}; 

और sizeof(int) एक से अधिक है और संकलक Char सदस्य चर के लिए गद्दी कहते हैं - संकलक उत्पन्न कोड पैडिंग बाइट्स के मूल्यों को बदलने की अनुमति है ?

अगर मैं सूचक अंकगणित का उपयोग करें और Char सदस्य चर आसपास के पैडिंग बाइट्स में कुछ डेटा लिखने और बाद में variable.Char = काम करना यह है कि संकलक द्वारा बनाया गया कोड भी पैडिंग बाइट्स के कुछ ऊपर लिख देगा संभव है मैं क्या मतलब है?

+1

@nobugz, मुझे लगता है कि यह एक वैध सवाल है। छवियों को मानने से पहले आपने 0 को एक संरचना को याद किया है, आप दो संरचनाओं की तुलना करने के लिए बाद में memcmp का उपयोग कर सकते हैं, लेकिन केवल तभी जब संकलक पैडिंग बाइट को स्पर्श नहीं करता है। – quinmars

+0

कक्षाओं और संरचनाओं के साथ पैडिंग, 'मेमसेट' या 'memcpy' के साथ गड़बड़ न करें। ** सुरक्षित ** और ** अधिक मजबूत ** दृष्टिकोण पैक किए गए बफर से पढ़ने और लिखने के तरीकों को लागू करना है (उदा। 'हस्ताक्षरित char [] ')। बीमा अतिरिक्त निष्पादन योग्य स्थान और समय के लायक है। –

+0

@ थॉमस मैथ्यूज, मुझे लगता है कि आपने मुझे गलत समझा। मैं दो संरचनाओं की तुलना करने के बारे में बात कर रहा था, http://stackoverflow.com/questions/141720/how-do-you-compare-structs-for-equality-in-c/141791#141791 – quinmars

उत्तर

10

निम्नलिखित वाक्य गलत: नहीं, यह पैडिंग बाइट्स को ओवरराइट नहीं करेगा। लेकिन शायद यह उपयोग करने के लिए एक अच्छा अभ्यास नहीं है। यदि आपको इसकी आवश्यकता है, तो वहां सदस्य चर जोड़ें।

सी स्टैंडर्ड अनुभाग J.1 अनिर्दिष्ट व्यवहार के साथ एक "अनुबंध जे" है:

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

+0

पैडिंग को ओवरराइट करने से कंपाइलर को रोकने के लिए कुछ भी नहीं है। –

+0

हाँ, यह क्यों नहीं होगा? – jalf

+0

मी culpa।तुम सही हो। इसे रोकने से कुछ भी नहीं है। सी मानक सूची के अनुलग्नक जे को "संरचनाओं में पैडिंग बाइट्स का मूल्य" निर्दिष्ट नहीं किया गया है। –

4

आप निश्चित रूप से वहां कुछ लिख सकते हैं, और memset-ऐसी संरचना का एक उदाहरण है। हालांकि, यह सुरक्षित नहीं है और ऐसा करने के लिए कभी भी अच्छा विचार नहीं है। कुछ अन्य दिन एक और डेवलपर #pragma कहीं कहीं रखता है या एक सदस्य को संरचना घोषणा में जोड़ता है और आपका कोड कई अजीब और फैंसी तरीकों से विस्फोट कर देगा, जो डीबग करने में काफी समय लग सकता है।

13

क्या होगा यदि संकलक चार को बचाने के लिए शब्द लिखने के लिए पर्याप्त स्मार्ट थे? आपका ध्यान से सहेजा गया डेटा खो जाएगा। ;-)

+0

सही, मुझे लगता है कि यह सवाल है। क्या संकलक को ऐसा करने की अनुमति है या नहीं? – quinmars

+0

संकलक को ऐसा करने की अनुमति है। मैंने अपना गलत उत्तर अपडेट करने के लिए इसे अद्यतन किया है और इसे ऊपर उठाया है। –

+0

@MarkW, ओह, जानना अच्छा है। धन्यवाद! – quinmars

1

ऐसा करने का एकमात्र कारण प्लगइन की तरह कुछ होगा जो अतिरिक्त डेटा संग्रहीत करने में होस्ट होस्ट को धोखा दे रहा है।

हालांकि ऐसा न करें, क्योंकि भविष्य में यह किसी बिंदु पर ब्रेक होगा, और यह सभी संबंधित लोगों के लिए गंभीर सिरदर्द होगा।

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

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