2015-12-07 10 views
5

मैं उबंटू 14.04 पर क्लैंग 3.7.0 के साथ मेमोरी सैनिटाइजर के साथ खेल रहा हूं। निम्नलिखित कोड पूरी तरह से काम करता है:मेमोरी सैनिटाइज़र

#include <cstdio> 

int main() { 
    double ans; 
    printf("Hello World: %f\n", ans); 

    return 0; 
} 

जब

clang++ -g -O1 -fsanitize=memory -fsanitize-memory-track-origins=2 -fomit-frame-pointer sanitize.cpp -o sanitize 

मैं एक त्रुटि उम्मीद कर रहा था के साथ संकलित। क्या मेमोरी सैनिटाइज़र इस तथ्य को पकड़ता है कि उत्तर शुरू नहीं हुआ था?

आपकी मदद के लिए धन्यवाद।

+0

char * को उत्तर बदलने का प्रयास करें! – Matt

+0

@ मैट: डब्ल्यूटीएफ? –

+0

किसी भी शोध की स्पष्ट कमी के कारण डाउनवॉटेड। –

उत्तर

5

क्लैंग संतति दस्तावेज से यह स्पष्ट है कि यह केवल गतिशील आवंटित स्मृति से प्रारंभिक मेमोरी रीड से संबंधित है। स्वचालित स्मृति sanitizer जांच का हिस्सा नहीं है।

+0

धन्यवाद। अब मैं समझता हूं कि मेरा सवाल बेवकूफ था क्योंकि इस प्रकार की जांच स्थैतिक रूप से की जा सकती है। – InsideLoop

0

वालग्रिंड मेमचेक अनियमित स्टैक मानों का पता लगाने का विकल्प हो सकता है।

वेलग्रिंड प्रलेखन:

एक ढेर ब्लॉक से होने वाले uninitialised मानों के लिए, Memcheck दिखाता है, जहां ब्लॉक आवंटित किया गया था। स्टैक आवंटन से उत्पन्न अनियमित मूल्यों के लिए, मेमचेक आपको बता सकता है कि कौन सा फ़ंक्शन मूल्य आवंटित करता है, लेकिन उससे अधिक नहीं - आमतौर पर यह आपको फ़ंक्शन के उद्घाटन ब्रेस का स्रोत स्थान दिखाता है। तो आपको ध्यान से जांच करनी चाहिए कि सभी फ़ंक्शन के स्थानीय चर ठीक से शुरू किए गए हैं।

संदर्भ: http://valgrind.org/docs/manual/mc-manual.html

1

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

-Wall -Wextra -pedantic 

आप कुछ गलत परिणामों की हो, केवल कड़ाई के बाद जाँच कि वे वास्तव में झूठे हैं, तो आप विशिष्ट चेतावनी निष्क्रिय कर सकते हैं। चेतावनी झंडे का उपयोग न करने का कोई कारण नहीं है। कुछ परियोजनाएं -Werror ध्वज का भी उपयोग करती हैं, सभी चेतावनियों को त्रुटियों में बदल देती हैं।

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