सी

2008-09-30 9 views
74

के लिए अनुशंसित जीसीसी चेतावनी विकल्प -Wall क्या अन्य चेतावनियों को लोगों को उपयोगी पाया गया है?सी

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

+10

यह Stackoverflow संयम के सामान्य अज्ञानता का इतना विशिष्ट है, कि इस तरह एक अविश्वसनीय रूप से उपयोगी प्रश्न बंद हो गया। अच्छा काम, चाप। –

उत्तर

1

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

+3

+1 यह मजेदार में संकलित हो जाएगा। ;) – unexist

+2

@unexist 'clang' (एलएलवीएम प्रोजेक्ट का सी कंपाइलर) स्थापित करने का प्रयास करें और फिर' -वेरथिंग' 'के साथ संकलित करें और आप देखेंगे कि मजेदार मज़ेदार संकलन वास्तव में कैसे बन सकता है (कुछ चेतावनियां पूरी तरह पागल हैं, फिर भी वे तकनीकी रूप से सही हैं)। – Mecki

2

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

+3

सिर्फ एक नोट -ansi ओवरराइड -स्टडी = सी 99 – Sard

+1

-एसडी = c89 का उपयोग करने के बराबर नहीं है? – helpermethod

15

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

+20

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

+0

आपका बिल्कुल सही। – JesperE

+5

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

5

मैं भी उपयोग करें:

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

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

और:

-Wextra

कौन सा कुछ विकल्प है कि रूप में अच्छी तरह करना अच्छा कर रहे हैं सक्षम बनाता है। अधिकांश सी ++ के लिए हालांकि हैं।

+4

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

45

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

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

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

+0

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

+2

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

+3

जीसीसी दस्तावेज़ के अनुसार, -ओ 2 चेतावनियों को स्पॉट करने के लिए सबसे अच्छा है। मुझे यकीन नहीं है कि -O3 imply -O2 या अधिक चेतावनियां उत्पन्न करने की अनुमति दें। – Offirmo

2

-pedantic -Wall -Wextra -Wno-लिखने-तार -Wno-अप्रयुक्त पैरामीटर

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

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

+2

क्यों -नो-लेखन-तार? – Tom

+2

क्योंकि टूलचैन स्ट्रिंग अक्षर को केवल पढ़ने योग्य स्मृति में रखने की स्वतंत्रता है। – DevSolar

+3

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

1

-Wfloat-बराबर, -Wshadow, -Wmissing-प्रोटोटाइप,

1

-Wredundant-decls -Wnested-externs -Wstrict-प्रोटोटाइप -Wextra -Werror-निहित-समारोह-घोषणा -Wunused -Wno-unused- मूल्य -Wreturn प्रकार

14

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

 
-fmessage-length=0 
-ansi -pedantic -std=c99 
-Werror 
-Wall 
-Wextra 
-Wwrite-strings 
-Winit-self 
-Wcast-align 
-Wcast-qual 
-Wpointer-arith 
-Wstrict-aliasing 
-Wformat=2 
-Wmissing-declarations 
-Wmissing-include-dirs 
-Wno-unused-parameter 
-Wuninitialized 
-Wold-style-definition 
-Wstrict-prototypes 
-Wmissing-prototypes 
+3

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

+2

@ जोहान - आप कर सकते हैं, और यह वास्तव में आवश्यक नहीं है, जैसा कि मैंने हाल ही में पाया है। -ansi का अर्थ है -std = , तो वास्तव में आप बस -std = c99 -pedantic कह सकते हैं और बिल्कुल वही प्रभाव प्राप्त कर सकते हैं। मैं इसे किसी भी तरह से प्रलेखन प्रभाव के लिए उपयोग करने के लिए करते हैं। मुझे लगता है कि यह पढ़ता है, "यह कोड मानक सी 99 का उपयोग करते हुए एएनएसआई-मानक (pedantic!) है।" तुरंत बाद में आम तौर पर आता है - लंबे समय तक या समान ... एएनएसआई मानक के लिए कोई अपवाद। – Tom

1

अभी मैं का उपयोग करें:

-Wall -डब्लू डब्लू ई एक्स्ट्रा -Wconversion -Wshadow -Wcast-qual -Wwrite-तार -Werror

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

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

/जोहान


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

नोट: मुझे लगता है कि डब्ल्यू और -Wextra और अधिक या कम एक ही बात कर रहे हैं।

+2

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

+0

-Wconversion चेतावनियों को समाप्त किया जा सकता है (उदाहरण के लिए उपर्युक्त टिप्पणी में): char a = 5; चार बी = (चार) (ए -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 
9

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

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

+1

एफवाईआई, मैनुअल चेतावनियों की एक व्यापक सूची प्रदान नहीं करता है। हालांकि, आप ऐसी सूचियां [यहां] (https://github.com/barro/compiler-warnings), उन्हें उत्पन्न करने के लिए उपयोग किए जाने वाले टूल के साथ पा सकते हैं। –

32

2011-09-01 के रूप में, जीसीसी संस्करण 4.6.1

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

 
gcc -std=c89 -pedantic -Wall \ 
    -Wno-missing-braces -Wextra -Wno-missing-field-initializers -Wformat=2 \ 
    -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \ 
    -Wbad-function-cast -Wstrict-overflow=5 -Wstrict-prototypes -Winline \ 
    -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \ 
    -Wlogical-op -Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \ 
    -Wold-style-definition -Werror \ 
    -ggdb3 \ 
    -O0 \ 
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ 
    -lm 

"रिलीज" उर्फ ​​साथ

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

200 9-11-03 के अनुसार

"डी evelopment "उर्फ

 
gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \ 
    -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ 
    -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ 
    -Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \ 
    -lm -std=c89 -pedantic -O0 -ggdb3 -pg --coverage 

" रिलीज "उर्फ

 
gcc -lm -std=c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops 
+1

'-Wfloat-equal' मेरे उपनाम में जोड़ा गया। धन्यवाद – pmg

+2

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