2016-12-07 4 views
6

मैं सभी बड़े और पुराने कोड बेस में सभी स्थानों को खोजने की कोशिश कर रहा हूं जहां कुछ रचनाकार या कार्य कहा जाता है। विशेष रूप से, ये कुछ रचनाकार और सदस्य कार्य std::string वर्ग (यानी, basic_string<char>) में हैं। उदाहरण के लिए, मान लीजिए कोड की एक पंक्ति है:।मैं G ++ कोड में दिए गए सदस्य फ़ंक्शन या सीटीओआर को सभी स्थानों को कैसे ढूंढ सकता हूं?

std::string foo(fiddle->faddle(k, 9).snark); 

इस उदाहरण में, यह यह है कि snark को देखकर एक char * है, जो कि मैं क्या कर रहा हूँ में रुचि हो सकता है स्पष्ट नहीं है

इसे हल करने के प्रयास

मैंने जीसीसी की कुछ डंप सुविधाओं को देखा है, और उनमें से कुछ उत्पन्न किए हैं, लेकिन मुझे कोई भी ऐसा नहीं मिला है जो मुझे बताएगा कि कोड की दी गई पंक्ति string कन्स्ट्रक्टर कोपर कॉल करने के लिए कॉल करें। मैंने जनरेटेड समकक्ष असेंबली कोड को सहेजने के लिए कुछ कोड भी संकलित किए हैं। लेकिन यह दो चीजों से ग्रस्त है: फ़ंक्शन नाम "उलझन में हैं," इसलिए यह जानना असंभव है कि सी ++ शब्दों में क्या कहा जा रहा है; और किसी भी प्रकार की कोई लाइन संख्या नहीं है, इसलिए स्रोत फ़ाइल में समकक्ष जगह भी खोजना कठिन होगा।

प्रेरणा और पृष्ठभूमि

अपने प्रोजेक्ट में, हम एक बड़े, पुराने कोड HP-UX (और उनके एसीसी सी ++ संकलक) से RedHat Linux और जीसीसी/जी ++ v.4.8.5 के आधार पोर्टिंग रहे हैं । हिमाचल प्रदेश उपकरण श्रृंखला एक एक NULL सूचक के साथ एक string प्रारंभ करने की अनुमति दी, एक खाली स्ट्रिंग के रूप में यह इलाज। जीएनयू टूल्स 'जेनरेट कोड एक शून्य ड्रेफरेंस त्रुटि के कुछ स्वाद के साथ विफल रहता है। तो हमें इसके सभी संभावित मामलों को खोजने की जरूरत है, और उन्हें उपाय करें। (उदाहरण के लिए, NULL की जांच करने के लिए कोड जोड़कर और "" स्ट्रिंग के लिए पॉइंटर का उपयोग करके।)

इसलिए यदि किसी को भी मूल समस्या से निपटना पड़ा है और अन्य सुझाव भी दे सकते हैं, तो भी, स्वागत किया जाना चाहिए।

+0

बाहर समारोह आप शायद तुम एक वैश्विक कर सकता है –

+0

देखने के लिए कोशिश कर रहे हैं के लिए घायल नाम कार्य 'अपने स्वयं के कुछ वर्ग के लिए बदलने के लिए std :: स्ट्रिंग' और' स्ट्रिंग' खोज एवं प्रतिस्थापन उसके बाद उस संदेश को लॉग ऑन किया जाएगा जब उस विशेष कन्स्ट्रक्टर को –

+2

कहा जाता है फ़ंक्शन का नाम बदलें/कन्स्ट्रक्टर के पैरामीटर को बदलें, सबकुछ पुनः संकलित करें, और कंपाइलर को आपके लिए ढूंढें। –

उत्तर

0

सबसे पहले मैं इस प्रकार से हैडर बनाएंगे:

#include <string> 

class dbg_string : public std::string { 
public: 
    using std::string::string; 
    dbg_string(const char*) = delete; 
}; 

#define string dbg_string 

फिर अपने makefile को संशोधित करने और संशोधन के बिना प्रत्येक स्रोत फ़ाइल पर CFLAGS में जोड़ें "-include dbg_string.h" मजबूर करने के लिए शामिल हैं।

तुम भी जांच कर सकता है कि कैसे शून्य अपने मंच पर परिभाषित किया गया है और इसके लिए विशिष्ट अधिभार जोड़ने (जैसे। Dbg_string (int))।

+0

सुपर हैकी, लेकिन बहुत ही रोचक और रचनात्मक है। – Alex

1

आप स्थिर विश्लेषण का उपयोग पर विचार किया है?

बजना एक कहा जाता बजना विश्लेषक कि एक्स्टेंसिबल है।

आपको लगता है कि एक बजना ast आगंतुक कि स्ट्रिंग चर घोषणाओं और यह शून्य पर स्थापित करने के लिए जांच के लिए लग रहा है को लागू करने से इस विशेष व्यवहार के लिए जाँच करता है एक कस्टम प्लगइन लिख सकते हैं।

कि here के लिए एक मैनुअल है।

यह भी देखें: https://github.com/facebook/facebook-clang-plugins/blob/master/analyzer/DanglingDelegateFactFinder.cpp

0

आप जहां कुछ contructors/तरीकों/क्षेत्रों/प्रकार उपयोग किया जाता है पता लगाने के लिए CppDepend कोशिश कर सकते हैं और उसके CQLinq एक शक्तिशाली कोड क्वेरी भाषा।

from m in Methods where m.IsUsing ("CClassView.CClassView()") select new { m, m.NbLinesOfCode } 
संबंधित मुद्दे

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