উদ্দেশ্য-সি বিকাশের জন্য ঝুঁকির সতর্কতা পতাকা


86

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

আমি ব্যক্তিগতভাবে মনে করি এটি প্রকৃতপক্ষে কোডিং দক্ষতার উন্নতি করতে পারে, সেই সাথে সম্ভাব্য কোড বহনযোগ্যতা, কিছু সমস্যা রোধ করতে পারে কারণ এটি আপনাকে প্রতিটি সামান্য বিশদ, সম্ভাব্য বাস্তবায়ন এবং আর্কিটেকচার সম্পর্কিত বিষয়গুলি সম্পর্কে সচেতন হতে বাধ্য করে ...

আপনি অভিজ্ঞ প্রোগ্রামার হওয়া সত্ত্বেও এটিও আমার মতে প্রতিদিনের শেখার একটি ভাল সরঞ্জাম।

এই প্রশ্নের বিষয়গত অংশের জন্য, আমি এই বিষয়টি সম্পর্কে অন্যান্য বিকাশকারীদের (মূলত সি, অবজেক্টিভ-সি এবং সি ++) শুনতে আগ্রহী।
আপনি কি পেডেন্টিক সতর্কতা ইত্যাদির মতো জিনিসগুলির বিষয়ে যত্নশীল হন? এবং যদি হ্যাঁ বা না, তবে কেন?

এখন অবজেক্টিভ-সি সম্পর্কে, আমি সম্প্রতি সম্পূর্ণরূপে জিসিসির পরিবর্তে এলএলভিএম সরঞ্জামচেনে (ক্ল্যাং সহ) স্যুইচ করেছি ।

আমার প্রোডাকশন কোডে, আমি সাধারণত এই সতর্কতা পতাকাগুলি সেট করি (স্পষ্টতই, তাদের মধ্যে কিছুগুলি-ওয়াল দ্বারা আবৃতও হতে পারে):

  • -Wall
  • -Wbad ফাংশনের ঢালাই
  • -Wcast-সারিবদ্ধ
  • -Wconversion
  • -Wdeclaration-পরে বিবৃতি
  • -Wdeprecated-বাস্তবায়নের
  • -Wextra
  • -Wfloat-সমান
  • -Wformat = 2
  • -Wformat-nonliteral
  • -Wfour-অক্ষর-ধ্রুবক
  • -Wimplicit-পারমাণবিক-বৈশিষ্ট্য
  • -Wmissing-ধনুর্বন্ধনী
  • -Wmissing-ঘোষণা
  • -Wmissing ক্ষেত্র initializers
  • -Wmissing-বিন্যাসে-অ্যাট্রিবিউট
  • -Wmissing-noreturn
  • -Wmissing-এগুলির নমুনা
  • -Wnested-externs
  • -Wnewline-ফাইলের শেষে
  • -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
আমি সম্ভবত এটি স্ট্যাক ওভারফ্লোতে থাকার কথা বলার জন্য প্রলুব্ধ হলাম, যেহেতু এটি সরঞ্জামের ব্যবহার সম্পর্কে একধরণের প্রশ্ন, তবে আমরা দেখব কীভাবে সম্প্রদায়টি পরিবর্তন হয়।
অ্যাডাম শিখুন

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

ভাল, আমি আশা করি আমরা আপনাকে একটি ভাল উত্তর দিতে পারি। শুভকামনা। :)
অ্যাডাম শিখুন

সি এবং জিসিসি-র জন্য -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দরকারী সতর্কতাগুলির চেয়ে বেশি "স্প্যাম" দেয় :)
15

উত্তর:


158

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

টিএল; ডিআর সংস্করণ: আপনি যে কোনও নতুন কোড বিকাশ করছেন তাতে দয়া করে কমপক্ষে -Wallএবং ব্যবহার -Werrorকরুন। আমরা (সংকলক বিকাশকারী) এখানে যথাযথ কারণে সতর্কতা যুক্ত করি: তারা বাগ খুঁজে পায়। যদি আপনি কোনও সতর্কতা পান যা আপনার জন্য বাগগুলি ধরে, তবে এটিও চালু করুন। -Wextraগুচ্ছ প্রার্থীদের একগুচ্ছ এখানে চেষ্টা করুন। যদি সেগুলির মধ্যে একটি আপনার পক্ষে লাভজনকভাবে ব্যবহার করার জন্য খুব কোলাহলপূর্ণ হয় তবে একটি বাগ ফাইল করুন । যদি আপনি এমন একটি কোড লিখেন যাতে একটি "সুস্পষ্ট" বাগ থাকে তবে সংকলক এটি সম্পর্কে সতর্ক করে না, একটি বাগ ফাইল করুন।

দীর্ঘ সংস্করণ জন্য এখন। সতর্কতামূলক পতাকা গ্রুপিংয়ের বিষয়ে প্রথমে কিছু ব্যাকগ্রাউন্ড। ক্ল্যাংয়ে সতর্কতাগুলির অনেকগুলি "গ্রুপিং" রয়েছে (এবং জিসিসিতে সীমিত পরিমাণে)। এই আলোচনার সাথে প্রাসঙ্গিক কিছু:

  • অন-ডিফল্ট: আপনি স্পষ্টভাবে এগুলি অক্ষম না করা পর্যন্ত এই সতর্কতাগুলি সর্বদা চালু থাকে।
  • -Wall: এই সতর্কতা যে বিকাশকারীদের তাদের মান এবং একটি কম মিথ্যা-ইতিবাচক হার উভয় উপর উচ্চ আস্থা আছে।
  • -Wextra: এগুলি হ'ল সতর্কতা যা মূল্যবান এবং দৃ sound় বলে মনে করা হয় (যেমন, তারা বগি নয়) তবে তাদের উচ্চ ভুয়া-ইতিবাচক হার বা সাধারণ দার্শনিক আপত্তি থাকতে পারে।
  • -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.

এখানে এই সতর্কতাটি পাওয়ার জন্য কোনও পতাকার প্রয়োজন ছিল না। যুক্তিটি হ'ল এই কোডটি কখনও সত্যই সঠিক নয়, সতর্কতাকে উচ্চ মান দেয় এবং সতর্কবার্তাটি কেবল কোডে আগুন দেয় যা ক্ল্যাং প্রমাণ করতে পারে যে এই বালতিতে পড়েছে, এটি একটি শূন্য মিথ্যা-ইতিবাচক হার দেয় giving

% 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এই সতর্কতার জন্য ঝনঝন পতাকা প্রয়োজন requires কারণটি হ'ল সেখানে একটি অ-তুচ্ছ পরিমাণের কোড রয়েছে যা ব্যবহার করা হয়েছে (ভাল বা অসুস্থের জন্য) কোড প্যাটার্নটি আমরা ইচ্ছাকৃতভাবে একটি অবিচ্ছিন্ন মান উত্পাদন করতে সতর্ক করছি । দার্শনিকভাবে, আমি এর কোনও অর্থ দেখতে পাচ্ছি না, তবে অনেকেই একমত নন এবং মতামতের মধ্যে এই পার্থক্যের বাস্তবতা হ'ল -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সাধারণত সক্রিয় বিকাশের অধীনে বা সক্রিয় বাগ সহ সতর্কতা। হয় সেগুলি স্থির করে যথাযথ পতাকার নীচে স্থাপন করা হবে, বা সেগুলি সরানো উচিত।

এই বিষয়গুলি কীভাবে ক্ল্যাংয়ের সাথে কাজ করে তা এখন আমাদের বোঝার পরে আসুন আসল প্রশ্নটিতে ফিরে আসার চেষ্টা করুন: আপনার বিকাশের জন্য আপনার কী সতর্কতা চালু করা উচিত? উত্তরটি, দুর্ভাগ্যক্রমে, এটি নির্ভর করে। আপনার অবস্থার জন্য কী সতর্কতা সবচেয়ে ভাল কাজ করে তা নির্ধারণে সহায়তা করতে নিম্নলিখিত প্রশ্নগুলি বিবেচনা করুন।

  • আপনার সমস্ত কোডের কি আপনার নিয়ন্ত্রণ রয়েছে, বা এটির কিছুটি বাহ্যিক?
  • তোমার লক্ষসমুহ কি? বাগগুলি ধরা, না আরও ভাল কোড লিখতে?
  • আপনার মিথ্যা-ইতিবাচক সহনশীলতা কী? আপনি কি নিয়মিত সতর্কতা নিঃশব্দ করতে অতিরিক্ত কোড লিখতে রাজি হন?

প্রথম এবং সর্বাগ্রে আপনি যদি কোডটি নিয়ন্ত্রণ না করেন তবে সেখানে অতিরিক্ত সতর্কতা সরিয়ে দেওয়ার চেষ্টা করবেন না। কিছু বন্ধ করার জন্য প্রস্তুত থাকুন। বিশ্বে প্রচুর বাজে কোড রয়েছে এবং আপনি এগুলি সব ঠিক করতে সক্ষম নাও হতে পারেন। ঠিক আছে। আপনার নিয়ন্ত্রণ করা কোডটিতে আপনার প্রচেষ্টা ফোকাস করার উপায় খুঁজে বের করার জন্য কাজ করুন ।

এর পরে, আপনার সতর্কতাগুলির বাইরে আপনি কী চান তা নির্ধারণ করুন। এটি বিভিন্ন লোকের জন্য আলাদা। ব্লেগগুলি বিগ ব্যাগ, বা কোড প্যাটার্নগুলির জন্য কোনও বিকল্প ছাড়াই সতর্ক করার চেষ্টা করবে যার জন্য আমাদের দীর্ঘ historicalতিহাসিক নজির রয়েছে যা নির্দেশ করে যে বাগের হার অত্যন্ত উচ্চ। সক্ষম করে -Wallআপনি ক্ল্যাং বিকাশকারীরা সি ++ কোডে পালন করা সর্বাধিক সাধারণ ভুলগুলি ধরার লক্ষ্যবস্তু সতর্কতার অনেক বেশি সেট পেতে যাচ্ছেন get তবে এই উভয়ের সাথে ভুয়া-পজিটিভ হারটি বেশ কম থাকতে হবে।

অবশেষে, আপনি যদি প্রতিটি ঘুরে * ভুয়া-পজিটিভ * কে নীরব করতে পুরোপুরি ইচ্ছুক হন তবে যান -Wextra। আপনি যদি সতর্কতাগুলি দেখেন যা সত্যিকারের বাগগুলি প্রচুর পরিমাণে ধরেছে তবে এর মধ্যে নির্বোধ বা অর্থহীন মিথ্যা ধনাত্মক চিহ্ন রয়েছে তবে ফাইলগুলি বাগ করুন। আমরা ভুল-ধনাত্মকতা এড়াতে পারি -Wextraএমন -Wallজায়গায় আরও বেশি বাগ-ফাইন্ডিং যুক্তি আনার উপায়গুলি অনুসন্ধান করার জন্য ক্রমাগত কাজ করছি ।

অনেকে দেখতে পাবেন যে এই বিকল্পগুলির কোনওটিই তাদের পক্ষে ঠিক-সঠিক নয়। গুগলে, -Wallপ্রচুর বিদ্যমান কোড যা সতর্কতা লঙ্ঘন করেছে সে কারণে আমরা কিছু সতর্কতা বন্ধ করে দিয়েছি । এগুলি দ্বারা সক্ষম না হওয়া সত্ত্বেও আমরা স্পষ্টভাবে কিছু সতর্কতাও চালু করেছি -Wall, কারণ তাদের কাছে আমাদের বিশেষ মূল্য রয়েছে। আপনার মাইলেজটি পৃথক হবে তবে সম্ভবত একইভাবে পরিবর্তিত হবে। এটি প্রায়শই কিছু না করে কয়েকটি কী সতর্কতা সক্ষম করার চেয়ে অনেক বেশি ভাল -Wextra

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

সতর্কবার্তা (যা উভয় অন্তর্ভুক্ত ওপি এর তালিকার -Wallএবং -Wextra) কেবলমাত্র নিচের সতর্কবার্তা হয় না ঐ দুই গ্রুপ দ্বারা আচ্ছাদিত (অথবা ডিফল্ট ভাবে চালু করেছেন)। প্রথম গোষ্ঠী জোর দিয়েছিল যে কেন স্পষ্টত সতর্কতা পতাকার উপর অতিরিক্ত নির্ভরতা খারাপ হতে পারে: এগুলির কোনওটি এমনকি ঝনঝনায় প্রয়োগ করা হয় না! তারা কেবল জিসিসি সামঞ্জস্যের জন্য কমান্ড লাইনে স্বীকৃত।

  • -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করা এতই বিস্তৃত যে সম্ভবত এটি ভবিষ্যতের জন্য সম্ভবত তার নিজস্ব "শীর্ষ স্তর" বিভাগে থাকবে। কিছু অন্যান্য সতর্কতা যা জিসিসির কাছে রয়েছে তবে যার মূল্য কম এবং উচ্চ ভুয়া-পজিটিভ হার রয়েছে একই জাতীয়-মান-জমিতে লিখিত হতে পারে।

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

আমি আশা করি এটি ক্ল্যাংয়ের সাথে সতর্কবার্তা পরিস্থিতি স্পষ্ট করে এবং তাদের ব্যবহারের জন্য বা তাদের সংস্থার ব্যবহারের জন্য সতর্কতার একটি সেট বাছাই করার চেষ্টা করা লোকদের জন্য কিছু অন্তর্দৃষ্টি সরবরাহ করে।


8
অসামান্য উত্তর! অনেক ধন্যবাদ. আমি এটি কয়েকবার পুনরায় পড়তে হবে, তবে আমি কিছু মন্তব্য দিয়ে শীঘ্রই ফিরে আসব। আবার ধন্যবাদ!
ম্যাকমেড

1
@ চ্যান্ডলার ক্যারুথ: দুর্দান্ত উত্তর! তবে আপনি কি এটি আপডেট করতে পারবেন, যদি কিছু বদলে যায়? আমি আপনার শেষ তালিকায় আপনার সমস্ত সতর্কতাগুলি ব্যবহার করছি, তবে সম্ভবত কিছু ইতিমধ্যে ওয়েক্স্ট্রায় সরানো হয়েছে?
গার্টেনরিজ

এটি একটি চমৎকার পোস্ট. তবে নতুন সতর্কতা সন্ধান করা হ'ল, আমি পেয়েছি, একটি পতাকার জন্য অত্যন্ত কার্যকর ব্যবহার, সুতরাং আমি হতাশ হয়েছি যে আপনি "সবকিছু" গোষ্ঠীর প্রতি এতটা নেতিবাচকভাবে নিষ্পত্তি হয়ে গেছেন, স্বীকার করেও যে এটি এই ধরণের অনুসন্ধানের জন্য কার্যকর।
কাইল স্ট্র্যান্ড

@ চ্যান্ডলার ক্যারুথ: "সত্যই কখনই সঠিক হবে না" কোড সম্পর্কে সতর্ক করার পিছনে যুক্তির সাথে আমি একমত। এটি ঠিক যে -Wnoসুইচ অফ না করার কারণে warn_no_constructor_for_refconst পিটা বুস্ট ব্যবহার করতে পারবেন on কনসেপ্টচেক এবং একইভাবে: github.com/boostorg/concept_check/blob/…
mloskot

2

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


1
উত্তরের জন্য ধন্যবাদ. দুর্ভাগ্যক্রমে, -Wallকেবলমাত্র প্রাথমিক সতর্কতা সরবরাহ করে। প্রচুর বিদ্যমান সতর্কতা পতাকাগুলি কভার করে না -Wall, তাই আমার প্রশ্নের তালিকায় রয়েছে।
ম্যাকমেড

0

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

একটি প্রোগ্রাম যা অনেক প্রোগ্রামার অ্যাডভোকেট "সতর্কতা হিসাবে ত্রুটি হিসাবে ট্রিট করুন" (-অরবার) বিকল্প চালু করে যদি কোনও সতর্কতা থাকে তবে সাফল্যের সাথে বিল্ডগুলি সম্পূর্ণ হতে বাধা দিতে।


উত্তরের জন্য ধন্যবাদ! আমি একমত -Werror। প্রকৃতপক্ষে, আমি কলং ব্যবহার করছি, আমি প্রাগমাস (# প্রগমা ক্ল্যাং ডায়াগনস্টিক) ব্যবহার করে এই সমস্ত সতর্কতাগুলি সেট করেছিলাম এবং সেগুলি মারাত্মক -Werror
ত্রুটিতে

0

আমি মনে করি যে সতর্কতার বিষয়ে লোকেরা সবচেয়ে ভাল প্রমাণ দেয় তা হ'ল তাদের বিদ্যমান এবং এটি ব্যাপকভাবে ব্যবহৃত হয়। আমি দৃ strongly়তার সাথে মতামত করছি যে সংকলনের সময় যত বেশি ত্রুটি ধরা পড়ে তত ভাল। যদি এটি একটি বহুল আলোচিত বিশ্বাস না হয়, তবে প্রত্যেকে দুর্বল গতিযুক্ত টাইপযুক্ত ভাষা ব্যবহার করবে, কারণ তাদের সংকলক বা দোভাষী আপনাকে আরও অনেক বেশি ছাড় দেয়। বিপরীতে, এমনকি স্ক্রিপ্টিং ভাষায়ও strictপতাকা ব্যবহার জনপ্রিয়। স্ট্যাটিক দৃ strongly়ভাবে টাইপ করা ভাষায় কেবল লোকেরা -Wall -Werrorপ্রায়শই ব্যবহার করে না , তবে তারা প্রায়শই সতর্কতাগুলিকে এত মূল্যবান বলে মনে করে যে তারা আরও বেশি চায় , তাই তারা ক্ল্যাটিটির মতো স্থির বিশ্লেষণ সরঞ্জামগুলির জন্য অর্থ প্রদান করে যার একমাত্র উদ্দেশ্য সতর্কতা প্রদান করে।

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

node = node; // Shut up compiler warning

আপনার উত্তরের জন্য ধন্যবাদ. সমস্যাটি হ'ল আমি প্রায়শই লোকজনকে ছাড়া কাজ করে দেখি -Werrorএবং সংকলক দ্বারা জারি করা সতর্কবাণীগুলি উপেক্ষা করি। বা যদি তারা তা করে তবে তারা সাধারণত অনড় থাকে -Wall। আমি আমার প্রশ্নে যে পতাকাগুলি সরবরাহ করি সেগুলির বেশিরভাগগুলি আচ্ছাদিত নয় -Wallএবং আমি ব্যক্তিগতভাবে মনে করি সেগুলিও অপরিহার্য। তাহলে আমি কি শুধু ভৌতিক? ; )
ম্যাকমেড

0

সাধারণত, আমি ওয়াল-এর দিকে আরও ঝুঁকিতে পড়েছি এবং স্পষ্টতই-ওয়ারার-এও বিশ্বাস করি। একটি মডিউল কখনও সতর্কতা আশা করা উচিত নয় । আপনি অবশেষে অন্য একটি সতর্কতা পাবেন এবং এটি মিস করবেন। এবং এটি হ'ল যা আসলে সমস্যা।

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

অন্য কথায়, এটি চেষ্টা করে দেখুন।

কামুক


1
আপনি যদি কেবল উদ্বিগ্ন হন -Wallএবং -Werror, আমার ধারণা আপনার প্রশ্নটি পুনরায় পড়তে হবে। প্রচুর সতর্কতামূলক পতাকা কভার করা হয় না -Wall। যাইহোক, উত্তরের জন্য ধন্যবাদ।
ম্যাকমেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.