मुझे लगता है कि, सही परिस्थितियों में, आप इसके लिए यूबी के साथ समाप्त हो सकते हैं। मैं जो सोच रहा हूं वह यह है कि जहां आपके पास ईसीसी या समानता जांच के साथ स्मृति है, जहां ईसीसी/समानता बिट स्मृति को लिखकर सेट किया गया है। यदि स्मृति के एक ब्लॉक का उपयोग पहले कभी नहीं किया गया था [कभी भी एटी पर नहीं लिखा गया], और आप पैडिंग फ़ील्ड में अनियमित बाइट्स पढ़ते हैं, तो यह एक ईसीसी/समानता त्रुटि का कारण बन सकता है जब स्मृति जो कभी नहीं लिखी गई है पढ़ा जा रहा है।
बेशक, एक ऐसी प्रणाली में, आप दर्द की एक पूरी ढेर बस एक बूट के दौरान कुछ बिंदु पर "सभी स्मृति को भरने" करके, से बचने चाहते हैं, क्योंकि यह illagel क्या करना होगा:
struct Blob
{
uint32_t n;
uint8_t c;
};
Blob *b = malloc(sizeof(Blob)*10);
for(int i = 0; i < 10; i++)
{
b[i].n = i;
b[i].c = i;
}
...
Blob a[3];
memcpy(a, &b[1], sizeof(a)); // Copies 3 * Blob objects, including padding.
अब, चूंकि बी [x] के सभी बिट्स सेट नहीं किए गए हैं, इसलिए यह समानता/ईसीसी त्रुटियों के कारण, memcpy में डेटा की प्रतिलिपि बनाने में विफल हो सकता है। वह बहुत बुरा होगा। लेकिन साथ ही, कंपाइलर को सभी पैडिंग क्षेत्रों को "सेट" करने के लिए मजबूर नहीं किया जा सकता है।
मेरा निष्कर्ष यह है कि यह यूबी है, लेकिन जब तक विशेष परिस्थितियां न हों तब तक समस्याएं उत्पन्न होने की संभावना नहीं है। निश्चित रूप से, आप उपरोक्त प्रकार के memcpy
कोड को बहुत सारे कोड में देखेंगे।
स्रोत
2013-02-06 21:07:32
चूंकि यह एक बहुत ही नियम-लेविरी प्रश्न है, मुझे यकीन नहीं है कि अंतिम जवाब क्या होगा। मुझे संदेह है कि इसे परिभाषित किया जाएगा (जब तक uint8_t * हस्ताक्षरित char * है), लेकिन शुरुआती मानों को अनिर्दिष्ट छोड़ दिया जाएगा, जैसे कि किसी भी अन्य सदस्य चर को अनियंत्रित छोड़ दिया गया है। अब, यदि आप विनिर्देश उद्धरण चाहते हैं, तो मैं उसे देखने के लिए अधिक समय के साथ किसी को छोड़ देता हूं :) –
मुझे लगता है कि 'uint32_t' को 'sizeof (uint32_t)' के साथ गठबंधन किया गया है। – StackedCrooked
@ पीटर जी: 'आकार (ब्लॉब) 'मानक से कम से कम 5 होना आवश्यक है। चूंकि' uint8_t' मौजूद है, इसलिए यह' CHAR_BIT == 8' और इसलिए 'sizeof (uint32_t) == 4' है। यह तब संरेखण का मामला है कि 'आकार (ब्लॉब) '5 या 8 है। इसे 6 या 7 –