5

मैं कोड के इस टुकड़े है में शुरू नहीं किए गए चर का निर्धारण,कुलपति ++

#include <iostream> 

void foo(int *a) 
{ 
    std::cout<<*a<<std::endl; 
} 

int main() 
{ 
    int i; 
    foo(&i); 
} 

जो स्पष्ट है कि एक गैर-आरंभिकृत चर का इस्तेमाल किया जा रहा है।

मैंने /RTCu की कोशिश की है और साथ ही error C4700 पर भरोसा किया है, लेकिन उपरोक्त कोड के लिए, कंपाइलर इसे एक त्रुटि के रूप में फ़्लैग नहीं कर रहा है।

मैंने कोड विश्लेषण चलाने की भी कोशिश की, बिट कोड कोड के रूप में रिपोर्ट की गई कोई समस्या नहीं है।

तो हमारे स्रोत कोड में अनियमित चर निर्धारित करने का विश्वसनीय तरीका क्या है?

मुझे पता है valgrind यहां एक अद्भुत जॉब करता है लेकिन यह मेरे लिए एक विकल्प नहीं है क्योंकि मेरे पास विंडोज एपीआई और एमएफसी के लिए बहुत सी कॉल हैं।

+2

यह आपके लिए "स्पष्ट" है लेकिन संकलक के लिए नहीं: आप एक सूचक संकेत के माध्यम से चर (एक इनलाइन) फ़ंक्शन को पास करते हैं (ध्यान दें कि फ़ंक्शन इनलाइन बनाना और इनलाइनिंग सक्षम करना जीसीसी के साथ चेतावनी को ट्रिगर करता है)। अब, कोई जवाब नहीं, लेकिन पहली जगह में अनियमित चर को परिभाषित क्यों करें? समस्याओं से बचने का एक आसान तरीका यह है कि इसे परिभाषित करते समय हमेशा एक वैरिएबल प्रारंभ करना है (जिसका अर्थ यह है कि इसे तब तक परिभाषित नहीं किया जाता जब तक आप इसे प्रारंभ नहीं कर सकते)। –

+0

@gx_: मैं अनियमित चर को परिभाषित नहीं कर रहा हूं लेकिन संभावित मुद्दों के लिए कोड बेस को स्वच्छ कर रहा हूं। इसके अलावा मैं असहमत हूं कि यह आपके लिए स्पष्ट है लेकिन संकलक के लिए नहीं। मेरे बिंदु को साबित करने के लिए मुझे उपरोक्त कोड आधार पर वालग्रिंड चलाने और इसकी प्रतिक्रिया निर्धारित करना है। – Abhijit

+0

उत्तर के लिए धन्यवाद (मुझे "मेरा कोड नहीं" पर संदेह था, लेकिन इसे सटीक करने के लिए कुछ भी लागत नहीं है)। लेकिन मैं बनाए रखता हूं, यह स्पष्ट रूप से संकलक के लिए _not_ स्पष्ट नहीं है; अगर यह था तो यह चेतावनी देगा ('foo' इनलाइन बनाएं और _then_ यह कंपाइलर के लिए स्पष्ट हो जाता है)। इसके अलावा valgrind एक कंपाइलर नहीं है और न ही एक स्थिर विश्लेषण उपकरण है लेकिन एक _dynamic_ चेकर है। –

उत्तर

1

एक कंपाइलर के लिए अविश्वसनीय चर के सभी मामलों को निर्धारित करने का कोई विश्वसनीय तरीका नहीं है। Valgrind (और इस तरह के अन्य उपकरण) कंपाइलर नहीं हैं, लेकिन गतिशील विश्लेषण उपकरण, जैसे उपयोगकर्ता जीएक्स ऊपर कहा गया। स्थिर विश्लेषण उपकरण भी हैं जो प्रारंभिक चर के उपयोग के कई मामलों का पता लगा सकते हैं। लेकिन आमतौर पर संकलक उन विशेष उपकरणों के लिए कोई मेल नहीं होते हैं।

1

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

+0

कवरिटी (कम से कम मेरे सेटअप पर) इसे या तो नहीं मिला। स्पष्ट रूप से विश्लेषण की कार्य-गहराई बहुत सीमित है। अनियमित चर के अन्य मामलों में, संकलन प्रक्रिया आमतौर पर इसे पकड़ती है, इसलिए हो सकता है कि वे उस पर भरोसा कर रहे हों। दिलचस्प मामला, अनुमान लगाया नहीं होगा। – dwn

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