পুরোপুরি এবং ভার্বোজ জি ++ সতর্কতা সক্ষম করতে পতাকাগুলি


122

প্রায়শই সি এর অধীনে 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++? (আমি জানি তাদের মধ্যে অনেকগুলি একই হবে))


69
কি জিসিসি চাহিদা (যেহেতু blatantly করার সিদ্ধান্ত নিয়েছে এর মিথ্যা সম্পর্কে -Wall) একটি হল -Wbloody_everythingপতাকা :-)
paxdiablo

আপনি আপনার প্রশ্নটিকে ডুপ হিসাবে চিহ্নিত করতে পারেন তবে আপনি আপনার শেষ সম্পাদনাটি উত্তর হিসাবে রাখতে পারেন যেহেতু আপনি আসলে আপনার প্রশ্নের উত্তর দিয়েছেন। এবং আমি তখন এটি
উজ্জীবিত

4
ওপি এবং @ প্যাক্সিয়াব্লো: জিসিসি ধারাবাহিকভাবে এই ধরণের জিনিস প্রত্যাখ্যান করেছে , তবে এটি ক্ল্যাংয়ের মাধ্যমে পাওয়া যায় -Weverything। আমি পড়েছি যে এমনকি কলং ++ বিকাশকারীরা ব্যবহারকারীরা এটি চালু করার বিষয়ে কিছুটা উদ্বিগ্ন; স্পষ্টতই এটি কেবল অভ্যন্তরীণ বিকাশের ব্যবহারের জন্যই ছিল। যদিও এটি কোনও তাত্পর্যপূর্ণ নয়, কারণ আপনি -Weverythingসম্ভবত জানেন না যে সম্ভাব্য সহায়ক সতর্কবাণীগুলি আবিষ্কার করার সম্ভবত সর্বোত্তম সম্ভাব্য উপায়।
কাইল স্ট্র্যান্ড

1
ওপি এবং @ প্যাক্সিয়াব্লো প্রদত্ত জিসিসি সংস্করণের জন্য সতর্কতার সম্পূর্ণ তালিকাটি বের করার একটি উপায় রয়েছে: github.com/barro/compiler- সতর্কতা
কাইল স্ট্র্যান্ড

উত্তর:


138

আমি সর্বনিম্ন সেটটি পেয়েছি এবং এতে অন্তর্ভুক্ত রয়েছে যে সর্বাধিক সতর্কতার স্তরের হওয়া উচিত। তারপরে আমি সেই তালিকা থেকে সতর্কবার্তাগুলির সেটটি সরিয়ে দিয়েছিলাম যা আমার মনে হয় যে আসলে খারাপ কিছু ঘটছে তা নির্দেশ করে না, অন্যথায় সত্যিকারের বিল্ডে ব্যবহার করার মতো অনেকগুলি ভুয়া ইতিবাচকতা রয়েছে। আমি বাদ দিয়েছিলাম এমন প্রত্যেককে কেন বাদ দেওয়া হয়েছিল তা নিয়ে আমি মন্তব্য করেছি। এটি প্রস্তাবিত সতর্কবার্তাগুলির আমার চূড়ান্ত সেট:

-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.0f এ সেট করেছি (যেহেতু আমার সমস্যাটি কেবল ইতিবাচক সংখ্যা ব্যবহার করে, -1 ডোমেনের বাইরে রয়েছে)। আমি পরে যেতে এবং আপডেট -1.0f মান। এটি অপারেশনের একটি পৃথক পদ্ধতিতে নিজেকে সহজে leণ দেয় না। আমি সন্দেহ করি যে বেশিরভাগ লোকের এই সমস্যা নেই এবং ভাসমান পয়েন্টে একটি সঠিক সংখ্যার তুলনা করা সম্ভবত একটি ত্রুটি, তাই আমি এটি ডিফল্ট তালিকায় অন্তর্ভুক্ত করছি।

  • -Wold-style-castআমি ব্যবহার করছি লাইব্রেরি কোডে অনেক মিথ্যা ইতিবাচক রয়েছে। বিশেষত, নেটওয়ার্কিংয়ে ব্যবহৃত ফাংশনগুলির এইচটনল পরিবার, পাশাপাশি আমি ব্যবহার করছি একটি রিজান্ডেল (এইএস) এনক্রিপশন বাস্তবায়নের ক্ষেত্রে পুরানো স্টাইলের ক্যাসেট রয়েছে যা এটি আমাকে সতর্ক করে দেয়। আমি এই উভয়টি প্রতিস্থাপনের ইচ্ছা করি, তবে আমার কোডে অন্য কোনও অভিযোগ রয়েছে কিনা তা সম্পর্কে আমি নিশ্চিত নই। যদিও বেশিরভাগ ব্যবহারকারীর ডিফল্টরূপে এটি সম্ভবত থাকা উচিত।

  • -Wsign-conversionখুব শক্ত ছিল (এবং প্রায়শই তালিকা তৈরি করে নি)। এটি আমার কোডটিতে চালু করা বিপুল পরিমাণ সতর্কতা (100+) জেনারেট করেছে। তাদের প্রায় সবাই নির্দোষ ছিল। যাইহোক, আমি যেখানেই নিশ্চিত ছিলাম স্বাক্ষরিত পূর্ণসংখ্যাগুলি ব্যবহার করার বিষয়ে আমি সাবধানতা অবলম্বন করেছি, যদিও আমার বিশেষ সমস্যা ডোমেনের জন্য আমি সাধারণত প্রচুর পরিমাণে পূর্ণসংখ্যা বিভাগের কারণে স্বাক্ষরবিহীন মানগুলি ব্যবহার করে সামান্য দক্ষতা বৃদ্ধি পেতে পারি। আমি এই দক্ষতা ত্যাগ করেছি কারণ আমি দুর্ঘটনাক্রমে একটি স্বাক্ষরযুক্ত পূর্ণসংখ্যাকে একটি স্বাক্ষরবিহীন স্বাক্ষরকারীকে উন্নত করা এবং তারপরে বিভাজন সম্পর্কে উদ্বিগ্ন ছিলাম (যা নিরাপদ নয়, সংযোজন, বিয়োগফল এবং গুণনের বিপরীতে)। এই সতর্কতাটি চালু করা আমাকে আমার বেশিরভাগ ভেরিয়েবলগুলি স্বাক্ষরবিহীন প্রকারে নিরাপদে পরিবর্তন করতে এবং অন্য কয়েকটি জায়গায় কয়েকটি ক্যাসেট যুক্ত করার অনুমতি দেয়। এটি বর্তমানে ব্যবহার করা কিছুটা শক্ত কারণ সতর্কতাটি স্মার্ট নয়। উদাহরণস্বরূপ, আপনি যদিunsigned short + (integral constant expression), ফলাফলটি অন্তর্নিহিতভাবে ইনট এ প্রচারিত হয়। এটি তখন কোনও সম্ভাব্য সাইন সমস্যা সম্পর্কে সতর্ক করে যদি আপনি সেই মানটি নিরাপদ করেও unsignedবা তার জন্য নির্ধারিত করেন unsigned short। এটি অবশ্যই সমস্ত ব্যবহারকারীর জন্য সর্বাধিক optionচ্ছিক সতর্কতা।

  • -Wsign-promo: দেখুন -Wsign-conversion

  • -Wswitch-defaultঅর্থহীন বলে মনে হচ্ছে (আপনি সব সম্ভাব্যতার সুস্পষ্টভাবে গণনা করলে আপনি সর্বদা একটি ডিফল্ট কেস চান না)। তবে, এই সতর্কতাটি চালু করা এমন কিছু কার্যকর করতে পারে যা সম্ভবত একটি ভাল ধারণা। যেসব ক্ষেত্রে আপনি স্পষ্টভাবে তালিকাবদ্ধ সম্ভাবনাগুলি (তবে অন্যান্য সংখ্যাগুলি সম্ভব) ব্যতীত সমস্ত কিছু উপেক্ষা করতে চান, তারপরে প্রবেশ করুনdefault: break;এটি স্পষ্ট করতে। যদি আপনি স্পষ্টভাবে সমস্ত সম্ভাবনা গণনা করেন, তবে এই সতর্কতাটি চালু করা নিশ্চিত করে যে আপনি সম্ভাব্য সমস্ত বিকল্পকে প্রকৃত অর্থে আবৃত করেছেন তা নিশ্চিত করার জন্য আপনি দৃ as় (মিথ্যা) মতো কিছু রেখেছিলেন। এটি আপনাকে আপনার সমস্যার ডোমেনটি কী তা স্পষ্ট করে দেয় এবং এটি প্রোগ্রামাগুলিভাবে প্রয়োগ করে। যাইহোক, আপনি যে কোনও জায়গায় কেবল দাবী (মিথ্যা) স্টিকিংয়ের ক্ষেত্রে যত্নবান হতে হবে। এটি ডিফল্ট কেস দিয়ে কিছু না করার চেয়ে ভাল, তবে যথারীতি দৃ usual়তার সাথে, এটি রিলিজ বিল্ডগুলিতে কাজ করবে না। অন্য কথায়, আপনি যে নম্বরগুলি পেয়েছেন তা বলার জন্য আপনি এটির উপর নির্ভর করতে পারবেন না, বলুন, একটি নেটওয়ার্ক সংযোগ বা কোনও ডাটাবেস যা আপনার উপর নিখুঁত নিয়ন্ত্রণ নেই। ব্যতিক্রম বা তাড়াতাড়ি প্রত্যাবর্তন হ'ল এটি পরিচালনা করার সেরা উপায় (তবে এখনও আপনার ডিফল্ট কেস হওয়া দরকার!)।

  • -Werrorআমার জন্য একটি গুরুত্বপূর্ণ। একাধিক লক্ষ্যবস্তু সহ একটি বহু-থ্রেড বিল্ডে প্রচুর পরিমাণে সংকলন করার সময়, কোনও সতর্কতার দ্বারা পিছলে যাওয়া সহজ। সতর্কতাগুলিকে ত্রুটিতে পরিণত করা নিশ্চিত করে যে আমি সেগুলি লক্ষ্য করেছি।

তারপরে এমন একটি সতর্কতা রয়েছে যা উপরের তালিকার অন্তর্ভুক্ত নয় কারণ আমি সেগুলি কার্যকর হতে পেলাম না। আমি কেন সেগুলিকে ডিফল্ট তালিকায় অন্তর্ভুক্ত করছি না সে সম্পর্কে এই সতর্কতা এবং আমার মন্তব্যগুলি:

অনুপস্থিত সতর্কতা:

  • -Wabiপ্রয়োজন নেই কারণ আমি বিভিন্ন সংকলক থেকে বাইনারি একত্রিত করছি না। আমি যাইহোক এটির সাথে সংকলনের চেষ্টা করেছি, এবং এটি ট্রিগার হয়নি, সুতরাং এটি অযথা ভারবস বলে মনে হয় না।

  • -Waggregate-returnএমন কিছু নয় যা আমি একটি ত্রুটি হিসাবে বিবেচনা করি। উদাহরণস্বরূপ, ক্লাসগুলির কোনও ভেক্টরের লুপের জন্য একটি পরিসীমা-ভিত্তিক ব্যবহার করার সময় এটি ট্রিগার করে। রিটার্ন মান অপ্টিমাইজেশনের এর কোনও নেতিবাচক প্রভাবের যত্ন নেওয়া উচিত।

  • -Wconversionএই কোডটিতে ট্রিগারগুলি: short n = 0; n += 2;ইন্টিতে অন্তর্নিহিত রূপান্তরটি একটি সতর্কতার কারণ হয়ে দাঁড়ায় যখন এটি তার টার্গেটের ধরণে ফিরে আসে।

  • -Weffc++সমস্ত ডেটা সদস্যকে আরম্ভকারী তালিকায় আরম্ভ না করা হলে একটি সতর্কতা অন্তর্ভুক্ত। আমি ইচ্ছাকৃতভাবে অনেক ক্ষেত্রে এটি করি না, তাই সতর্কতার সেটটি খুব কার্যকর না হওয়ার জন্য বিশৃঙ্খলাযুক্ত। এটি একবারে একবারে চালু করা এবং অন্যান্য সতর্কতাগুলির জন্য স্ক্যান করতে সহায়ক, যদিও (যেমন বেস বেসগুলির ভার্চুয়াল ডেস্ট্রাক্টর)। এটি -Wallনিজের একক সতর্কতার পরিবর্তে সতর্কতাগুলির সংগ্রহ (যেমন ) এর সংগ্রহ হিসাবে বেশি কার্যকর হবে ।

  • -Winlineঅনুপস্থিত কারণ আমি শিরোনামগুলিতে কেবল ইনলাইন ফাংশন সংজ্ঞায়িত করতে অনুকূলকরণের উদ্দেশ্যে ইনলাইন কীওয়ার্ডটি ব্যবহার করি না। অপ্টিমাইজারটি আসলে এটি ইনলাইন করে কিনা আমার কিছু যায় আসে না। এই সতর্কবার্তাটিও অভিযোগ করে যে এটি কোনও শ্রেণীর সংস্থায় ঘোষিত কোনও ফাংশন (যেমন একটি খালি ভার্চুয়াল ডেস্ট্রাক্টর) ইনলাইন করতে না পারে।

  • -Winvalid-pch অনুপস্থিত কারণ আমি প্রম্পম্পাইল্ড শিরোনাম ব্যবহার করি না।

  • -Wmissing-format-attributeব্যবহার করা হয় না কারণ আমি gnu এক্সটেনশন ব্যবহার করি না। একই সাথে -Wsuggest-attributeএবং আরও বেশ কয়েকজন

  • এর অনুপস্থিতির জন্য সম্ভাব্য উল্লেখযোগ্য -Wno-long-long, যা আমার কোনও প্রয়োজন নেই। আমি -std=c++0x( -std=c++11জিসিসি 4.7 এ) সংকলন করি , এতে long longপূর্ণসংখ্যার প্রকার অন্তর্ভুক্ত থাকে । যারা সি ++ 98 / সি ++ 03 এ পিছনে আটকে রয়েছে তারা সতর্কতা তালিকা থেকে এই বাদটি যুক্ত করার কথা বিবেচনা করতে পারে।

  • -Wnormalized=nfc ইতিমধ্যে ডিফল্ট বিকল্প, এবং সেরা বলে মনে হচ্ছে।

  • -Wpaddedক্লাসগুলির বিন্যাসটি অনুকূলকরণের জন্য মাঝেমধ্যে চালু করা হয় তবে এটি চালিত হয় না কারণ শেষদিকে প্যাডিং সরানোর জন্য সমস্ত শ্রেণীর পর্যাপ্ত উপাদান নেই। তত্ত্বে আমি 'ফ্রি' এর জন্য কিছু অতিরিক্ত ভেরিয়েবল পেতে পারি, তবে এটি বজায় রাখার অতিরিক্ত প্রচেষ্টার পক্ষে মূল্য নেই (যদি আমার শ্রেণীর আকার পরিবর্তন হয় তবে আগের ফ্রি ভেরিয়েবলগুলি অপসারণ করা সহজ নয়)।

  • -Wstack-protector আমি ব্যবহার করি না কারণ ব্যবহার করা হয় না -fstack-protector

  • -Wstrict-aliasing=3চালু রয়েছে -Wallএবং এটি সবচেয়ে নির্ভুল, তবে মনে হচ্ছে লেভেল 1 এবং 2 আরও সতর্কতা দেয়। তাত্ত্বিকভাবে নিম্ন স্তরের একটি 'শক্তিশালী' সতর্কতা, তবে এটি আরও মিথ্যা ধনাত্মক ব্যয়ের জন্য। আমার নিজের পরীক্ষার কোডটি সমস্ত 3 স্তরের অধীনে পরিষ্কারভাবে সংকলিত হয়েছে।

  • -Wswitch-enumআমি চাই আচরণ নয়। আমি প্রতিটি সুইচ স্টেটমেন্ট স্পষ্টভাবে পরিচালনা করতে চাই না। ভাষাটি নির্দিষ্ট স্যুইচ স্টেটমেন্টগুলিতে এটি সক্রিয় করার জন্য কিছু ব্যবস্থা থাকলে (ভবিষ্যতে এনামে যে পরিবর্তনগুলি হওয়া উচিত তা সর্বত্র পরিচালনা করা হয় তা নিশ্চিত করতে) তবে এটি "অল-অ-কিছুই না" সেটিংসের জন্য ওভারকিল রয়েছে।

  • -Wunsafe-loop-optimizationsঅত্যধিক জালিয়াতি সতর্কবার্তা তৈরি করে। এটি পর্যায়ক্রমে এটিকে প্রয়োগ করা এবং ম্যানুয়ালি ফলাফলগুলি যাচাই করা কার্যকর হতে পারে। উদাহরণ হিসাবে, এটি আমার কোডে এই সতর্কতাটি তৈরি করেছিল যখন আমি কোনও ভেক্টরের সমস্ত উপাদানগুলিতে তাদের ফাংশনগুলির একটি সেট প্রয়োগ করতে (লুপের জন্য পরিসর-ভিত্তিক ব্যবহার করে) লুপ করেছি। এটি কনস্ট স্টাড :: স্ট্রিংয়ের কনস্ট কনট অ্যারের নির্মাণকারীর জন্যও সতর্ক করা হচ্ছে (যেখানে এটি ব্যবহারকারীর কোডে লুপ নয়)।

  • -Wzero-as-null-pointer-constantএবং -Wuseless-castহ'ল জিসিসি-৪.7-কেবলমাত্র সতর্কতা, যা আমি জিসিসি ৪.7 এ স্থানান্তরিত করার সময় যুক্ত করব।

এই গবেষণার কিছু ফলস্বরূপ আমি জিসিসিতে কয়েকটি বাগ রিপোর্ট / বর্ধনের অনুরোধ পেশ করেছি, সুতরাং আশা করি আমি শেষ পর্যন্ত "অন্তর্ভুক্ত নয়" তালিকার "অন্তর্ভুক্ত" তালিকার আরও সতর্কতা যুক্ত করতে সক্ষম হব । এই তালিকায় এই থ্রেডে উল্লিখিত সমস্ত সতর্কতা অন্তর্ভুক্ত রয়েছে (প্লাস আমি কয়েকটি অতিরিক্ত মনে করি)। এই পোস্টে স্পষ্টভাবে উল্লিখিত না হওয়া অনেকগুলি সতর্কতা আমি উল্লেখ করেছি এমন অন্য সতর্কতার অংশ হিসাবে অন্তর্ভুক্ত রয়েছে। যদি কেউ এই পোস্ট থেকে সম্পূর্ণভাবে বাদ দেওয়া কোনও সতর্কতা লক্ষ্য করে তবে আমাকে জানান।

সম্পাদনা: দেখে মনে হচ্ছে যে আমি বেশ কয়েকটি মিস করেছি (যা আমি এখন যোগ করেছি)। Http://gcc.gnu.org এ আসলে একটি দ্বিতীয় পৃষ্ঠা রয়েছে যা বেশ গোপন। সাধারণ সতর্কতা বিকল্প এবং সি ++ বিকল্প (সতর্কতার জন্য নীচে স্ক্রোল করুন)


আমি সম্প্রতি এই উত্তরের জন্য আমার গবেষণার উপর ভিত্তি করে একটি বর্ধনের অনুরোধ জমা দিয়েছি: gcc.gnu.org/bugzilla/show_bug.cgi?id=53313 । এটি সতর্কতা স্তর তৈরি করে সতর্কতা পরিস্থিতিকে নাটকীয়ভাবে সরল করবে। আমার প্রস্তাবনায়, আমার প্রস্তাবিত সতর্কতাগুলির সেটগুলি আনুমানিক -W4, -Winf তৈরির অতিরিক্ত প্রস্তাব সহ, যার অর্থ হ'ল - ওয়েভরিথিং-এবং -আই-সত্যই-অর্থ-এটি-এইবার
ডেভিড স্টোন

বর্ধিতকরণের অনুরোধ যা -প্যাডডের অংশটি প্রস্তাবিত তালিকায় যুক্ত হবে: gcc.gnu.org/bugzilla/show_bug.cgi?id=53514
ডেভিড স্টোন

বর্ধিতকরণের অনুরোধ যা -Weffc ++ এর কিছু অংশ প্রস্তাবিত তালিকায় যুক্ত হতে পারে: gcc.gnu.org/bugzilla/show_bug.cgi?id=16166
ডেভিড স্টোন

1
@ প্রেডেলনিক: এটি এর চেয়েও বেশি কৌশলযুক্ত। -Wswitch-enumআপনি যদি একটি স্যুইচে প্রতিটি গণনা মান স্পষ্টভাবে পরিচালনা defaultনা করেন এবং সুস্পষ্ট হিসাবে গণনা না করেন তবে সতর্ক করে । অন্যদিকে, -Wswitch-defaultযদি আপনার স্যুইচটিতে defaultকেস না থাকে তবে আপনাকে সতর্ক করে দিচ্ছে , এমনকি যদি আপনি সমস্ত সম্ভাব্য মানগুলি স্পষ্টভাবে আবৃত করে থাকেন।
ডেভিড স্টোন


39

ওহ, আমার সমস্ত মূল অনুসন্ধানগুলি কীভাবে সতর্কবাণীগুলি দমন করতে পারে ( 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

সুতরাং, আমি এটি একটি ভাল সূচনা পয়েন্ট মনে করি। বুঝতে পারি নি যে এটি একটি ডুপ, তবে অন্তত এটি গভীরভাবে কবর দেওয়া হয়েছিল। :-)


1
সম্ভবত, তবে এটি সংস্করণগুলির মধ্যে পরিবর্তিত হবে বলে মনে হচ্ছে, এবং সম্ভবত সূর্যের দাগ এবং আরএমএসের ঝকঝকিতে খুব বেশি স্পষ্ট হওয়া সম্ভবত ক্ষতি করবে না। এটি যাইহোক, একটি ভাল সূচনা পয়েন্ট।
Sdaz MacSkibbons

3
'কেস OPT_W' এর জন্য 4.5.2 এর সি-অপটস.সি. / অপ্টস.সি. এর দ্রুত গ্রেপ থেকে, আপনি অনুপস্থিত: কঠোর ওভারফ্লো, অপরিশোধিত, কঠোর নুল সেন্ডিনেল, নরমালাইজড, মাল্টিচার, অন্তর্নিহিত ফাংশন ঘোষণা, অবচিত, আন্ডিফ লেবেল, মন্তব্য এস , বিল্টিন ম্যাক্রো পুনরায় সংজ্ঞায়িত, এর চেয়ে বড়, একের চেয়ে বড়, আবী i এটি ক্রেজি যে তাদের তালিকা করার জন্য কোনও কমান্ড লাইন বিকল্প নেই।
টনি ডেলরয়

3
আমি মনে করি এটি ক্রেজিয়ার যা -Wallএটি প্রত্যাশা করে না তা করে না। তবে আপনাকে ধন্যবাদ, তাদের মধ্যে কিছু খুব দরকারী বলে মনে হচ্ছে!
Sdaz MacSkibbons

1
অক্ষম করার সতর্কতাগুলির এটির জায়গা রয়েছে। সর্বোপরি, তারা "সতর্কতা"। আরেকটি পরিস্থিতি হ'ল আপনি যখন একটি পতাকা সক্ষম করেন যা একাধিক সতর্কতা সক্ষম করে, তবে আপনি এটি সম্পর্কে নির্বাচনী হতে চান।
ট্যামস সেজেলি

1
আপনি কিভাবে ব্যবহার করতে সক্ষম -Waggregate-return? এটি আমাকে প্রতিটি ব্যবহারের জন্য একটি সতর্কতা দেয়begin/end()
ফ্লেফায়ারফায়ার

12

এর মধ্যে কিছু ইতিমধ্যে অন্তর্ভুক্ত করা হয়েছে -Wallবা -Wextra

সি এর জন্য একটি ভাল বেস সেটআপ হ'ল:

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

এবং সি ++ এর জন্য

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

( -Werrorযেহেতু -Weffc++কিছু বিরক্তি রয়েছে সেহেতু সি ++ এড়িয়ে যাওয়া )


10
-Werror নির্দিষ্ট ধরণের সতর্কতাগুলির জন্য অক্ষম করা যেতে পারে, উদাহরণস্বরূপ:-ওয়ারার-ওয়েফসি ++ -নো-ত্রুটি = effc ++
রবার্ট হেন্সিং

2
ansi : সি মোডে এটি সমান -std=c89। সি ++ মোডে এটি সমান -std=c++98। যেমন আপনি যদি অন্য কিছু নির্দিষ্ট করে থাকেন, তবে তা stdব্যবহার করবেন নাansi
সান ব্রেকেনরিজ

2

চেষ্টা

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

এটি একটি দ্রুত এবং নোংরা সূচনা যা অবশ্যই কিছু টিউনিংয়ের প্রয়োজন হবে; এক কিছুর জন্য, আপনি যদি নিজের ভাষার উপযুক্ত নাম দ্বারা সংকলককে কল করেন (যেমন g++সি ++ এর জন্য) তবে আপনি এমন সতর্কতা পাবেন যা সেই ভাষার ক্ষেত্রে প্রযোজ্য নয় (এবং সংকলকটি হাত বাড়িয়ে দেবে এবং আপনি অবিরত চালিয়ে যেতে অস্বীকার করবেন সতর্কতা অপসারণ)।

আরেকটি বিষয় হ'ল আমি যুক্ত করেছিলাম -Werror, কারণ আপনি যদি সতর্কবাণীগুলি ঠিক না করে থাকেন তবে সেগুলি চালু করার বিষয়ে কেন আপনার যত্ন? আপনি তালিকাটি থেকে সতর্কতাও নিতে পারেন। (উদাহরণস্বরূপ, আমি প্রায় কখনও -Waggregate-returnসি ++ ব্যবহার করি না ))

কিছু সতর্কতা অন্যান্য কার্য সম্পাদন সম্পর্কিত বিকল্পগুলি ( -Wstack-protector) ছাড়া কিছুই করবে না । -fdiagnostics-show-optionএবং জিসিসি ম্যানুয়ালটি আপনার বন্ধু।

যাইহোক, কিছু সতর্কতা পারস্পরিক একচেটিয়া; বিশেষত ব্যবহার -Wtraditionalএবং -Wold-style-definitionবরাবর -Werror, সংকলন করা হবে না।


0

আমার ক্লিয়নের CmakeLists.txt এ

cmake_minimum_required(VERSION 3.13)
project(cpp17)

set(CMAKE_CXX_STANDARD 17)

set(GCC_COVERAGE_COMPILE_FLAGS "-std=c++17 -Wall -Weffc++ -Wno-error=effc++ -pedantic \
 -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-newline-eof  \
-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")


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )

add_executable(cpp17 main.cpp)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.