उद्देश्य-सी विकास के लिए क्लैंग चेतावनी झंडे


86

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

मुझे व्यक्तिगत रूप से लगता है कि यह वास्तव में कोडिंग कौशल, साथ ही संभावित कोड पोर्टेबिलिटी में सुधार कर सकता है, कुछ मुद्दों को रोक सकता है, क्योंकि यह आपको हर छोटे विस्तार, संभावित कार्यान्वयन और वास्तुकला के मुद्दों के बारे में जागरूक करने के लिए मजबूर करता है, और इसी तरह ...

यह मेरी राय में भी एक अच्छा हर दिन सीखने का उपकरण है, भले ही आप एक अनुभवी प्रोग्रामर हों।

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

अब ऑब्जेक्टिव-सी के बारे में, मैंने हाल ही में जीसीसी के बजाय पूरी तरह से एलएलवीएम टूलचैन ( क्लैंग के साथ) पर स्विच किया ।

मेरे उत्पादन कोड पर, मैं आमतौर पर इस चेतावनी के झंडे को सेट करता हूं (स्पष्ट रूप से, भले ही उनमें से कुछ को कवर किया जा सकता है):

  • -दीवार
  • -Wbad-समारोह कलाकारों
  • -Wcast-align
  • -Wconversion
  • -Wdeclaration के बाद बयान
  • -Wdeprecated-कार्यान्वयन
  • -Wextra
  • -Wfloat-बराबर
  • -Wformat = 2
  • -Wformat-nonliteral
  • -Wfour-चार-स्थिरांक
  • -Wimplicit-परमाणु-गुण
  • -Wmissing-ब्रेसिज़
  • -Wmissing-घोषणाओं
  • -Wmissing मैदान-initializers
  • -Wmissing प्रारूप-विशेषता
  • -Wmissing-noreturn
  • -Wmissing-प्रोटोटाइप
  • -Wnested-externs
  • -Wnewline-EOF
  • -Wold शैली परिभाषा
  • -Woverlength-तार
  • -Wparentheses
  • -Wpointer-arith
  • -Wredundant-decls
  • -Wreturn प्रकार
  • -Wsequence सूत्री
  • -Wshadow
  • -Wshorten -64 करने के लिए 32
  • -Wsign-तुलना
  • -Wsign-रूपांतरण
  • -Wstrict-प्रोटोटाइप
  • -Wstrict-चयनकर्ता मैचों
  • -Wswitch
  • -Wswitch-डिफ़ॉल्ट
  • -Wswitch-enum
  • -Wundeclared-चयनकर्ता
  • -Wuninitialized
  • -Wunknown-pragmas
  • -Wunreachable-कोड
  • -Wunused-समारोह
  • -Wunused-लेबल
  • -Wunused पैरामीटर
  • -Wunused-मूल्य
  • -Wunused-चर
  • -Wwrite-तार

मुझे यह सुनने में दिलचस्पी है कि अन्य डेवलपर्स का इस बारे में क्या कहना है।

उदाहरण के लिए, क्या आपको लगता है कि मैंने क्लैंग (उद्देश्य-सी) के लिए एक विशेष ध्वज को याद किया, और क्यों?
या क्या आपको लगता है कि एक विशेष ध्वज उपयोगी नहीं है (या बिल्कुल नहीं चाहता था), और क्यों?

संपादित करें

प्रश्न को स्पष्ट करने के लिए, ध्यान दें कि -Wallकेवल कुछ बुनियादी चेतावनी प्रदान करता है।
वे वास्तव में बहुत अधिक चेतावनी वाले झंडे हैं, जिनके द्वारा कवर नहीं किया गया है -Wall, इसलिए प्रश्न, और जो सूची मैं प्रदान करता हूं।


9
मुझे यह कहने के लिए लुभाया जाता है कि शायद स्टैक ओवरफ्लो पर रहना चाहिए, क्योंकि यह उपकरण के उपयोग के बारे में एक तरह का सवाल है, लेकिन हम देखेंगे कि समुदाय कैसे घूमता है।
एडम लेअर

टिप्पणी के लिए धन्यवाद:) एक तरह से, मैं आपसे सहमत हूं, और यही कारण है कि मैंने मूल रूप से इसे StackOverflow पर पोस्ट किया है (क्योंकि मैं यहां एक नियमित उपयोगकर्ता नहीं हूं, मुझे शर्म आती है)। बहुत सारे विचार, अपवोट्स इत्यादि मिल गए ... लेकिन एक भी उत्तर नहीं ... और जैसा कि लोगों ने इसे स्थानांतरित करने का सुझाव दिया ... ठीक है, आइए देखें
:)

खैर, मुझे उम्मीद है कि हम आपको एक अच्छा जवाब दे सकते हैं। सौभाग्य। :)
एडम लेअर

सी और जीसीसी के लिए, -Wwrite-stringsयह एक भाषा का एक बहुत ही समान बनाता है , लेकिन बिल्कुल सी नहीं। केवल इस कारण से मैं उस विकल्प का उपयोग नहीं करता हूं। आपके द्वारा निर्दिष्ट अन्य के अलावा, मैं उपयोग करता हूं -pedantic -Wstrict-overflow=5 -Winline -Wundef -Wcast-qual -Wlogical-op -Wstrict-aliasing=2और -Wno-missing-braces -Wno-missing-field-initializersपूरी तरह से उचित इनिशियलाइज़र के लिए struct whatever obj = {0};। इसके अलावा, मुझे लगता है कि -Wconversionउपयोगी चेतावनियों की तुलना में अधिक "स्पैम" देता है :)
pmg

जवाबों:


158

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

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

अब लंबे संस्करण के लिए। झंडे की ग्रुपिंग की चेतावनी देने वाली पहली पृष्ठभूमि। क्लैंग (और जीसीसी में एक सीमित सीमा तक) में चेतावनी के "समूह" हैं। कुछ जो इस चर्चा के लिए प्रासंगिक हैं:

  • ऑन-बाय-डिफ़ॉल्ट: ये चेतावनी हमेशा तब तक होती है जब तक आप उन्हें स्पष्ट रूप से अक्षम नहीं करते हैं।
  • -Wall: ये चेतावनी है कि डेवलपर्स को अपने मूल्य और कम झूठी-सकारात्मक दर दोनों में उच्च विश्वास है।
  • -Wextra: ये ऐसी चेतावनी हैं जिन्हें मूल्यवान और ध्वनि माना जाता है (यानी, वे छोटी गाड़ी नहीं हैं), लेकिन उनमें उच्च झूठी-सकारात्मक दर या सामान्य दार्शनिक आपत्तियां हो सकती हैं।
  • -Weverything: यह एक पागल समूह है जो क्लैंग में हर चेतावनी को शाब्दिक रूप से सक्षम करता है । अपने कोड पर इसका उपयोग न करें। यह क्लैंग डेवलपर्स के लिए कड़ाई से या उन चेतावनियों की खोज के लिए है

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

दूसरा मानदंड झूठी-सकारात्मक रिपोर्टों का विचार है । ये ऐसी परिस्थितियां हैं जहां चेतावनी कोड पर फायर करती है, लेकिन संभावित समस्या का उल्लेख वास्तव में कार्यक्रम के संदर्भ या किसी अन्य बाधा के कारण नहीं होता है। कोड के बारे में चेतावनी दी वास्तव में सही ढंग से व्यवहार कर रहा है। ये विशेष रूप से खराब होते हैं जब चेतावनी को उस कोड पैटर्न पर आग लगाने का इरादा नहीं था। इसके बजाय, यह चेतावनी के कार्यान्वयन में कमी है जो इसे वहां आग लगाने का कारण बनता है।

क्लैंग चेतावनियों के लिए, मूल्य शुद्धता के संदर्भ में होना आवश्यक है , न कि शैली, स्वाद, या कोडिंग सम्मेलनों के संदर्भ में। यह उपलब्ध चेतावनियों के समूह को सीमित करता है, अक्सर अनुरोधित चेतावनियों को छोड़कर जैसे चेतावनी जब भी {}किसी ifकथन के मुख्य भाग के आसपास उपयोग नहीं की जाती है । क्लैंग भी झूठी-सकारात्मकता के बहुत असहिष्णु हैं । अधिकांश अन्य संकलक के विपरीत, यह निर्माण, उपस्थिति या अतिरिक्त '()', कलाकारों, या यहां तक ​​कि प्रीप्रोसेसर मैक्रोज़ की सटीक वर्तनी सहित गलत सकारात्मकता को पहचानने के लिए अविश्वसनीय स्रोतों की जानकारी का उपयोग करेगा।

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

% nl x.cc
     1  class C { const int x; };

% clang -fsyntax-only x.cc
x.cc:1:7: warning: class 'C' does not declare any constructor to initialize its non-modifiable members
class C { const int x; };
      ^
x.cc:1:21: note: const member 'x' will never be initialized
class C { const int x; };
                    ^
1 warning generated.

यहाँ इस चेतावनी को प्राप्त करने के लिए किसी ध्वज की आवश्यकता नहीं थी। तर्क यह है कि यह कोड वास्तव में सही नहीं है, चेतावनी को उच्च मूल्य देता है , और चेतावनी केवल कोड पर आग लगाती है कि क्लैंग इस बाल्टी में गिर सकता है, यह एक शून्य झूठी-सकारात्मक दर देता है।

% nl x2.cc
     1  int f(int x_) {
     2    int x = x;
     3    return x;
     4  }

% clang -fsyntax-only -Wall x2.cc
x2.cc:2:11: warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized]
  int x = x;
      ~   ^
1 warning generated.

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

% nl x3.cc
     1  void g(int x);
     2  void f(int arr[], unsigned int size) {
     3    for (int i = 0; i < size; ++i)
     4      g(arr[i]);
     5  }

% clang -fsyntax-only -Wextra x3.cc
x3.cc:3:21: warning: comparison of integers of different signs: 'int' and 'unsigned int' [-Wsign-compare]
  for (int i = 0; i < size; ++i)
                  ~ ^ ~~~~
1 warning generated.

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

आमतौर पर, चेतावनी -Wextraझंडे के बाहर लंबे समय तक नहीं रहती है । क्लैंग चेतावनी को लागू नहीं करने के लिए बहुत कोशिश करता है जो नियमित उपयोग और परीक्षण नहीं देखता है। द्वारा चालू की गई अतिरिक्त चेतावनियाँ -Weverythingआमतौर पर सक्रिय विकास के तहत या सक्रिय बग के साथ चेतावनी होती हैं। या तो उन्हें तय किया जाएगा और उपयुक्त झंडों के नीचे रखा जाएगा, या उन्हें हटा दिया जाना चाहिए।

अब जब हमें यह समझ है कि ये चीजें क्लैंग के साथ कैसे काम करती हैं, तो आइए मूल प्रश्न पर वापस जाने की कोशिश करें: आपको अपने विकास के लिए क्या चेतावनी देनी चाहिए? जवाब है, दुर्भाग्य से, यह निर्भर करता है। आपकी स्थिति के लिए कौन सी चेतावनियाँ सर्वोत्तम रूप से काम करती हैं, यह निर्धारित करने में मदद करने के लिए निम्नलिखित प्रश्नों पर विचार करें।

  • क्या आपके पास अपने सभी कोड पर नियंत्रण है, या इसमें से कुछ बाहरी है?
  • तुम्हारा लक्ष्य क्या है? बग्स को पकड़ना, या बेहतर कोड लिखना?
  • आपकी झूठी-सकारात्मक सहिष्णुता क्या है? क्या आप नियमित रूप से मौन चेतावनी के लिए अतिरिक्त कोड लिखने के लिए तैयार हैं?

सबसे पहले और सबसे महत्वपूर्ण, यदि आप कोड को नियंत्रित नहीं करते हैं, तो वहां पर अतिरिक्त चेतावनियों को बदलने की कोशिश न करें। कुछ बंद करने के लिए तैयार रहें। दुनिया में बहुत बुरा कोड है, और आप इसे ठीक करने में सक्षम नहीं हो सकते हैं। वह ठीक है। आपके द्वारा नियंत्रित कोड पर अपने प्रयासों को केंद्रित करने का एक तरीका खोजने के लिए काम करें ।

इसके बाद, यह पता करें कि आप अपनी चेतावनियों से क्या चाहते हैं। यह अलग-अलग लोगों के लिए अलग-अलग है। क्लैंग बिना किसी विकल्प के बगैर चेतावनी देने की कोशिश करेंगे, जैसे कि कीड़े, या कोड पैटर्न जिनके लिए हमारे पास लंबे ऐतिहासिक उदाहरण हैं, जो बताते हैं कि बग दर बहुत अधिक है। सक्षम करने से -Wallआप क्लैग डेवलपर्स C ++ कोड में देखी गई सबसे सामान्य गलतियों को पकड़ने के लिए लक्षित चेतावनियों का अधिक आक्रामक सेट प्राप्त करने जा रहे हैं। लेकिन इन दोनों के साथ झूठी-सकारात्मक दर काफी कम रहनी चाहिए।

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

कई लोग पाएंगे कि इनमें से कोई भी विकल्प उनके लिए उचित नहीं है। Google पर, हमने -Wallचेतावनी के उल्लंघन वाले कई मौजूदा कोड के कारण कुछ चेतावनियों को बंद कर दिया है । हमने कुछ चेतावनियों को भी स्पष्ट रूप से बदल दिया है, भले ही वे इसके द्वारा सक्षम न हों -Wall, क्योंकि उनके पास हमारे लिए विशेष रूप से उच्च मूल्य है। आपका माइलेज अलग-अलग होगा, लेकिन संभवतः इसी तरह से अलग-अलग होगा। यह अक्सर सभी के बजाय कुछ प्रमुख चेतावनियों को सक्षम करने के लिए बेहतर हो सकता है -Wextra

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

चेतावनी (जो दोनों शामिल की ओपी की सूची की -Wallऔर -Wextra) केवल निम्न चेतावनी रहे हैं नहीं उन दो समूहों के अंतर्गत आने वाले (या डिफ़ॉल्ट रूप से चालू)। पहला समूह इस बात पर जोर देता है कि स्पष्ट चेतावनी झंडे पर अधिक निर्भरता खराब क्यों हो सकती है: इनमें से कोई भी क्लैंग में लागू नहीं है! वे केवल GCC संगतता के लिए कमांड लाइन पर स्वीकार किए जाते हैं।

  • -Wbad-function-cast
  • -Wdeclaration-after-statement
  • -Wmissing-format-attribute
  • -Wmissing-noreturn
  • -Wnested-externs
  • -Wnewline-eof
  • -Wold-style-definition
  • -Wredundant-decls
  • -Wsequence-point
  • -Wstrict-prototypes
  • -Wswitch-default

मूल सूची में अनावश्यक चेतावनियों की अगली बाल्टी वे हैं जो उस सूची में दूसरों के साथ बेमानी हैं:

  • -Wformat-nonliteral -- का भाग -Wformat=2
  • -Wshorten-64-to-32 -- का भाग -Wconversion
  • -Wsign-conversion -- का भाग -Wconversion

चेतावनियों का एक चयन भी है जो स्पष्ट रूप से अलग हैं। ये बग्गी या गैर-बग्गी कोड के बजाय भाषा बोली वेरिएंट के साथ सौदा करते हैं। के अपवाद के साथ -Wwrite-strings, ये सभी क्लैंग द्वारा प्रदान किए गए भाषा एक्सटेंशन के लिए चेतावनी हैं। क्या क्लैंग उनके उपयोग के बारे में चेतावनी देता है, यह विस्तार की व्यापकता पर निर्भर करता है। क्लेंग का उद्देश्य जीसीसी संगतता है, और इसलिए कई मामलों में यह आसान है कि अंतर्निहित भाषा एक्सटेंशन के साथ व्यापक उपयोग में हैं। -Wwrite-strings, जैसा कि ओपी पर टिप्पणी की गई है, जीसीसी से एक संगतता ध्वज है जो वास्तव में कार्यक्रम शब्दार्थ को बदलता है। मुझे इस झंडे पर गहरा अफसोस है, लेकिन हमें अब इसे विरासत के कारण इसका समर्थन करना होगा।

  • -Wfour-char-constants
  • -Wpointer-arith
  • -Wwrite-strings

शेष विकल्प जो वास्तव में संभावित दिलचस्प चेतावनियों को सक्षम कर रहे हैं वे हैं:

  • -Wcast-align
  • -Wconversion
  • -Wfloat-equal
  • -Wformat=2
  • -Wimplicit-atomic-properties
  • -Wmissing-declarations
  • -Wmissing-prototypes
  • -Woverlength-strings
  • -Wshadow
  • -Wstrict-selector-match
  • -Wundeclared-selector
  • -Wunreachable-code

इसका कारण यह नहीं है -Wallया -Wextraहमेशा स्पष्ट नहीं है। इनमें से कई लोगों के लिए, वे वास्तव में जीसीसी चेतावनी (पर आधारित होते हैं -Wconversion, -Wshadowआदि) और इस तरह बजना जीसीसी के व्यवहार की नकल करने की कोशिश करता है। हम धीरे-धीरे इनमें से कुछ को अधिक बारीक-बारीक और उपयोगी चेतावनियों में तोड़ रहे हैं। इसके बाद उच्च स्तरीय चेतावनी समूहों में से एक में इसे बनाने की उच्च संभावना है। जिसके अनुसार, लेने के लिए एक चेतावनी पर, -Wconversionहै तो यह है कि यह संभावना है अपने स्वयं के "शीर्ष स्तरीय" निकट भविष्य के लिए श्रेणी रहेगा व्यापक। कुछ अन्य चेतावनियाँ जो GCC की हैं, लेकिन जिनकी कम कीमत और उच्च झूठी-सकारात्मक दरें हैं, उन्हें इसी तरह के नो-मैन्स-लैंड में पुनः प्राप्त किया जा सकता है।

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

मुझे उम्मीद है कि यह क्लैंग के साथ चेतावनी की स्थिति को स्पष्ट करता है और उन लोगों के लिए कुछ अंतर्दृष्टि प्रदान करता है जो अपने उपयोग, या कंपनी के उपयोग के लिए चेतावनी का एक सेट लेने की कोशिश कर रहे हैं।


8
बकाया जवाब! बहुत बहुत धन्यवाद। मुझे इसे कुछ बार फिर से पढ़ने की आवश्यकता होगी, लेकिन मैं जल्द ही कुछ टिप्पणियों के साथ वापस आऊंगा। एक बार फिर धन्यवाद!
Macmade

1
@Chandler Carruth: शानदार जवाब! लेकिन क्या आप इसे अपडेट कर सकते हैं, अगर कुछ भी बदल गया है? मैं आपकी सभी चेतावनियों का उपयोग आपकी अंतिम सूची में कर रहा हूं, लेकिन हो सकता है कि कुछ को पहले ही वेक्स्ट्रा में स्थानांतरित कर दिया गया हो?
गार्टनरीज

यह एक उत्कृष्ट पोस्ट है। लेकिन नई चेतावनी खोजना, मैंने पाया है, एक ध्वज के लिए एक बहुत अच्छा उपयोग है, इसलिए मैं निराश हूं कि आप "सब कुछ" समूह के प्रति नकारात्मक रूप से निपटाए गए हैं, यह स्वीकार करने के बावजूद कि यह इस तरह के अन्वेषण के लिए उपयोगी है।
काइल स्ट्रैंड

@ चांडलर कारूथ: मैं "वास्तव में कभी सही नहीं" कोड के बारे में चेतावनी के पीछे तर्क से सहमत हूं। यह सिर्फ इतना ही नहीं है कि -Wnoस्विच ऑफ नहीं होने warn_no_constructor_for_refconst से इसे Boost.ConceptCheck और alike: github.com/boostorg/concept_check/blob/…
mloskot

2

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


1
जवाब के लिए धन्यवाद। दुर्भाग्य से, -Wallकेवल बुनियादी चेतावनी प्रदान करता है। बहुत सारे मौजूदा चेतावनी झंडे को कवर नहीं किया गया है -Wall, इसलिए मेरे प्रश्न में सूची है।
मकाडे

0

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

एक बात जो कई प्रोग्रामर एडवोकेट करते हैं, "बिल्ड वार्निंग ऐज़ एरर्स" (-वेरर) विकल्प को चालू करते हैं ताकि बिल्ड को सफलता के साथ पूरा होने से रोका जा सके अगर कोई चेतावनी हो।


जवाब के लिए धन्यवाद! मैं इससे सहमत हूं -Werror। वास्तव में, के रूप में मैं बजना उपयोग कर रहा हूँ, मैं चेतावनी pragmas का उपयोग कर (#pragma बजना नैदानिक) इन सभी का सेट, और वे घातक त्रुटियों की तैयारी में हैं, तो यह रूप में ही है -Werror:)
Macmade

0

मुझे लगता है कि लोगों को चेतावनी के बारे में परवाह करने वाले सबसे अच्छे सबूत यह तथ्य है कि वे मौजूद हैं और व्यापक रूप से उपयोग किए जाते हैं। मैं इस राय का दृढ़ता से पालन करता हूं कि संकलित समय के दौरान अधिक त्रुटियां पकड़ी गईं, बेहतर। यदि यह एक व्यापक रूप से आयोजित विश्वास नहीं था, तो हर कोई कमजोर गतिशील रूप से टाइप की जाने वाली भाषाओं का उपयोग कर रहा होगा, क्योंकि उनके संकलक या दुभाषिए आपको बहुत अधिक लाभ प्रदान करते हैं। इसके विपरीत, यहां तक ​​कि भाषाओं की स्क्रिप्टिंग पर भी strictझंडे का उपयोग लोकप्रिय है। स्थिर रूप से दृढ़ता से टाइप की गई भाषाओं में न केवल लोग -Wall -Werrorअक्सर उपयोग करते हैं, बल्कि वे अक्सर चेतावनी को इतना मूल्यवान पाते हैं कि वे और भी अधिक चाहते हैं , इसलिए वे कवरेज जैसे स्थैतिक विश्लेषण टूल का भुगतान करते हैं जिसका एकमात्र उद्देश्य चेतावनी प्रदान करना है।

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

node = node; // Shut up compiler warning

आपके उत्तर के लिए धन्यवाद। समस्या यह है कि मैं अक्सर लोगों को बिना काम करते हुए देखता हूं -Werror, और वास्तव में संकलक द्वारा जारी की गई चेतावनी को अनदेखा कर रहा हूं । या अगर वे करते हैं, तो वे आमतौर पर से चिपके रहते हैं -Wall। मेरे प्रश्न में प्रदान किए गए अधिकांश झंडे द्वारा कवर नहीं किया गया है -Wall, और मुझे व्यक्तिगत रूप से लगता है कि वे भी आवश्यक हैं। तो क्या मैं सिर्फ पागल हूं? ; )
Macmade

0

आम तौर पर, मैं और अधिक की ओर झुक जाता है, और निश्चित रूप से, इसमें भी विश्वास करता हूं, जिसमें -वायर भी शामिल है। एक मॉड्यूल को कभी भी चेतावनी की उम्मीद नहीं करनी चाहिए । आप अंततः एक और चेतावनी प्राप्त करेंगे और इसे याद करेंगे। और वह वही होगा जो वास्तव में एक समस्या है।

यह इस पर भी निर्भर करता है कि आप "-Wall -Werror" को किसी नए या पुराने प्रोजेक्ट में जोड़ रहे हैं। यदि यह नया है, तो इसके लिए जाएं और पूर्णता की मांग करें, अन्यथा आप शायद दिनों या हफ्तों के संपादन और परीक्षण के लिए हैं। मैंने ऐसा कुछ पुराने प्रोजेक्ट पर किया था और मैंने चेतावनियों को हटाने में दो या तीन दिन बिताए। मुझे लगता है कि कोड अब क्लीनर है।

दूसरे शब्दों में, यह कोशिश करो और देखो।

भिखारिन


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