2009-10-21 9 views
9

मेरे पास एक बड़ा कोडबेस है जो gmtime और strtok जैसे कई असुरक्षित कार्यों का उपयोग करता है। कोडबेस के माध्यम से खोजने और इन थोकों को बदलने की कोशिश करने के बजाय, मैं संकलक को चेतावनी या त्रुटि को उत्सर्जित करना चाहता हूं जब इसे देखता है (रखरखाव डेवलपर्स को समस्या को हाइलाइट करने के लिए)। क्या यह जीसीसी के साथ संभव है?पुस्तकालय कार्यों को उनके स्रोत कोड को संशोधित किए बिना बहिष्कृत/अनुपयोगी के रूप में चिह्नित करना

मुझे पहले से ही __attribute__((deprecated)) पता है, लेकिन AFAIK मैं इसका उपयोग नहीं कर सकता क्योंकि मेरे पास हेडर फाइलों का नियंत्रण नहीं है, जहां इन कार्यों को घोषित किया गया है।

+0

यदि आप लाइब्रेरी स्रोत बदल सकते हैं: http://stackoverflow.com/questions/295120/c-mark-as-deprecated –

उत्तर

12

कस्टम शीर्षलेख deprecated.h बनाएं। वहां, अपने स्वयं के रैपर फ़ंक्शन बनाएं, deprecated_strtok() इत्यादि जो केवल strtok पर कॉल करें। __attribute__((deprecated)) वाले लोगों को चिह्नित करें। उन परिभाषाओं के नीचे, #define strtok deprecated_strtok। अंत में, -include deprecated.h

+0

एकमात्र चीज जो मुझे पसंद नहीं है वह है कि मुझे पूरे फ़ंक्शन हस्ताक्षर को दोहराना है, और एक ट्रांसक्रिप्शन त्रुटि (या जीसीसी/libc संस्करणों के बीच इंटरफ़ेस में मामूली परिवर्तन) रहस्यमय लिंक त्रुटियों का उत्पादन कर सकते हैं। हालांकि, इस रणनीति का उपयोग करके मैं सुझावों के लिए '__attribute __ ((बहिष्कृत)) 'और जनादेशों के लिए' #pragma जीसीसी जहर 'दोनों का उपयोग कर सकता हूं। – Tom

7

इसे एक स्रोत फ़ाइल में आज़माएं, हाल ही में एक जीसीसी के साथ इसे इन दोनों कार्यों का उपयोग करके डेवलपर्स से बचना चाहिए।

#pragma GCC poison gmtime 
#pragma GCC poison strtok 

इसका नकारात्मक पक्ष यह है कि यह केवल एक संकलन इकाई के लिए मान्य है। यदि आप प्रीकंपिल्ड हेडर का उपयोग करते हैं (जो आप निश्चित रूप से करते हैं यदि आपकी परियोजना बड़ी है), तो आप उन्हें वहां डाल सकते हैं। कम से कम इस समाधान में सिस्टम हेडर में सजावट समारोह घोषणाएं शामिल नहीं होती हैं और संकलन समय पर काम करती हैं।

जहर शायद थोड़ा मुश्किल है क्योंकि यह त्रुटियों का उत्पादन करता है और चेतावनी नहीं देता है। क्या कोई जानता है कि इसे कैसे कमजोर करना है? कम से कम यह फ़ंक्शन xxx नीति का उपयोग न करने के लिए एक अच्छा तरीका है।

+0

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

+0

क्या आपको यह सुनिश्चित करना है कि आप जहर प्रज्ञा का उपयोग करने के बाद कोई मानक शीर्षलेख शामिल न करें? या यह केवल फ़ंक्शन कॉल के लिए त्रुटि है और घोषणाओं में नहीं है? – bk1e

+0

जहरीला उपयोग और घोषणा दोनों पर प्रतिक्रिया करता है। इससे आप जिस बाधा का उल्लेख करते हैं उसे जोड़ता है। मैं इसे प्रीकंपिल्ड हेडर के अंत में उपयोग कर रहा हूं और वास्तव में इसके बारे में वास्तव में परवाह नहीं करता था। – jdehaan

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

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