सी के लिए अनुशंसित जीसीसी चेतावनी विकल्प [बंद]


83

अन्य लोगों के अलावा अन्य लोगों ने क्या चेतावनी दी है?

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

जवाबों:


48

मैं नियमित रूप से उपयोग करता हूं:

    gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
        -Wstrict-prototypes -Wmissing-prototypes

यह सेट अप्रयुक्त लोगों के लिए बहुत कुछ पकड़ता है (जिन लोगों का कोड मुझे पहली बार उन झंडों के साथ संकलित करने के लिए मिलता है); यह शायद ही कभी मुझे एक समस्या देता है (हालांकि -वॉक-क्वाल कभी-कभार उपद्रव होता है)।


1
इन दिनों, मुझे पता है कि मुझे -Wdeclaration-after-statementकोड का पता लगाने के लिए ' ' को जोड़ना होगा कि MSVC (जो अभी भी मूल रूप से C89 संकलक है) संभाल नहीं पाएगा। 'तीस एक उपद्रव। ' -Wextra' जोड़ने से कुछ अन्य समस्याएं भी हो सकती हैं।
जोनाथन लेफ्लर 14

2
साथ ही, -O3कुछ इसी तरह जोड़ना या जोड़ना एक अच्छा विचार है ; ऐसी चेतावनियाँ हैं जो कोड के अनुकूलित होने पर ही उत्पन्न होती हैं।
जोनाथन लेफ़लर

3
gcc doc के अनुसार, -O2 स्पॉट चेतावनियों के लिए सबसे अच्छा है। मुझे यकीन नहीं है कि -O3 imply -O2 या अधिक चेतावनियां उत्पन्न करने की अनुमति दें।
ऑफिशो

3
छोड़ें -m64 यदि आप 64-बिट वातावरण में नहीं हैं।
टॉर क्लिंगबर्ग

1
दोनों का उपयोग करना -m32 और -m64 (अलग रन में, निश्चित रूप से) जिस तरह से आप का उपयोग में विभिन्न कीड़ों से बेहतर सुरक्षा प्रदान करता है printf()और scaf()रूपांतरण विनिर्देशों।
जोनाथन लेफलर

40

2011-09-01 तक, gcc संस्करण 4.6.1 के साथ

मेरा वर्तमान "विकास" उर्फ

gcc -std = c89--antic -Wall \
    -वह-गायब-ब्रेसिज़
    -Witchitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \
    -वार्ड-फंक्शन-कास्ट-वर्स्टिक्ट-ओवरफ्लो = 5 -स्ट्रिक्ट-प्रोटोटाइप -विलाइन \
    -Wefef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \
    -वोलॉजिकल-ऑप -Wloloat-equal-Vstrict-aliasing = 2-विखंडन-दशमी
    -विस्तृत-शैली-परिभाषा
    -ddb3 \
    -ओ0 \ _
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \
    -lm

"रिलीज़" उर्फ

gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm

2009-11-03 तक

"विकास" उर्फ

gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \
    -वार्ड-फंक्शन-कास्ट -स्ट्रिक्ट-प्रोटोटाइप -Winline -Wundef -Westedested-externs
    -वॉस्क-क्वाल -Whadhad -Wwrite-strings -Wconversion -Wunreachable-code \
    -विस्तार-अलियासिंग = 2 -फ्लोट-स्टोर -fno-common -fstrict-aliasing +
    -lm -std = c89--antic -O0 -ggdb3 -pg --coverage

"रिलीज" उर्फ

gcc -lm -std = c89--antic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops

1
-Wfloat-equalमेरे उपनाम में जोड़ा गया। धन्यवाद मार्क
दोपहर

4
ध्यान दें कि -Wstrict-aliasing=2वास्तव में गर्भपात के चेतावनी स्तर को कम करता -Wstrict-aliasing=3है -Wall, कम से कम जीसीसी के हालिया संस्करण के साथ।
nwellnhof

15

मुझे पसंद है -वायरर। कोड को चेतावनी मुक्त रखता है।


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

6
मैं क्रिस्टोफ़ से असहमत हूं, क्योंकि कई बार, मैं केवल पहले एक काम की प्रतिलिपि संकलित करवाता हूं और फिर त्रुटियों को संबोधित करता हूं ।
यकतुला

9
मैं समझता हूं कि यह क्यों लुभावना है, लेकिन जब / यदि आपके पास एक कामकाजी प्रति है तो आपको इसे छोड़ने की अधिक संभावना होगी क्योंकि यह "काम करता है" है। यह जोखिम एक कॉर्पोरेट वातावरण में और भी अधिक है, जहाँ आपको चेतावनी को ठीक करने के लिए आपको अपने बॉस को कुछ समय के लिए छोड़ने के लिए राजी करना होगा।
जेस्पर

2
मैं #warningउपयोग करने के एक अच्छे दुष्प्रभाव से छुटकारा पाने पर विचार करता हूं -Werror
जेसपेरे

3
यदि आप ओपन सोर्स सामान पर काम करते हैं, तो -Werrorअपने बिल्ड में डिफ़ॉल्ट रूप से इसका उपयोग न करें, यह पैकवाइज एनाउंस करता है, जो आपके लिए अलग-अलग कंपाइलर संस्करणों का उपयोग कर रहे हैं क्योंकि कंपाइलर संस्करण के साथ चेतावनियों में परिवर्तन होता है, कभी-कभी कोड जो आपके लिए मुफ्त चेतावनी दे रहा है, किसी और के लिए चेतावनी होगी फिर उन्हें इसे बंद करने के लिए आपके निर्माण तंत्र में खुदाई करनी होगी।
स्पंदरी

15

मैंने C ++ से शुरुआत की, इसलिए जब मैंने CI सीखने के लिए स्विच किया, तो यह सुनिश्चित हो गया कि अतिरिक्त-गुदा हो:

-fmessage-लंबाई = 0
-सांय-उद्विग्न-अस्त = c99
-Werror
-दीवार
-Wextra
-Wwrite-तार
-Winit आत्म
-Wcast-align
-Wcast-qual
-Wpointer-arith
-Wstrict अलियासिंग
-Wformat = 2
-Wmissing-घोषणाओं
-Wmissing-शामिल-dirs
-Wno-अप्रयुक्त पैरामीटर
-Wuninitialized
-Wold शैली परिभाषा
-Wstrict-प्रोटोटाइप
-Wmissing-प्रोटोटाइप

5
क्या आप एक ही समय में -ansi -pedantic -std = c99 का उपयोग कर सकते हैं? क्या -ansi लगभग c89 जैसी ही चीज नहीं है? और यदि ऐसा है तो यह c99 ध्वज के साथ कैसे काम करता है?
जोहान

2
@ जोहान - आप कर सकते हैं, और यह वास्तव में आवश्यक नहीं है, जैसा कि मैंने हाल ही में पाया है। -ansi का तात्पर्य -std = <default> है, इसलिए वास्तव में आप केवल -std = c99-upantic कह सकते हैं और ठीक उसी प्रभाव को प्राप्त कर सकते हैं। मैं इसे केवल प्रलेखन प्रभाव के लिए, वैसे भी इसका उपयोग करते हैं। मुझे लगता है कि यह पढ़ता है, "यह मानक एएनएसआई-मानक (पांडित्य!) है, जो मानक C99 का उपयोग कर रहा है।" इसके तुरंत बाद आमतौर पर आता है-जब तक लंबे-लंबे या समान ... एएनएसआई मानक के लिए कोई अपवाद नहीं।
टॉम

9

आपके द्वारा उपयोग किए जाने वाले जीसीसी संस्करण के लिए मैनुअल प्राप्त करें, सभी चेतावनी के विकल्प उपलब्ध हैं , और फिर केवल उन्हीं को निष्क्रिय करें जिनके लिए आपके पास ऐसा करने के लिए एक सम्मोहक कारण है। (उदाहरण के लिए, गैर-परिवर्तनीय तृतीय-पक्ष हेडर जो आपको बहुत सारी चेतावनी देंगे अन्यथा।) उन कारणों का दस्तावेजीकरण करें। (मेकफाइल या जहाँ भी आप उन विकल्पों को सेट करते हैं।) नियमित अंतराल पर सेटिंग्स की समीक्षा करें, और जब भी आप अपने कंपाइलर को अपग्रेड करें।

संकलक आपका मित्र है। चेतावनियां तुम्हारी मित्र हैं। संकलक को यथासंभव संभावित समस्याओं को बताने का मौका दें।


1
FYI करें, मैनुअल चेतावनी की एक भी व्यापक सूची प्रदान नहीं करता है। हालांकि, आप ऐसी सूचियों को यहां पा सकते हैं , साथ ही उन्हें उत्पन्न करने के लिए उपयोग किए जाने वाले उपकरण भी।
काइल स्ट्रैंड

5

मैं भी उपयोग करता हूं:

-Wstrict-अतिप्रवाह = 5

उन बुरा कीड़े कि पकड़ने के लिए कर सकते हैं तब आते हैं, मैं कोड है कि पूर्णांक अतिप्रवाह व्यवहार पर निर्भर करता है लिखते हैं।

तथा:

-Wextra

जो कुछ विकल्पों को सक्षम करता है जो कि अच्छा है। अधिकांश C ++ के लिए हैं।


4
-Wextra के लिए नया नाम लगता है -W (जो अभी भी समर्थित है)
सर

2

मैं आमतौर पर "-W -Wall -ansi-upantic" के साथ संकलन करता हूं, इससे कोड की अधिकतम गुणवत्ता और पोर्टेबिलिटी सुनिश्चित करने में मदद मिलती है।


3
सिर्फ एक टिप्पणी -ansi ओवरराइड -std = c99
Sard

2
-Ansi -std = c89 के उपयोग के बराबर नहीं है?
हेल्परमेथोड

2

-वेदिक -वैल -वैक्रा -वॉन-राइटिंग-स्ट्रिंग -व्यू-अप्रयुक्त-पैरामीटर

"मुझे बहुत चोट लगी" मोड के लिए, मैं दूर छोड़ देता हूँ -नहीं ...

मुझे अपना कोड चेतावनी मुक्त होना पसंद है, खासकर C ++ के साथ। जबकि सी कंपाइलर चेतावनियों को अक्सर नजरअंदाज किया जा सकता है, कई सी ++ चेतावनी स्रोत कोड में मूलभूत दोष दिखाते हैं।


3
क्योंकि टूलचैन स्ट्रिंग-लिटरल को रीड-ओनली मेमोरी में डालने के लिए स्वतंत्र है।
DevSolar

3
क्यों-अप्रयुक्त-पैरामीटर? बहुत कम ही यह वास्तविक समस्याओं की ओर इशारा करता है (और "बहुत ही कम" इसे अक्षम करने के साथ सटीक खतरे: असुरक्षित कीड़े का पता लगाने के लिए सबसे खराब हैं)। उदाहरण के लिए, जैसे Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}- यदि ट्रिगर हो सकता है - स्पॉट के लिए अपेक्षाकृत कठिन। यदि आप उस चेतावनी से परेशान हैं, तो आपको बस पैरामीटर को आउटकम करना चाहिए foo (int /*q*/), इससे आपके कोड की पठनीयता भी बढ़ जाती है।
सेबेस्टियन मच

रिफैक्टरिंग के दौरान, मैंने कभी-कभी एक स्थानीय के साथ गलती से पैरामीटर को छायांकित किया है, यह उसे पकड़ने में भी मदद करता है
पॉल

1

-pedantic-त्रुटियों


2
@unexist स्थापित करने का प्रयास करें clang(LLVM प्रोजेक्ट का C संकलक) और फिर संकलन करें -Weverythingऔर आप देखेंगे कि कैसे मच मज़ेदार संकलन वास्तव में बन सकते हैं (कुछ चेतावनियाँ पूरी तरह से पागल हैं, फिर भी वे तकनीकी रूप से सही हैं)।
मकेई


1

-वृंद-विघटन -वृक्ष-बहिर्गमन -वृत्तिक-विरोधाभास -Wextra -Werror -Werror-implicit-function-घोषणापत्र -Wunused -Wno-unused-value -Wreturn-type


1

अभी मैं उपयोग करता हूं:

-WW -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror

मैंने उस सूची को ज्यादातर "एन इंट्रोडक्शन टू जीसीसी" पुस्तक से लिया और फिर कुछ डिफ्रेंट प्रोग्रामिंग ( http://people.redhat.com/drepper/Defensive-slides.pdf ) के बारे में उलरिच ड्रेपर के पुनर्मिलन से ।

लेकिन मेरी सूची के पीछे कोई विज्ञान नहीं है, यह सिर्फ एक अच्छी सूची की तरह लगा।

/ जोहान


नोट: मुझे उन पंडितों के झंडे पसंद नहीं हैं, हालांकि ...।

ध्यान दें: मुझे लगता है कि -Wext और कमोबेश एक ही चीज हैं।


2
-Wconversion का उपयोग करके Afer, और मेरे कोड और पुन: निर्माण में विभिन्न डेटा प्रकारों का परीक्षण करने में कुछ घंटे बिताते हैं, मैंने -Wconversion पर शोध किया और इसे सामान्य रूप से उपयोग करने की अनुशंसा नहीं करेंगे। समस्या यह कोड के बारे में चेतावनी उत्पन्न करता है जैसे: char a = 5; char b = a - 1; यह gcc 4.3.2 (डेबियन 4.3.2.-1.1)
जेम्स मोरिस

1
-विसंक्रमण चेतावनी द्वारा समाप्त किया जा सकता है (उदाहरण के लिए उपरोक्त टिप्पणी में): char a = 5; char b = (char) (a - 1); ध्यान दें कोष्ठक।
जेम्स मॉरिस

1

मैं आमतौर पर सिर्फ उपयोग करता हूं

gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o

1

जब तक आप निर्दिष्ट नहीं करते हैं -O, तब तक बिन बुलाए गए चर के बारे में चेतावनी काम नहीं करती है , इसलिए मैं इसे अपनी सूची में शामिल करता हूं:

-g -O -Wall -Werror -Wextra -pedantic -std=c99

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.