2015-08-20 12 views
5

के माध्यम से फ़ंक्शन परिभाषाओं (सी ++) को ढूँढना और संशोधित करना वर्तमान में मैं काफी बड़ी परियोजना पर काम कर रहा हूं। हमारे कोड की गुणवत्ता को बढ़ाने के लिए, हमने प्रत्येक फ़ंक्शन के लिए रिटर्न वैल्यू (त्रुटि कोड) के ट्रेमेंट को लागू करने का निर्णय लिया। जीसीसी किसी फ़ंक्शन के रिटर्न वैल्यू से संबंधित चेतावनी का समर्थन करता है, हालांकि फ़ंक्शन परिभाषा को निम्नलिखित ध्वज से पहले किया जाना चाहिए।बैश-स्क्रिप्ट

static __attribute__((warn_unused_result)) ErrorCode test() { /* code goes here */ } 

मैं एक bashscript कि पूरे स्रोत कोड पार्स करके मामले

__attribute__((warn_unused_result)) 

याद आ रही है में एक चेतावनी जारी करता लागू करना चाहते हैं। ध्यान दें कि इस तरह के संशोधन की आवश्यकता वाले सभी कार्यों को त्रुटि कोड कहा जाता है। क्या आपको लगता है कि यह एक बैश स्क्रिप्ट के माध्यम से संभव है?

+0

मैं सुझाव है कि आप एक बजना प्लगइन के रूप में यह लिखने पर विचार करें। मैंने एक प्लगइन लिखा जो प्रतीक उपयोग का विश्लेषण करता है और बेकार के बारे में चेतावनी देता है जिसमें कोड की लगभग 350 लाइनें शामिल हैं, इसलिए यह विशेष रूप से कठिन नहीं है। –

उत्तर

3

एक आसान तरीका जिसे मैं कल्पना कर सकता हूं ctags के माध्यम से है। आप अपने सभी स्रोत कोड पर एक टैग फ़ाइल बनाते हैं, और फिर टैग फ़ाइल को पार्स करते हैं। हालांकि, मुझे टैग फ़ाइल के प्रारूप के बारे में बिल्कुल यकीन नहीं है। मैं जिस संस्करण का उपयोग कर रहा हूं (एक्सबेरेंट सीटैग 5.8) चौथे कॉलम में "f" लगाता है, अगर टैग फ़ंक्शन का प्रतिनिधित्व करता है। तो इस मामले में मैं awk का उपयोग उन सभी टैगों को फ़िल्टर करने के लिए करता हूं जो कार्यों का प्रतिनिधित्व करते हैं, और फिर __attribute__((warn_unused_result)) के बिना सभी लाइनों को फेंकने के लिए grep।

तो, संक्षेप में, पहले आप

$ ctags **/*.c 

यह एक फ़ाइल "टैग" मौजूदा निर्देशिका में कहा जाता है बनाता है। आपके संस्करण के आधार पर आदेश ctags-exuberant भी हो सकता है। **/*.c एक ग्लोब पैटर्न है जो आपके खोल में काम कर सकता है - अगर ऐसा नहीं होता है, तो आपको अपनी स्रोत फ़ाइलों को किसी अन्य तरीके से आपूर्ति करना होगा (ctags विकल्प देखें)।

तो फिर तुम funktions फिल्टर करें:

$ cat tags | awk -F '\t' '$4 == "f" {print $0}' | grep -v "__attribute__((warn_unused_result))" 
+0

मैंने इसे देखा और यह काफी आशाजनक प्रतीत होता है। हालांकि मैं जो कह सकता हूं उससे, इस विधि को किसी फ़ंक्शन के रिटर्न वैल्यू के प्रकार की परवाह नहीं है। हालांकि, मैं केवल वापसी मूल्य के साथ कार्यों का इलाज करना चाहता हूं त्रुटि कोड –

+0

आह, क्षमा करें, मुझे आपके प्रश्न में याद आया। तो, आपको नियमित अभिव्यक्तियों के साथ थोड़ा सा खेलना होगा। पहला प्रयास ऐसा दिख सकता है: 'बिल्ली टैग | awk -F '\ t' '$ 4 == "f" {प्रिंट $ 3}' | grep '। * त्रुटि कोड। * (' 'ध्यान दें कि मैंने' awk' केवल प्रिंट कॉलम '$ 3' को छोड़ दिया है, जिसमें 'ctags' के मेरे संस्करण में फ़ंक्शन के लिए एक पैटर्न शामिल है। हालांकि, मुझे पूरा यकीन नहीं है कि यह विशेष मामलों में काम करता है, जैसे, जब रिटर्न का प्रकार फ़ंक्शन नाम की तुलना में एक अलग पंक्ति पर होता है। आपको इसके साथ थोड़ा सा खेलना चाहिए और परिणामों को नियंत्रित करना चाहिए। –

+1

बेकार काम करता है! अंगूठे ऊपर और बहुत बहुत धन्यवाद। –

1

नहीं, सामान्य मामले में यह संभव नहीं है। सी ++ व्याकरण उन सभी भाषाओं का सबसे जटिल है जो मुझे पता है, और सी ++ सामान्य मामले में नियमित अभिव्यक्तियों के माध्यम से पारदर्शी नहीं है। यदि आप अपने आप को बहुत ही सीमित उपयोगों तक सीमित करते हैं, तो आप सफल हो सकते हैं, लेकिन मुझे यकीन नहीं है कि यह आपके मामले में कितना व्यवहार्य है। मुझे यह भी नहीं लगता कि excerise प्रयास के लायक है, क्योंकि कभी-कभी फ़ंक्शन के परिणाम को अनदेखा करना ठीक है।

+0

यह जटिल नहीं है, यह एक बहुत सख्त भाषा है। – 123

+1

ठीक है, कुछ भी एक ही समय में बहुत सख्त और बहुत जटिल हो सकता है। जैसा कि मैंने पहले कहा था, एक सामान्य सी ++ कोड का regexp पार्सिंग संभव नहीं है। – SergeyA

+0

ctags के माध्यम से बनाई गई फ़ाइल को पार्स करना मेरे लिए काम करता है। इनस्पेस इनलाइन-फ़ंक्शंस, टेम्पलेट्स के साथ भी सौदों ... –

5

शायद आप नियमित अभिव्यक्तियों के साथ sed का उपयोग कर सकते हैं।

त्रुटि, कुछ खाली स्थान के, कुछ अक्षर या अंक (समारोह का नाम:

sed -r "s/ErrorCode\s+\w+\s*(.*)\s*\{/__attribute__((warn_unused_result)) \0/g" test.cpp 

आप regex से परिचित नहीं हैं, तो पैटर्न मूल रूप में तब्दील हो: परीक्षण फ़ाइलों की एक जोड़ी मैंने कोशिश की पर मेरे लिए काम किया निम्नलिखित), शायद कुछ सफेद जगह, खुले कोष्ठक, कुछ भी (तर्क), करीबी कोष्ठक, शायद कुछ सफेद जगह, खुली घुंघराले ब्रेस।

यदि यह पैटर्न पाया जाता है, तो यह __attribute__((warn_unused_result)) द्वारा उपसर्ग किया गया है। ध्यान दें कि यह केवल तभी काम करता है जब आप खुले घुंघराले ब्रेस को हमेशा तर्क के समान पंक्ति में डाल रहे हों और आपके फ़ंक्शन घोषणाओं में लाइन ब्रेक न हो।

+0

ओह, ठीक है, आप टेम्पलेट का उपयोग नहीं कर रहे हैं, है ना? मुझे एहसास है कि यह थोड़ा सा बेवकूफ़ है ... – Jonas

+0

धन्यवाद! मुझे लगता है कि मैं इसका इस्तेमाल कर सकता हूं। हालांकि, यह कई गलतियों को जन्म दे सकता है। मुझे जो मिला, उससे यह स्वचालित रूप से नामित घटनाओं को प्रतिस्थापित कर देगा। यह मेरे स्वाद के लिए थोड़ा कट्टर है। क्या कोई विकल्प है कि कमांड केवल उस लाइन और फ़ाइल को लौटाता है जहां एक प्रतिस्थापन संभवतः हो सकता है, जैसे कि मैं अभी भी तय कर सकता हूं कि यह करना है या नहीं? –

+0

आप regex से मेल खाने वाली सभी पंक्तियों को मुद्रित करने के लिए 'grep -E "त्रुटि कोड \ s + \ w + \ s * (। *) \ S * \ {" '{' 'कर सकते हैं। – Jonas