दिलचस्प पोस्ट
एंड्रॉइड 4 ब्राउज़र का प्रयोग करके ऑटोस्टार्ट एचटीएमएल 5 वीडियो Java.lang.NoClassDefFoundError को हल करने के लिए कैसे करें: जावा 9 में javax / xml / bind / jAXBException कोड में बहुत धीमी सवाल है लेकिन एसएसएमएस में तेजी क्या आप नाम या टुकड़ों के द्वारा संलग्न () या कॉल चर का उपयोग करते हैं? matplotlib मेरे चित्र प्रदर्शित नहीं करता है हालांकि मैं pyplot.show () संयोजन स्प्रिंग प्रोजेक्ट और जर्सी एएसपी.NET मल्टीथ्रेड क्या है? डेटाबेस अनुरोध बनाने के लिए धागे का उपयोग करना एक दृश्य प्रोग्राम के लिए एक से अधिक बटन जोड़ें, उसी विधि को कॉल करें, यह निर्धारित करें कि कौन सा बटन था विज़ुअल स्टूडियो 2010 हमेशा सोचता है कि परियोजना पुरानी है, लेकिन कुछ भी नहीं बदला है मैं ओएस और ब्राउज़र जैसे क्लाइंट इन्फॉर्मेशन कैसे प्राप्त कर सकता हूं दिनांक ऑब्जेक्ट को कैलेंडर ऑब्जेक्ट में परिवर्तित करना एक नकारात्मक बदलाव संख्या के साथ वाम स्थानांतरण एक घंटा तत्व का रंग बदलना अजगर बाध्य और अनबाउंड विधि ऑब्जेक्ट

पूरी तरह से और वर्बोज जी ++ चेतावनियां सक्षम करने के लिए झंडे

अक्सर gcc तहत सी में, मैं चेतावनी झंडे के निम्न सेट से शुरू करूँगा (कई स्त्रोतों से दर्दपूर्वक इकट्ठा किया गया):

 -Wall -Wextra -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast \ -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Winline -Wundef \ -Wnested-externs -Wcast-qual -Wshadow -Wwrite-strings -Wno-unused-parameter \ -Wfloat-equal -pedantic -ansi 

मैं चेतावनियों के इस सेट के साथ (कम से कम मेरे डीबग संस्करण) का निर्माण करूँगा और सबकुछ ठीक से (आमतौर पर सब कुछ) कर सकता हूँ, और फिर केवल झंडों को हटा दें यदि वे या तो प्रासंगिक नहीं हैं या ठीक नहीं हैं (लगभग कभी भी नहीं)। कभी-कभी, मैं भी -Werror अगर मुझे संकलन करते समय दूर जाना होगा

मैं बस सी ++ उठा रहा हूं (हाँ, मैं समय से 15 साल पीछे हूं), और मैं दाहिने पैर पर शुरू करना चाहता हूं।

मेरा प्रश्न यह है कि क्या किसी के पास g++ तहत सी ++ के लिए पूर्ण चेतावनी झंडे का एक समान सेट है? (मैं जानता हूं कि उनमें से बहुत से एक ही होंगे।)

वेब के समाधान से एकत्रित समाधान "पूरी तरह से और वर्बोज जी ++ चेतावनियां सक्षम करने के लिए झंडे"

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

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused

संदिग्ध चेतावनी जो मौजूद हैं:

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

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

  • -Wfloat-equal सुरक्षित समानता के लिए चेतावनी देता है (विशेष रूप से, -1 के गैर-गणना मूल्य के साथ तुलना)। मेरे कोड का एक उदाहरण जहां मैं इसका उपयोग करता हूं, मेरे पास फ्लोट का एक सदिश है। मैं इस सदिश के माध्यम से जाता हूं, और कुछ तत्व हैं जो मैं अभी तक उनका मूल्यांकन नहीं कर सकता, इसलिए मैं उन्हें -1.0 एफ में सेट करता हूं (चूंकि मेरी समस्या केवल सकारात्मक संख्या का उपयोग करती है, -1 डोमेन से बाहर है)। मैं बाद में आगे बढ़ता हूं और -1.0f मान अद्यतन करता हूं। यह ऑपरेशन की एक अलग विधि के लिए खुद को आसानी से उधार नहीं करता है। मुझे संदेह है कि ज्यादातर लोगों को इस समस्या नहीं है, और अस्थायी बिंदु में एक सटीक संख्या की तुलना शायद एक त्रुटि है, इसलिए मैं इसे डिफ़ॉल्ट सूची में शामिल कर रहा हूँ

  • -Wold-style-cast में लायब्रेरी कोड में बहुत से झूठी सकारात्मकताएं हैं I का उपयोग कर रहा हूँ विशेष रूप से, नेटवर्किंग में उपयोग किए जाने वाले फ़ंक्शन का हंटल परिवार, साथ ही साथ राइजेलल (एईएस) एन्क्रिप्शन कार्यान्वयन का उपयोग कर रहा हूं, जिसमें पुरानी शैली वाली डाट है, जो मुझे इस बारे में चेतावनी देती है मैं इन दोनों को बदलने का इरादा रखता हूं, लेकिन मुझे यकीन नहीं है कि मेरे कोड में कुछ भी ऐसा है, जो इसके बारे में शिकायत करेगा। अधिकांश उपयोगकर्ताओं को संभवतः इस पर डिफ़ॉल्ट रूप से होना चाहिए, यद्यपि।

  • -Wsign-conversion एक मुश्किल था (और लगभग सूची नहीं बना) इसे अपने कोड में बदलकर बड़ी चेतावनी (100+) उत्पन्न हुई उनमें से लगभग सभी निर्दोष थे। हालांकि, मुझे यकीन है कि जहां भी मुझे यकीन नहीं था, हस्ताक्षर किए इंटिजर्स का उपयोग करने के लिए सावधान रहे हैं, हालांकि मेरे विशेष समस्या डोमेन के लिए, मुझे आमतौर पर बड़ी संख्या में पूर्णांक प्रभाग के कारण अहस्ताक्षरित मूल्यों के कारण मामूली दक्षता में वृद्धि होगी। मैंने इस दक्षता का बलिदान किया क्योंकि मैं गलती से एक हस्ताक्षरित पूर्णांक को एक अहस्ताक्षरित और फिर विभाजित करने के बारे में चिंतित था (जो अतिरिक्त नहीं है, इसके अलावा, घटाव, और गुणन के विपरीत)। इस चेतावनी को चालू करने से मुझे अहसासपूर्ण प्रकारों में से अधिकांश को मेरे चर को सुरक्षित रूप से परिवर्तित करने की इजाजत मिली और कुछ अन्य जगहों पर कुछ डाली जोड़ दी गई। यह वर्तमान में थोड़ा मुश्किल है क्योंकि चेतावनी स्मार्ट नहीं है उदाहरण के लिए, यदि आप unsigned short + (integral constant expression) , तो उस परिणाम पर अंतर को int के लिए प्रोत्साहित किया जाता है यह तब संभावित चेतावनी समस्या के बारे में चेतावनी देता है यदि आप उस मान को unsigned या unsigned short करने के लिए निर्दिष्ट करते हैं, हालांकि यह सुरक्षित है यह निश्चित रूप से लगभग सभी उपयोगकर्ताओं के लिए सबसे वैकल्पिक चेतावनी है

  • -Wsign-promo : देखें -Wsign-conversion

  • -Wswitch-default बेकार लगता है (यदि आप स्पष्ट रूप से सभी संभावनाओं को एन्यूमरेट करते हैं तो आप हमेशा एक डिफ़ॉल्ट केस नहीं चाहते हैं) हालांकि, इस चेतावनी को चालू करना कुछ ऐसा लागू कर सकता है जो शायद एक अच्छा विचार है। उन मामलों के लिए जहां आप स्पष्ट रूप से सूचीबद्ध संभावनाओं को छोड़कर सब कुछ को अनदेखा करना चाहते हैं (लेकिन अन्य नंबर संभव है), तो default: break; इसे स्पष्ट करने के लिए यदि आप सभी संभावनाओं को स्पष्ट रूप से बताते हैं, तो इस चेतावनी को चालू करने से यह सुनिश्चित करने में मदद मिलेगी कि आप निश्चित रूप से कुछ गलत तरीके से डालते हैं (यह सुनिश्चित करने के लिए) कि आपने वास्तव में सभी संभव विकल्प शामिल कर लिए हैं यह आपको स्पष्ट करता है कि आपकी समस्या के डोमेन क्या है और प्रोग्रामैटिक रूप से इसे लागू करता है। हालांकि, आपको हर जगह झुकाव में झूठ बोलने में सावधान रहना होगा। यह डिफ़ॉल्ट केस के साथ कुछ भी करने से बेहतर है, लेकिन सामान्य रूप से दावा करते हुए, यह रिलीज़ बिल्ड में काम नहीं करेगा दूसरे शब्दों में, आप उन नंबरों को मान्य करने के लिए उस पर भरोसा नहीं कर सकते हैं जो आपको मिलते हैं, कहते हैं, एक नेटवर्क कनेक्शन या एक डेटाबेस जो आपके पास पूर्ण नियंत्रण नहीं है अपवाद या जल्दी लौटने के लिए यह संभाल करने का सबसे अच्छा तरीका है (लेकिन फिर भी आपको एक डिफ़ॉल्ट केस होने की आवश्यकता है!)।

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

फिर चेतावनी का एक सेट है जो उपर्युक्त सूची में शामिल नहीं है क्योंकि मुझे ये उपयोगी नहीं मिले हैं यह चेतावनी और मेरी टिप्पणियां हैं कि मैं उन्हें डिफ़ॉल्ट सूची में शामिल क्यों नहीं कर रहा हूं:

चेतावनी जो अनुपस्थित हैं:

  • -Wabi की जरूरत नहीं है क्योंकि मैं अलग-अलग कंपाइलर से -Wabi का संयोजन नहीं कर रहा हूं। मैंने वैसे भी इसके साथ संकलन करने की कोशिश की, और यह ट्रिगर नहीं किया, इसलिए यह बेकार की बात नहीं है।

  • -Waggregate-return कुछ ऐसा नहीं है, जिसे मैं त्रुटि मानता हूं। उदाहरण के लिए, कक्षाओं के वेक्टर पर लूप के लिए एक श्रेणी-आधारित श्रेणी का उपयोग करते समय यह ट्रिगर होता है रिटर्न वैल्यू ऑप्टिमाइजेशन को इसके किसी भी नकारात्मक प्रभाव का ध्यान रखना चाहिए।

  • -Wconversion इस कोड पर ट्रिगर करता है: short n = 0; n += 2; short n = 0; n += 2; इंटर्न के लिए अंतर्निहित रूपांतरण एक चेतावनी का कारण बनता है जब यह उसके लक्ष्य प्रकार में वापस परिवर्तित हो जाता है।

  • -Weffc++ एक चेतावनी भी शामिल है अगर प्रारंभिक सूची में सभी डेटा सदस्यों को आरंभ नहीं किया गया है। मैं जानबूझ कर कई मामलों में ऐसा नहीं करता, इसलिए सावधानियों का सेट उपयोगी होने के लिए बरबाद हो गया है। हर बार एक-दूसरे को चालू करने और अन्य चेतावनियों के लिए स्कैन करने में सहायक होता है, हालांकि (जैसे कि बेस क्लास के गैर-वर्चुअल डिस्ट्रक्टर्स)। यह अपने स्वयं के एक चेतावनी के बजाय चेतावनियों का संग्रह (जैसे -Wall ) के रूप में अधिक उपयोगी होगा।

  • -Winline अनुपस्थित है क्योंकि मैं ऑप्टिमाइज़ेशन प्रयोजनों के लिए इनलाइन कीवर्ड का उपयोग नहीं करता, केवल हेडर में फ़ंक्शंस इनलाइन को परिभाषित करने के लिए। मुझे कोई परवाह नहीं है कि अनुकूलक वास्तव में इसे लिखेगा यह चेतावनी भी शिकायत करती है कि यह किसी वर्ग निकाय (जैसे खाली वर्चुअल डिस्ट्रक्टर) में घोषित फ़ंक्शन को इनलाइन नहीं कर सकता है।

  • -Winvalid-pch अनुपलब्ध है क्योंकि मैं precompiled हेडर का उपयोग नहीं करते

  • -Wmissing-format-attribute का उपयोग नहीं किया जाता क्योंकि मैं gnu एक्सटेंशन का उपयोग नहीं करता वही -Wsuggest-attribute और कई अन्य

  • इसकी अनुपस्थिति के लिए संभाव्य रूप से उल्लेखनीय है -Wno-long-long , जिसके लिए मुझे कोई ज़रूरत नहीं है। मैं -std=c++0x ( -std=c++11 जीसीसी -std=c++11 में -std=c++11 ) के साथ संकलित, जिसमें long long पूर्णांक प्रकार शामिल हैं -std=c++11 जिन लोगों ने सी ++ 98 / सी +0 03 पर वापसी की थी, वे चेतावनी सूची से अपवर्जन को जोड़ने पर विचार कर सकते हैं।

  • -Wnormalized=nfc पहले से ही डिफ़ॉल्ट विकल्प है, और सबसे अच्छी लगती है।

  • -Wpadded कक्षाओं के लेआउट को अनुकूलित करने के लिए कभी-कभी चालू होता है, पर यह नहीं छोड़ा जाता क्योंकि सभी वर्गों के अंत में पैडिंग हटाने के लिए पर्याप्त तत्व नहीं होते हैं। सिद्धांत में मुझे 'मुफ्त' के लिए कुछ अतिरिक्त चर मिल सकता है, लेकिन यह बनाए रखने के अतिरिक्त प्रयास के लायक नहीं है (यदि मेरा वर्ग आकार बदलता है, तो उन पहले फ्री वेरिएबल को निकालना आसान नहीं है)।

  • -Wstack-protector का उपयोग नहीं किया जाता क्योंकि मैं -fstack-protector उपयोग नहीं करता

  • -Wstrict-aliasing=3 चालू है -Wall और सबसे सटीक है, लेकिन यह स्तर 1 और 2 जैसा दिखता है और अधिक चेतावनियां देता है। सिद्धांत में एक निचला स्तर 'मजबूत' चेतावनी है, लेकिन यह अधिक झूठी सकारात्मक की कीमत पर है। मेरा खुद का परीक्षण कोड सभी 3 स्तरों के तहत ठीक से संकलित हुआ।

  • -Wswitch-enum ऐसा व्यवहार नहीं है जिसे मैं चाहता हूं। मैं स्पष्ट रूप से हर स्विच स्टेटमेंट को संभालना नहीं चाहता हूं यह उपयोगी होगा यदि भाषा में निर्दिष्ट स्विच स्टेटमेंट पर यह सक्रिय करने के लिए कुछ तंत्र था (यह सुनिश्चित करने के लिए कि भविष्य में होने वाले बदलावों को हर जगह संभाला जा सके, जो कि उन्हें होना चाहिए), लेकिन यह "सभी-या-कुछ" सेटिंग के लिए अधिक है।

  • -Wunsafe-loop-optimizations बहुत अधिक नकली चेतावनी का कारण बनता है यह एक समय-समय पर लागू करने और परिणामों को मैन्युअल रूप से सत्यापित करने के लिए उपयोगी हो सकता है। एक उदाहरण के रूप में, यह मेरे कोड में यह चेतावनी उत्पन्न हुई जब मैंने वेक्टर में सभी तत्वों को उनके कार्यों के एक सेट को लागू करने के लिए loop (रेंज-आधारित लूप का उपयोग करके) पर रोका। यह भी एक const std :: constring (जहां यह उपयोगकर्ता कोड में कोई पाश नहीं है) की एक निश्चित सरणी के कन्स्ट्रक्टर के लिए चेतावनी है।

  • -Wzero-as-null-pointer-constant -Wuseless-cast जीसीसी -Wuseless-cast -केवल चेतावनियां हैं, जब मैं जीसीसी 4.7 में संक्रमण के बाद -Wuseless-cast

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

संपादित करें: ऐसा लगता है कि मैंने कई याद किया था (जो मैंने अब में जोड़ा है)। वास्तव में http://gcc.gnu.org पर एक दूसरा पृष्ठ है जो काफी अच्छी तरह छिपा हुआ है। सामान्य चेतावनी विकल्प और सी + + विकल्प (चेतावनियों के लिए नीचे स्क्रॉल करें)

डी ओह, मेरी सभी मूल खोजों में 99% पदों की चेतावनियों को दबाने के बारे में बताया गया है (अजीब पर्याप्त), लेकिन मैंने इस टिप्पणी में बस भागा, जिसमें झंडे के इस सुंदर सेट (कुछ कम प्रासंगिक) हैं:

क्रॉस के साथ चेक किया गया:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

 -g -O -Wall -Weffc++ -pedantic \ -pedantic-errors -Wextra -Waggregate-return -Wcast-align \ -Wcast-qual -Wconversion \ -Wdisabled-optimization \ -Werror -Wfloat-equal -Wformat=2 \ -Wformat-nonliteral -Wformat-security \ -Wformat-y2k \ -Wimplicit -Wimport -Winit-self -Winline \ -Winvalid-pch \ -Wlong-long \ -Wmissing-field-initializers -Wmissing-format-attribute \ -Wmissing-include-dirs -Wmissing-noreturn \ -Wpacked -Wpadded -Wpointer-arith \ -Wredundant-decls \ -Wshadow -Wstack-protector \ -Wstrict-aliasing=2 -Wswitch-default \ -Wswitch-enum \ -Wunreachable-code -Wunused \ -Wunused-parameter \ -Wvariadic-macros \ -Wwrite-strings 

तो, मुझे लगता है कि यह एक अच्छा प्रारंभिक बिंदु है। नहीं पता था कि यह एक धोखा था, लेकिन कम से कम यह गहराई से दफनाया गया था। 🙂

उनमें से कुछ पहले से ही शामिल -Wall या -Wextra

सी के लिए एक अच्छा आधार सेटअप है:

-std=c99 -pedantic -Wall -Wextra -Wwrite-strings -Werror

और सी ++ के लिए

-ansi -pedantic -Wall -Wextra -Weffc++

( -Werror सी ++ के लिए -Weffc++ कुछ नाराज़गी है)

प्रयत्न

 export CFLAGS="`gcc --help=warnings | grep '\-W' | awk '{print $1 \" \"}' | sort | uniq` -pedantic -fdiagnostic-show-option -Werror" 

यह एक त्वरित और गंदे शुरुआत है जो निश्चित रूप से कुछ ट्यूनिंग की आवश्यकता होगी; एक बात के लिए, भले ही आप कंपाइलर को अपनी भाषा के लिए उपयुक्त नाम से (जैसे C ++ के लिए जी ++) कहते हैं, तो आपको चेतावनियां मिलेंगी जो उस भाषा पर लागू न हों (और कंपाइलर उसके हाथों को फेंकने और जारी रखने से इंकार करेगा जब तक आप चेतावनी को हटा दें)।

एक और बात यह है कि मैंने आतंक में जोड़ा, क्योंकि अगर आप चेतावनियों को ठीक नहीं कर रहे हैं, तो आप उन्हें क्यों बदलते हैं? आप सूची के बाहर चेतावनियां भी ले सकते हैं (उदाहरण के लिए, मैं लगभग कभी -Waggregate-return कभी उपयोग नहीं -Waggregate-return C ++ के साथ -Waggregate-return )।

कुछ चेतावनियां अन्य प्रदर्शन संबंधित विकल्पों ( -Wstack-protector ) के बिना कुछ भी नहीं करतीं -fdiagnostic-show-option और जीसीसी मैनुअल आपके मित्र हैं।

बीटीडब्ल्यू, कुछ चेतावनी परस्पर अनन्य हैं; विशेष रूप से -Wtraditional और -Wold-style-definition -Werror के साथ-साथ, संकलन नहीं करेगा।