c - Why does Valgrind report "Invalid read of size 2"? -
स्ट्रेट आइटम {int a; }; Int main () {item * a = (item *) malloc (sizeof (आइटम)); आइटम * b = (आइटम *) मॉलोक (आकारफ (वस्तु)); लघु * सी = (लघु *) बी; सी + = 3; Memcpy (a, c, sizeof (int)); नि: शुल्क (क); नि: शुल्क (ख); वापसी 0; }
एको "आकार 2 के पढ़ने के लिए अमान्य" क्यों करता है? मुझे लगता है कि यह आकार 4 होना चाहिए।
वालग्रिंड से उदाहरण संदेश:
== 19134 == आकार 2 == 19134 == 0x4C2F7E0 पर पढ़ने के लिए: memcpy @ @ GLIBC_2.14 (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) == 19134 == द्वारा 0x400625: मुख्य (main.cpp: 19) == 19134 == पता 0x51fd096 ब्लॉक के बाद 2 बाइट्स है आकार 4 आवंटित == 19134 == 0x4C2AB80 पर: malloc (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) में == 19134 == 0x4005FC द्वारा: मुख्य (main.cpp: 16)
मुझे malloc () एक 2x2 एकल चैनल बनावट (4 बाइट्स / uint8_t
s)। मैंने मान लिया कि आवंटन बहुत छोटा था - प्रश्न में वास्तुकला पर शब्द का आकार 8 बाइट्स (64-बिट) है - इसलिए मैंने आवंटन दोगुना किया और वाल्ग्रिंड की शिकायतों को बंद कर दिया। चूंकि malloc ()
को गठबंधन माना जाता है, इसलिए मैं थोड़ा आश्चर्यचकित था (मुझे यकीन है कि ऐसा कुछ है जो विशेषज्ञों के लिए स्पष्ट होगा), लेकिन हो सकता है कि यह किसी और की मदद करे। अतिरिक्त आवंटित स्थान को उपयोग करने के लिए बाध्य नहीं है, यह सिर्फ वहां होना चाहिए।
... यह ठीक है, भले ही यह अंतर्दृष्टि न ला सके जीसीसी 4.9.1 (उबंटू 4.9.1-16ubuntu6) पर समस्या हुई।
Comments
Post a Comment