जीसीसी की चेतावनियों को (शाब्दिक रूप से) कैसे चालू करें?


194

मैं सक्षम करना चाहता हूं - शाब्दिक रूप से - सभी चेतावनी जो कि जीसीसी के पास है। (आपको लगता है कि यह आसान होगा ...)

  • आपको लगता -Wallहै कि चाल हो सकती है, लेकिन नहीं! अभी भी जरूरत है -Wextra

  • आपको लगता -Wextraहै कि चाल हो सकती है, लेकिन नहीं! यहां सूचीबद्ध सभी चेतावनियों (उदाहरण के लिए -Wshadow) को इसके द्वारा सक्षम नहीं किया गया है। और मुझे अभी भी पता नहीं है कि क्या यह सूची व्यापक है।

जीसीसी को सक्षम करने के लिए कैसे कहूं (यदि कोई है, या नहीं, लेकिन सभी चेतावनियां हैं )


27
@ प्रारूप: मुझे समझ नहीं आ रहा है कि प्रश्न के बारे में "अस्पष्ट" क्या है - हां, मैं उन सभी चेतावनियों को चालू करना चाहूंगा जो मेरे कोड पर लागू होती हैं, चाहे कितनी भी पांडित्यपूर्ण क्यों न हो। कारण के रूप में, यह बहुत आसान है: मैंने कुछ चेतावनियां पाई हैं जो कि चालू नहीं हैं -Wall या -Wextra सहायक होने के लिए, और इसलिए मैं यह देखने की कोशिश करना चाहता हूं कि क्या मैं अपना कोड सुधार सकता हूं या नहीं। यह इतना सरल है।
user541686

12
@JoachimPileborg: "यह वह क्या है जिसके बारे में आप चेतावनी देना चाहते हैं?" संभावित त्रुटियां और / या बुरी शैली? मेरा मतलब है, अगर मुझे सभी सटीक चेतावनियों के बारे में पता था, तो मैंने उन्हें मैन्युअल रूप से चालू कर दिया होगा, सवाल उठाने की जरूरत नहीं है। यदि उत्तर वास्तव में "आपको उन सभी को खोजने के लिए स्रोत कोड को देखना है" तो कृपया इसे उत्तर के रूप में पोस्ट करें!
user541686

56
क्लेंग 3.1 ऑफर -Weverything
अलेक्जेंड्रे हम्ज़ जूल

5
@Arafangion खैर, सवाल C ++ को टैग किया गया है ... :)
कुछ प्रोग्रामर ने

5
@JoachimPileborg और अब स्रोत से चेतावनी निकालने के लिए एक स्वचालित तरीका है (आखिरकार): github.com/barro/compiler-warnings
Kyle Strand

जवाबों:


129

आप नहीं कर सकते।

GCC 4.4.0 के लिए मैनुअल केवल उस संस्करण के लिए व्यापक है, लेकिन यह 4.4.0 के लिए सभी संभावित चेतावनियों को सूचीबद्ध करता है। वे सभी पृष्ठ पर नहीं हैं, हालांकि आप लिंक करते हैं, उदाहरण के लिए कुछ भाषा-विशिष्ट विकल्प C ++ विकल्प या Obj-C विकल्पों के लिए पृष्ठों पर हैं। उन सभी को खोजने के लिए आप विकल्प सारांश को देखना बेहतर समझते हैं

सब कुछ चालू करना शामिल होगा -Wdouble-promotionजो केवल 32-बिट एकल-सटीक फ़्लोटिंग-पॉइंट इकाई के साथ सीपीयू पर प्रासंगिक है जो floatहार्डवेयर में लागू होता है, लेकिन doubleसॉफ्टवेयर में अनुकरण करता है। के रूप में गणना कर doubleसॉफ्टवेयर अनुकरण का उपयोग करें और धीमी हो जाएगा। यह कुछ एम्बेडेड सीपीयू के लिए प्रासंगिक है, लेकिन 64-बिट फ्लोटिंग-पॉइंट के लिए हार्डवेयर समर्थन के साथ आधुनिक डेस्कटॉप सीपीयू के लिए पूरी तरह अप्रासंगिक है।

एक और चेतावनी जो आमतौर पर उपयोगी नहीं होती है -Wtraditional, जो पारंपरिक सी, जैसे "string " "concatenation", या आईएसओ सी फ़ंक्शन परिभाषाओं में एक अलग अर्थ (या काम नहीं करता है) के बारे में पूरी तरह से अच्छी तरह से गठित कोड के बारे में चेतावनी देती है ! क्या आप वास्तव में 30 साल पुराने संकलक के साथ संगतता की परवाह करते हैं? क्या आप वास्तव में लिखने के लिए चेतावनी चाहते हैं int inc(int i) { return i+1; }?

मुझे लगता -Weffc++है कि उपयोगी होने के लिए बहुत शोर है, यह प्रभावी C ++ के पुराने पहले संस्करण पर आधारित है और उन निर्माणों के बारे में चेतावनी देता है जो पूरी तरह से वैध हैं C ++ (और जिसके लिए दिशानिर्देश पुस्तक के बाद के संस्करणों में बदल गए।) मैं नहीं बनना चाहता। चेतावनी दी कि मैंने std::stringअपने निर्माता में एक सदस्य को इनिशियलाइज़ नहीं किया है ; इसका एक डिफ़ॉल्ट निर्माता है जो वास्तव में वही करता है जो मैं चाहता हूं, मुझे m_str()इसे कॉल करने के लिए क्यों लिखना चाहिए ? -Weffc++चेतावनी है कि मददगार होगा भी मुश्किल संकलक का पता लगाने के लिए सही ढंग से (मिथ्या नकारात्मक दे रही है) कर रहे हैं, और इस तरह के सभी सदस्यों को स्पष्ट रूप से प्रारंभ करने के रूप में जो कि उपयोगी नहीं हैं, बहुत ज्यादा शोर उत्पादन, झूठे सकारात्मक दे रही है।

ल्यूक डैंटन ने बेकार चेतावनी का एक बड़ा उदाहरण प्रदान किया -Waggregate-returnजो लगभग निश्चित रूप से सी ++ कोड के लिए कभी भी समझ में नहीं आता है।

यानी आप वास्तव में सभी चेतावनियों को नहीं चाहते हैं , आप बस सोचते हैं कि आप करते हैं।

मैनुअल के माध्यम से जाओ, उनके बारे में पढ़ें, तय करें कि आप सक्षम करना चाहते हैं, उन्हें आज़मा सकते हैं। अपने कंपाइलर के मैनुअल को पढ़ना वैसे भी एक अच्छा थिंग टीएम है, शॉर्ट कट लेना और ऐसी चेतावनियों को सक्षम करना जो आपको समझ में नहीं आते हैं, यह बहुत अच्छा विचार नहीं है, खासकर अगर यह आरटीएफएम से बचने के लिए है।

जो कोई भी सब कुछ बदल देता है, वह शायद इसलिए या तो कर रहा है क्योंकि वे अनाड़ी हैं क्योंकि या एक नुकीले बालों वाले मालिक ने कहा "कोई चेतावनी नहीं।"

कुछ चेतावनी महत्वपूर्ण हैं, और कुछ नहीं हैं। आपको भेदभाव करना होगा या आप अपने कार्यक्रम को गड़बड़ कर देंगे। उदाहरण के लिए, पर विचार करें -Wdouble-promotion। यदि आप एक एम्बेडेड सिस्टम पर काम कर रहे हैं तो आप यह चाहते हैं; यदि आप एक डेस्कटॉप सिस्टम पर काम कर रहे हैं जो आप शायद नहीं करते हैं। और क्या आप चाहते हैं -Wtraditional? मुझे शक है।

संपादित करें: यह भी देखें -सभी-सभी चेतावनी को सक्षम करने के लिए जो कि WONTFIX के रूप में बंद है।

संपादित करें 2: मेकफ़ाइल्स के बारे में देवसेलर की शिकायत के जवाब में संकलक संस्करण के आधार पर विभिन्न चेतावनियों का उपयोग करने की आवश्यकता है, यदि -Wall -Wextraउपयुक्त नहीं है तो संकलक-विशिष्ट और संस्करण-विशिष्ट CFLAGS का उपयोग करना मुश्किल नहीं है:

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))

38
"मैनुअल के माध्यम से जाओ, उनके बारे में पढ़ें, तय करें कि आप सक्षम करना चाहते हैं, उन्हें आज़माएं।" यहां समस्या आपके द्वारा छोड़े गए चरण हैं: "प्रत्येक कंपाइलर संस्करण के लिए मैनुअल पर पुनः जाएं और चेतावनी की अपनी सूची को अनुकूलित करें क्योंकि वे एक-बदलते हैं। अपने मेकफाइल्स को सटीक संकलक संस्करण की जांच करें और चेतावनियों की एक अलग सूची का उपयोग करें। उनमें से प्रत्येक के लिए। ” हमारे पास अनुकूलन के स्तर को बनाए रखा है; चेतावनी के लिए एक ही सेवा प्रदान करने के साथ उन्हें परेशान क्यों नहीं किया जा सकता है?
DevSolar

17
@JonathanWakely: मेरे पास मेरे प्रोजेक्ट हैं, और GCC उनमें से नहीं है। मैं उनके उत्पाद में कमजोरी की ओर इशारा करता हूं। या तो वे इसे ठीक करते हैं या वे ऐसा नहीं करने के लिए दोष स्वीकार करते हैं, लेकिन यह उनके लिए इसे ठीक करने के लिए मेरे ऊपर नहीं है, ओएसएस को नुकसान पहुंचा है।
DevSolar

14
@JonathanWakely: "यदि आप कुछ चाहते हैं, तो इसके लिए पूछें, इसके बारे में कुतिया मत बनो।" - मैं जीसीसी प्रोजेक्ट में भाग लेने के लिए बाध्य नहीं हूं, ताकि इसे क्रिटिसाइज किया जा सके, खासकर तब जब # 31573 को पहले से ही WONTFIX के रूप में चिह्नित नहीं किया गया हो। इस विषय को "इसके बारे में पूछें" से इसे "कुतिया" के बारे में कहते हैं।
DevSolar

61
-Weverythingबेहतर विकल्प है, मुझे लगता है कि इस तरह के विकल्प नहीं देने की gcc रणनीति से। मैं उस झंडे का उपयोग क्लैंग के साथ करता हूं क्योंकि मेरा दर्शन यह है कि मैं डिफ़ॉल्ट रूप से सभी चेतावनियां चाहता हूं (क्योंकि किसी ने सोचा कि यह कंपाइलर में जोड़ने के लिए पर्याप्त सहायक था), और अगर मुझे यह पसंद नहीं है, तो मैं विशेष रूप से उस चेतावनी को बंद कर देता हूं। मुद्दा यह है कि आप उन चेतावनियों के बारे में नहीं जानते हैं जो ट्रिगर नहीं करती हैं, लेकिन आप उन चेतावनियों के बारे में जानते हैं जो आप नहीं चाहते कि ट्रिगर करें, और वे आसानी से बंद हो जाएं।
डेविड स्टोन

17
@JonathanWakely हाँ, लेकिन वे तालु हैं। आपके कोड के लिए क्या चेतावनियाँ प्रासंगिक हो सकती हैं, यह देखने का सबसे आसान तरीका यह है कि आपके कोड द्वारा कौन-सी चेतावनियाँ ट्रिगर की गई हैं ; उस बिंदु पर आप चेतावनी को अक्षम करने या न करने का निर्णय लेने से पहले संभावित-खतरनाक कोड का एक प्रासंगिक, वास्तविक जीवन का उदाहरण देख सकते हैं। यह आसानी से क्लैंग के -Weverythingविकल्प के साथ किया जा सकता है , लेकिन जीसीसी के साथ करना असंभव है।
काइल स्ट्रैंड

71

मैं पिछले जवाबों से सहमत हूं कि यह सचमुच सभी चेतावनियों को सक्षम करने के लिए फायदेमंद नहीं है, हालांकि जीसीसी इसे प्राप्त करने के लिए एक उचित सुविधाजनक तरीका प्रदान करता है। आदेश

gcc -Q --help=warning

सक्रिय होने के बारे में जानकारी के साथ सभी समर्थित चेतावनी विकल्पों की सूची प्रदान करता है। इस तरह से यह पता लगाने के लिए इस्तेमाल किया जा सकता है कि कौन से विकल्प हैं (नहीं) जैसे -Wallऔर द्वारा सक्षम-Wextra

gcc -Wall -Wextra -Q --help=warning

सभी चेतावनियों को सक्षम करने के लिए आप कमांड लाइन के मापदंडों को निकालने के लिए कुछ रेगेक्स का उपयोग कर सकते हैं

gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n'

मेरे वर्तमान जीसीसी के लिए यह देता है:

-वाबी -वाबी-टैग -Waddress -Waggregate -Waggressive-loop-optimifications -Waliasing -Walign-commons -Wampersand -Warray -Wounds -Warray-Temeries -Wassign -Wattign -Wattributes -Wbadributes -Wada-function-cast -ool -Wbuiltin-macro-redefined -Wc ++ - हमवतन -Wc ++ 0x -ोहैक्टर -Wc ++ 14-कंपोजिट -Wc-बाइंडिंग-प्रकार -Wc90-c99-कंप्रेशर्स -Wc99-c11-कंपटिटर्स -Wecast-align -Wcast-qual -चर्च-सदस्यता -Wractracter-truncation -Wchkp -Wclobbered -Wcomment-reals -Wondond- समर्थित -Wconversion -Wconversion-extra -Wconversion-null -Wcoverage -Wcoverage -Wcpp -Wctor- गोपनीयता-चालक-गोपनीयता-चालक-गोपनीयता -वार्ता-कथन-अधूरा-अधूरा -वेड-गैर-वर्चुअल-डोर -वार्ड-वाक्-दिनांकित-घोषणाएँ -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array -Wdiscarded-array -Wdiv-by-zero- डबल-शून्य -वफ़्फ़ ++ -शरीर-शरीर-वेंडिफ-लेबल-वेनम-तुलना -Wextra -Wfloat-equal -Wformat-होते-nul -Wformat-extra-args -Wformat-nonliteral -Wformat-Security -Wformat -Wformat-yformk-yformk-शून्य-लंबाई -Wree -निफे-वस्तु -वितरण-उन्मूलन -Wignored-qualifiers -Wimplicit -Wimplicit-function-घोषणापत्र -Wimplicit-int -Wimplicit-interface -Wimplicit-process -Wincompatible-pointer -Winherited-vartoric-ctoric -Win Self-self -विंट-कनवर्ज़न -विंट-टू-पॉइंटर-कास्ट -विंट्रिंसिक-शेड -Wintrinsics-std -Winvalid-memory-Model -Winvalid-ऑफसेट -Winvalid-pch -Wjump-misses-init -Wline -Wunalal-suffix -log -नहीं-कोष्ठक -वोलॉजिकल-ऑप-लॉन्ग-लॉन्ग -वैन -विमेयब-अनइंस्टीट्यूलाइज्ड -Wmemset-transposed-args -Wmissing-braces -Wmissing-घोषणायें -विमर्शिंग-फील्ड-आरंभकर्ता -Wmissing- शामिल-dmissing- पैरामीटर -Wmissing-प्रोटोटाइप-Wultulthar -Wnarrowing -Wnested-externs -Wnoexcept -Wnon-friend-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-cast-style-घोषणापत्र-शैली-परिभाषा -Wopenmp-simd -Woverflow -Woverlength-strings -Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpedantic -Wpmf-कन्वर्सेशन -Wpointer-arith -Wpointer-sign -Wpointer-to-int-cast -prassmas -साइन-डिफॉल्ट -Wprotocol -Wreal-q-Contin -Wrealloc-lhs -Wrealloc-lhs-all-Wredundant-decls -Wreorder -Wreturn-local-addr -Wreturnor-type -Wselector -Wfterence-Point -Wshadow -Wshadow-iv -Wiftift-count-negative -Wshift-count-overflow -Wsign-Compar -Wsign-promo -Wsized-deallocation -Wizeizeof-array-argument -Wsizeof-pointer-memaccess -Wastack- प्रोटेक्ट-नल-प्रेषण-प्रोटोटाइप -Wstrict-चयनकर्ता मैचों-Wuguggest- विशेषता = const -Wuguggest- विशेषता = प्रारूप -Wuguggest- विशेषता = Noteturn -Wsuggest- विशेषता = शुद्ध -वेस्ट-अंतिम-विधियाँ -Wuguggest-final-type -Wsuggest-override -Wsurprising -Wswitch -Wswitch -Wswitch -Wswitch -Default -Wswitch-enum -Wsync-nand -Wsynth -Wsystem-Headers -Wtabs -Watarget-Life -Wtraditional -Wtraditional -W कनवर्सेशन -Wtrampitionalines -Wtrigraphs -Wtype -Wounded -Wunder -Wunder -Wunder -W- -वंस-लूप-ऑप्टिमाइज़ेशन -Wunsuffixed-float-constants -Wunused -Wused- लेकिन सेट-पैरामीटर -Wunused-but-set-variable -Wunused-dummy-argument -Wunused-function -Wunused-Local-typedefs -व्यूज्ड-मैक्रोज़ -व्यूज्ड-पैरामीटर -व्यूज्ड-रिजल्ट -व्यूज्ड-वैल्यू -व्यूज्ड-वैरिएबल -व्यू-विदाउट-ओनली -व्यूलेस-कास्ट -वर्वेरग्स -व्वारैडिक-मैक्रोज -वेवेक्टर-ऑपरेशन-परफॉर्मेंस -विवर्सुअल-मूव-असाइन-ववला -व्यावहारिक-रजिस्टर-var -Witeite-strings -Wzero-as-null-pointer-constant -Wzerotrip -frequire-return-statement

इसका उपयोग अब GCC को कॉल करने के लिए किया जा सकता है

gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')

हालांकि ध्यान दें कि कुछ चेतावनी विकल्पों के कारण चेतावनी में यह परिणाम केवल कुछ भाषाओं (जैसे C++) के लिए उपलब्ध है । केवल कुछ और रेगेक्स का उपयोग करके इनसे बचा जा सकता है जिसमें केवल वर्तमान भाषा के लिए अनुमत विकल्प शामिल हैं या -Wno-whateverकॉल के अंत में एक उपयुक्त जोड़कर ।


10
मुझे डर है कि यह व्यावहारिक नहीं है। Gcc ने मुझे std lib से चेतावनी दी है।
वैलेंटाइन हेनित्ज़

13
@ValentinHeinitz जैसा कि मैंने कहा कि मुझे नहीं लगता कि शाब्दिक रूप से सभी चेतावनियों को सक्षम करना फायदेमंद है, लेकिन यह वही है जो ओपी के लिए था। हालाँकि मुझे लगता है कि अन्य उत्तरों में पहले से वर्णित कुछ समस्याग्रस्त चेतावनियों को स्पष्ट रूप से हटा दिया गया है (उदाहरण के लिए संबंधित-जो कुछ भी कॉल के अंत में), यह व्यावहारिक उपयोग का हो सकता है।
१६:२० बजे हाटसची

6
@ValentinHeinitz आप प्रासंगिक निर्देशिकाओं के -isystemबजाय सिस्टम / एसटीडी / 3-पार्टी हेडर के लिए चेतावनी जारी करने से gcc को रोक सकते हैं -I
काइल स्ट्रैंड

4
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह वास्तव में है और सीधे प्रश्न का उत्तर देता है।
TFuto

16

सभी चेतावनियों को सक्षम करने के साथ प्रोग्राम करना असंभव है (जब तक आप उन्हें अनदेखा नहीं करने जा रहे हैं, लेकिन तब, क्यों परेशान होते हैं?)। उदाहरण के लिए, आप निम्नलिखित झंडे के सेट का उपयोग मान लें: -Wstrict-prototypes -Wtraditional

यहां तक ​​कि दो चेतावनियों को सक्षम करने के बाद, निम्नलिखित कार्यक्रम शिकायत करेगा।

/tmp $ cat main.c 
int main(int argc, char **argv) {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c: In function main’:
main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]
 int main(int argc, char **argv) {
     ^

आप सोच सकते हैं "ठीक है, मैं पुराने शैली के प्रोटोटाइप का उपयोग करने जा रहा हूं"। नहींं, यह काम नहीं करेगा।

/tmp $ cat main.c 
int main(argc, argv)
    int argc;
    char **argv;
{
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

और नहीं, किसी भी प्रोटोटाइप को निर्दिष्ट नहीं करना भी गलत है, क्योंकि कंपाइलर भी शिकायत करेगा।

/tmp $ cat main.c 
int main() {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main() {
     ^

यदि आप अपने कार्यक्रम के अंदर किसी भी फ़ंक्शन को परिभाषित करते हैं, तो आप सभी झंडे का उपयोग नहीं कर सकते, क्योंकि कंपाइलर किसी भी कल्पनीय फ़ंक्शन परिभाषा के बारे में शिकायत करेगा।

C ++ के लिए, यह संभव है ( -Wtraditionalझंडा मौजूद नहीं है), और बहुत ही सरल कार्यक्रमों को संकलित किया जा सकता है। सभी चेतावनियों को सक्षम करने के लिए, चेतावनियों की सूची का उपयोग करें (शायद कुछ चेतावनियों की नक़ल की जाती है, क्योंकि मैं उन चेतावनियों को फ़िल्टर करने में सक्षम नहीं था -Wall)।

-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings

13
मैंने अब तक इसे int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
जांचने की जहमत

2
यहां तक ​​कि इस तुच्छ कार्यक्रम के साथ मैं अभी भी "चेतावनी: स्टैक का उपयोग 16 बाइट्स -वास्तैक-उपयोग =];;;
मार्क ग्लिससे

7

किसी व्यक्ति ने किसी दिए गए GCC या Clang संस्करण के लिए चेतावनी के पूर्ण सेट को निर्धारित करने के लिए उपकरणों का एक सेट बनाया है ।

जीसीसी के लिए, आपके कंपाइलर संस्करण के लिए इस टूल द्वारा दी गई चेतावनियों की पूरी सूची से कॉपी करना यह सुनिश्चित करने का एकमात्र तरीका प्रतीत होता है कि सभी चेतावनियाँ चालू हैं, क्योंकि (क्लैंग के विपरीत) जीसीसी प्रदान नहीं करता है -Weverything

उपकरण c.optजीसीसी स्रोत कोड में वास्तविक फ़ाइल को पार्स करने के लिए प्रकट होता है , इसलिए इसके परिणाम निश्चित होने चाहिए

रिपॉजिटरी में अधिकांश जीसीसी और क्लैंग संस्करणों के लिए उत्पन्न चेतावनी सूचियों के साथ पाठ फाइलें भी हैं (वर्तमान में क्लैंग 3.2 3.7 और जीसीसी 3.4 5.3 के माध्यम से)।

https://github.com/barro/compiler-warnings


यह उत्तर है। "शीर्ष स्तर" सूची का उपयोग करें, और सभी तर्क जोड़ दें जो शीर्ष स्तर पर हैं (इंडेंटेड / नेस्टेड नहीं)। github.com/Barro/compiler-warnings/blob/master/gcc/…
Jetski S-type

6

Gcc 4.3+ में अब -Q --help = चेतावनियाँ हैं, आप C- संबंधित चेतावनियों को प्रिंट करने के लिए --help = चेतावनियाँ, C भी निर्दिष्ट कर सकते हैं।

मैंने सिर्फ इसका लाभ उठाने के लिए एक एम 4 मॉड्यूल लिखा है (यह भी क्लैंग-वेवरींग का समर्थन करता है), wget_manywar.m.m देखें

यह कैसे उपयोग करने के लिए बहुत सरल है, मूल रूप से मॉड्यूल हर चेतावनी ध्वज को चालू करता है। और आप चेतावनी को आवश्यकतानुसार हटा देते हैं - कुछ वास्तव में बहुत ही क्रियात्मक हैं। उदाहरण: config.ac

यदि आप ऑटोटूलस का उपयोग नहीं करते हैं, तो आपको m4 मॉड्यूल में सभी अक्षम चेतावनियों को चालू करने के लिए कोड मिलेगा, जो मूल रूप से awk के माध्यम से पाई गई gcc कॉल है:

flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'


3

से यह पेज :

ध्यान दें कि कुछ चेतावनी झंडे द्वारा निहित नहीं हैं -Wall। उनमें से कुछ निर्माणों के बारे में चेतावनी देते हैं कि उपयोगकर्ता आमतौर पर संदिग्ध नहीं मानते हैं, लेकिन जो कभी-कभी आप जांचना चाहते हैं; अन्य लोग ऐसे निर्माणों के बारे में चेतावनी देते हैं जो कुछ मामलों में बचने के लिए आवश्यक या कठिन हैं, और चेतावनी को दबाने के लिए कोड को संशोधित करने का कोई सरल तरीका नहीं है। उनमें से कुछ सक्षम हैं, -Wextraलेकिन उनमें से कई को व्यक्तिगत रूप से सक्षम किया जाना चाहिए।

मुझे लगता है कि सवाल यह है कि कौन सा है ? शायद आप सकता है grep डब्ल्यू के साथ शुरुआत सभी लाइनों के लिए उस पृष्ठ, और चेतावनी झंडे की एक पूरी सूची मिलता है। फिर उन सूचियों की तुलना करें जिनके तहत -Wallऔर -Wextra। वहाँ भी है -Wpedantic, हालांकि आप स्पष्ट रूप से अभी भी अधिक पंडित होना चाहते हैं =)


"और मुझे अभी भी पता नहीं है कि क्या यह सूची व्यापक है" ... हाँ, मैं निश्चित रूप से उस पृष्ठ को पकड़ सकता हूं, लेकिन सवाल यह है कि क्या यह व्यापक है?
user541686

1
मुझे नहीं पता ... आपको GCC स्रोत कोड के माध्यम से डालना पड़ सकता है। क्या आप अपने जीवन को एक प्रोग्रामर के रूप में अत्यधिक कठिन बनाने की कोशिश कर रहे हैं, या क्या एक अच्छा कारण है कि आप हर बोधगम्य चेतावनी को देखना चाहते हैं? =)
धान

2
मैं अपने कोड के जीसीसी के निदान को देखना चाहता हूं - मुझे यह वास्तव में मददगार लगता है। लेकिन जाहिर है, अगर मैं पहले से ही सभी चेतावनियों के बारे में जानता था और जो उपयोगी हैं (और जो नहीं हैं), तो पूछने के लिए कुछ भी नहीं था। मेरे लिए यह बताने का कोई वास्तविक तरीका नहीं है कि जब तक मैं उन्हें आज़माता नहीं हूँ (और जैसे मैंने पाया कि छायांकन एक सहायक है, तो ऐसा नहीं है कि वे बेकार हैं क्योंकि वे बंद हो गए हैं)।
user541686

3

और मुझे अभी भी पता नहीं है कि क्या यह सूची व्यापक है।

यह शायद है, लेकिन एकमात्र सूची जो 100% व्यापक है वह संकलक के लिए वास्तविक स्रोत है। हालाँकि, GCC बड़ी है ! और मुझे नहीं पता कि सभी कमांड-लाइन पैरामीटर एक ही स्थान पर एकत्र किए गए हैं या कई स्रोत फ़ाइलों में फैले हुए हैं। यह भी ध्यान दें कि कुछ चेतावनी पूर्व-प्रोसेसर के लिए हैं, कुछ वास्तविक संकलक के लिए और कुछ लिंकर के लिए (जो कि पूरी तरह से अलग कार्यक्रम है, और बिनुटिल पैकेज में पाया जाता है) इसलिए वे सबसे अधिक संभावना है।


3
मैंने अपने उत्तर में विकल्प सारांश पृष्ठ से जोड़ा है , जो सभी विकल्पों को एक पृष्ठ में रखता है। जीसीसी कोड समीक्षा नीतियां बिना दस्तावेज के नए विकल्प की अनुमति नहीं देती हैं, इसलिए डॉक्स व्यापक होना चाहिए।
जोनाथन वेकली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.