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