কীভাবে (আক্ষরিক) জিসিসির সমস্ত সতর্কতা চালু করবেন?


194

আমি সক্ষম করতে চাই - আক্ষরিক - জিসিসির সমস্ত সতর্কতা। (আপনি মনে করেন এটি সহজ হবে ...)

  • আপনি ভাবেন -Wallযে কৌশলটি করতে পারেন, কিন্তু না! তবু দরকার -Wextra

  • আপনি ভাবেন -Wextraযে কৌশলটি করতে পারেন, কিন্তু না! এখানে তালিকাভুক্ত সমস্ত সতর্কতা (উদাহরণস্বরূপ -Wshadow) এটি দ্বারা সক্ষম নয়। এবং এই তালিকাটি বিস্তৃত কিনা আমার এখনও ধারণা নেই।

আমি কীভাবে জিসিসিকে এটির সমস্ত সতর্কতাগুলি (যদি নেই তবে, এবং এর, বা তবে!) সক্ষম করতে বলব ?


27
@ আরাফ্যাজিওন: আমি প্রশ্নটি সম্পর্কে "অস্পষ্ট" কি বুঝতে পারি না - হ্যাঁ, আমি প্যাডেন্টিক যাই হোক না কেন, আমার কোডের সাথে প্রযোজ্য সমস্ত সতর্কতাগুলি চালু করতে চাই । কারণ হিসাবে, এটি খুব সহজ: আমি এমন কিছু সতর্কতা পেয়েছি যা -ওয়াল বা-ওয়েক্সট্রা দ্বারা চালু না করা সহায়ক হতে পারে, এবং তাই আমি আমার কোডটি উন্নত করতে পারি কিনা তা দেখার জন্য বাকীগুলি চেষ্টা করে দেখতে চাই। এটা ঐটার মতই সহজ.
ব্যবহারকারী541686

12
@ জোয়াচিমপাইলবার্গ: "আপনি কি সংকলকটি সতর্ক করতে চান?" সম্ভাব্য ত্রুটি এবং / বা খারাপ শৈলী? আমি বোঝাতে চাইছি, যদি আমি সমস্ত সঠিক সতর্কতাগুলি জানতাম তবে আমি কেবল সেগুলি ম্যানুয়ালি চালু করে দিতাম, প্রশ্ন উত্থাপন করার দরকার নেই। উত্তরটি যদি সত্যিই "আপনার সকলের সন্ধানের জন্য উত্স কোডের দিকে তাকাতে হবে" তবে উত্তর হিসাবে পোস্ট করুন!
ব্যবহারকারী541686

56
ঝাঁকুনি 3.1 অফার -Weverything
আলেকজান্দ্রে হামেজ

5
@ আরাফানজিওন ওয়েল, প্রশ্নটি ট্যাগ করা হয়েছে সি ++ তাই ... :)
কিছু প্রোগ্রামার ডুড

5
@ জোয়াচিম পাইলবার্গ এবং এখন উত্স থেকে সতর্কতাগুলি নেওয়ার একটি স্বয়ংক্রিয় উপায় রয়েছে: github.com/barro/compiler- সতর্কতা
কাইল স্ট্র্যান্ড

উত্তর:


129

আপনি পারবেন না।

জিসিসি ৪.৪.০ এর জন্য ম্যানুয়ালটি কেবলমাত্র সেই সংস্করণের জন্যই বিস্তৃত তবে এটি ৪.৪.০-এর জন্য সম্ভাব্য সমস্ত সতর্কতাগুলির তালিকা করে list আপনি যে পৃষ্ঠায় লিঙ্ক করেছেন সেগুলি এগুলিই নয়, উদাহরণস্বরূপ কিছু ভাষা-নির্দিষ্ট বিকল্প সি ++ বিকল্প বা ওজেজে-সি বিকল্পগুলির পৃষ্ঠায় রয়েছে। তাদের সমস্তটি খুঁজে পেতে বিকল্প সংক্ষিপ্তসারটি দেখানো ভাল

সমস্ত কিছু চালু করলে অন্তর্ভুক্ত থাকবে -Wdouble-promotionযা একটি সিপিইউগুলিতে কেবলমাত্র 32-বিট একক-নির্ভুলতা ভাসমান-পয়েন্ট ইউনিটের সাথে প্রাসঙ্গিক যা floatহার্ডওয়ারে প্রয়োগ করে তবে doubleসফ্টওয়্যারটিতে অনুকরণ করে। হিসাবে গণনা করা doubleসফ্টওয়্যার অনুকরণ ব্যবহার করবে এবং ধীর হবে। এটি কিছু এম্বেড থাকা সিপিইউগুলির জন্য প্রাসঙ্গিক, তবে desktop৪-বিট ভাসমান-পয়েন্টের জন্য হার্ডওয়্যার সমর্থন সহ আধুনিক ডেস্কটপ সিপিইউগুলির জন্য সম্পূর্ণ অপ্রাসঙ্গিক।

সাধারণত কার্যকর নয় এমন আরেকটি সতর্কতা হ'ল -Wtraditional, যা নিখুঁতভাবে সুগঠিত কোড সম্পর্কে সতর্ক করে যা traditionalতিহ্যবাহী সি, যেমন "string " "concatenation", বা আইএসও ফাংশন সংজ্ঞায়নের আলাদা অর্থ (বা কাজ করে না) রয়েছে ! আপনি কি 30 বছরের পুরানো সংকলকগুলির সাথে সামঞ্জস্যতা সম্পর্কে সত্যিই যত্নশীল? আপনি কি সত্যিই লেখার জন্য একটি সতর্কতা চান int inc(int i) { return i+1; }?

আমি মনে করি যে -Weffc++এটি কার্যকর হবে না, এটি কার্যকর সি ++ এর পুরানো প্রথম সংস্করণের উপর ভিত্তি করে তৈরি করা হয়েছে যা পুরোপুরি বৈধ সি ++ (এবং যার জন্য বইটির পরবর্তী সংস্করণগুলিতে গাইডলাইন পরিবর্তিত হয়েছে) সম্পর্কে সতর্ক করে দিয়েছি আমি চাই না হুঁশিয়ারি দিয়েছি যে আমি std::stringআমার কনস্ট্রাক্টরে কোনও সদস্যকে আরম্ভ করিনি ; এটির একটি ডিফল্ট নির্মাতা আছে যা আমি যা চাই ঠিক তাই করি, কেন আমি m_str()এটি কল করতে লিখব ? যে -Weffc++সতর্কতাগুলি সহায়ক হবে সেগুলি সংকলকটির সঠিকভাবে (মিথ্যা নেতিবাচক দিক দেওয়া) সনাক্ত করা খুব কঠিন এবং যেগুলি কার্যকর নয়, যেমন সমস্ত সদস্যকে সুস্পষ্টভাবে সূচনা করা, খুব বেশি শব্দ উত্পন্ন করে মিথ্যা ইতিবাচকতা দেয়।

লাক ড্যান্টন অদৃশ্য সতর্কতার একটি দুর্দান্ত উদাহরণ প্রদান করেছেন -Waggregate-returnযা প্রায় অবশ্যই সি ++ কোডের জন্য কোনও অর্থ দেয় না।

অর্থাত্ আপনি সত্যিই সমস্ত সতর্কতা চান না , আপনি কেবল তাই করেন বলে মনে করেন।

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

যে কেউ কেবল সমস্ত কিছু চালু করে সে সম্ভবত এটি করছে কারণ তারা নিখুঁত কারণ কারণ বা একটি বিন্দু কেশিক বস "কোন সতর্কবাণী" নেই।

কিছু সতর্কতা গুরুত্বপূর্ণ, এবং কিছু না। আপনাকে বৈষম্যমূলক হতে হবে বা আপনার প্রোগ্রামটি গোলমাল করতে হবে। উদাহরণস্বরূপ, বিবেচনা করুন -Wdouble-promotion। আপনি যদি এম্বেড থাকা সিস্টেমে কাজ করছেন তবে আপনি এটি চাইবেন; আপনি যদি কোনও ডেস্কটপ সিস্টেমে কাজ করে থাকেন তবে আপনি সম্ভবত না। এবং আপনি চান -Wtraditional? আমি এটাকে সন্দেহ করি.

সম্পাদনা করুন: ডাব্লুউন্টিক্স হিসাবে বন্ধ থাকা সমস্ত সতর্কতাগুলি সক্ষম করতে -অল-সমস্ত দেখুন ।

সংশোধন 2: সংকলক সংস্করণের উপর নির্ভর করে মেকফাইলদের বিভিন্ন সতর্কতা ব্যবহার করা দরকার সে সম্পর্কে দেবসোলারের অভিযোগের জবাবে, যদি -Wall -Wextraউপযুক্ত না হয় তবে সংকলক-নির্দিষ্ট এবং সংস্করণ-নির্দিষ্ট সিএফএলএজিএস ব্যবহার করা কঠিন নয়:

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))

38
"ম্যানুয়ালটি দেখুন, সেগুলি সম্পর্কে পড়ুন, সিদ্ধান্ত নিন আপনি কোনটি সক্ষম করতে পারেন, তাদের চেষ্টা করুন।" এখানে সমস্যাটি আপনি যে পদক্ষেপগুলি রেখে গেছেন তা হ'ল: "প্রতিটি সংকলক সংস্করণের জন্য ম্যানুয়ালটি পুনরায় দেখুন এবং আপনার সতর্কতাগুলির তালিকাটি পরিবর্তনশীল কারণ এটি পরিবর্তনশীল। আপনার মেকফাইলগুলি সঠিক সংকলক সংস্করণটি পরীক্ষা করে নিন এবং সতর্কতার একটি পৃথক তালিকা ব্যবহার করুন তাদের প্রত্যেকের জন্য। " আমাদের অপ্টিমাইজেশনের স্তর বজায় রাখার ব্যবস্থা রয়েছে; তারা কেন সতর্কতার জন্য একই পরিষেবা দেওয়ার বিষয়ে বিরক্ত হতে পারে না?
দেবসোলার

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

14
@ জোনাথন ওয়েকেলি: "আপনি যদি কিছু চান তবে এটির জন্য জিজ্ঞাসা করুন, এটি সম্পর্কে ঝাঁপ দাও না" - আমি জিসিসি প্রকল্পে এটি সমালোচনা করার জন্য অংশ নিতে বাধ্য নই, বিশেষত যদি # 31573 ইতিমধ্যে ডাব্লুউন্টিক্স হিসাবে চিহ্নিত করা হয়েছে। এই বিষয়টিকে "এটি সম্পর্কে জিজ্ঞাসা করুন" থেকে "এটি সম্পর্কে দুশ্চরিত্রা" বলপার্কে রাখে।
দেবসোলার

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

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

71

আমি পূর্ববর্তী উত্তরের সাথে একমত হব যে আক্ষরিক অর্থে সমস্ত সতর্কতা সক্ষম করা সম্ভবত উপকারী নয়, তবে জিসিসি এটি অর্জনের পক্ষে যুক্তিসঙ্গত সুবিধাজনক উপায় সরবরাহ করে না। আদেশ

gcc -Q --help=warning

তারা সক্রিয় কিনা তা সম্পর্কিত তথ্যের সাথে সমস্ত সমর্থিত সতর্কতা বিকল্পগুলির একটি তালিকা সরবরাহ করে। প্রণালী দ্বারা এই করতে পারেন খুঁজে বের করতে যা অপশন যেমন সক্রিয় (না) হয় ব্যবহার করা যেতে -Wallএবং-Wextra

gcc -Wall -Wextra -Q --help=warning

সমস্ত সতর্কতা সক্ষম করতে আপনি কমান্ড লাইন প্যারামিটারগুলি নিষ্কাশন করতে কিছু রেজেেক্স ব্যবহার করতে পারেন

gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n'

আমার বর্তমান জিসিসির জন্য এটি দেয়:

-ওয়াবি -ওয়াবি-ট্যাগ -ওয়্যারড্রেস -ব্যাগগ্রিট-রিটার্ন -বাগ্রেসিভ-লুপ-অপটিমাইজেশন -ওয়ালিসিং -ওয়ালাইন-কমন্স -ওয়াম্পারস্যান্ড-ওয়ার্য-বাউন্ডস-ওয়ারে-টেম্পোরারিস -সাইভেন-ইন্টারসেপ্ট -ওয়াট্রিবিউটস-ওয়ার্ল্ড-ফাংশন-কাস্ট -বুল-তুলনা -উবিল্টিন-ম্যাক্রো-পুনরায় সংজ্ঞায়িত -ডাব্লুসিটি ++ - কমপ্যাট-ডাব্লুসিটি ++ 0 এক্স-কম্প্যাট -ডাব্লুসিটি ++ 14-কম্প্যাট -ডাব্লুসি-বন্ডিং-প্রকার -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -Wcast-qual -উচার-সাবস্ক্রিপ্টস-ওয়ারচারার-ট্র্যাঙ্কেশন -Wchkp -Wclobbered -Wcomment -Wcompare-Reals -Wonditionally- সমর্থিত -উপনারশন -উইকভার্শন-এক্সট্রা -অন-রূপান্তর-নাল-উইকভারেজ-মিসম্যাচ -Wcpp -Wctor-dtor-गोपनीयता সময়কাল -পরে-বিবৃতি -পরিষ্কার-অসম্পূর্ণ -সামগ্রী-নন-ভার্চুয়াল-ডটর -ড্রিপ্রেসিটেড -Wdeprecated-Declations -Wdesignated-init -Wdis اهل-Optization-Wdiscarded-অ্যারে-কোয়ালিফায়ারস-বিভক্ত-কোয়ালিফায়ারস -Weffc ++ -Wempty-body-উন্ডিফ-লেবেল -উইনম-তুলনা -ভেক্সট্রা -ফ্লুয়েট সমান-ওয়ার্মফর্মেট-নুল-ওয়ারফর্ম-অতিরিক্ত-আরগস -উফর্ম্যাট-ননলিটারাল-ওয়ার্মফর্ম-সুরক্ষা -আর-রূপরেখা-স্বাক্ষরতা -উন্ডফর্ম-y2 কে -ফর্ম্যাট-শূন্য-দৈর্ঘ্য -ফ্রি -নোহীপ-অবজেক্ট -Wfunction- নির্মূলকরণ -Windored-Qualifiers -Womplic -Womplic-Function-Declaration-Wompolve-int-Womplic-ইন্টারফেস -Womplic- পদ্ধতি -Wompomp موافق- পয়েন্টার-প্রকার -Winherised- ভেরিয়্যাডিক ctor -Winit- স্ব -Winline -উইনট-রূপান্তর-উইনট-টু-পয়েন্টার-কাস্ট-উইন্ট্রিন্সিক-শ্যাডো-উইন্ট্রিনসিকস-স্টাড-উইনডিয়াল-মেমরি-মডেল-উইনডিয়াল-অফসেটফ-উইনডিয়াল-পিচ-উইজম্প-মিসস-আরআই -লাইন-ট্রান্সকেশন -লাইট্রাল-প্রত্যয় -স্রোত -নো-প্রথম বন্ধনী -Wlogical-op -Wlong-long -Wmain -Wmaybe-uninitialized -Wmemset-transused-args -Wmissing-braces -Wmissing-घोषणा -Wmissing-ফিল্ড-আরম্ভকারী -Wmissing-di-dirs -Wmissing-parameter-type -Wmissing-এগুলির নমুনা-উমলটিচার -ভনরোয়েং-ওয়েস্ট-এক্সটার্নারস -নোসেপ্ট-ওপেন-টেম্পলেট-বন্ধু -বোন-ভার্চুয়াল-ডটর -উন্নোল -উডর-ওয়াল্ড-স্টাইল-কাস্ট -ওয়োল্ড-স্টাইল-ডিক্লেয়ারেশন -উল্ড-স্টাইল-সংজ্ঞা -ওয়পেনম্প-সিমড-ওভারফ্লো -উরওয়েলেথ-স্ট্রিংস -ওয়ারওয়েলেড-ভার্চুয়াল -ওয়ারওরাইড-আর--উপ্যাকড -ওয়াকপ্যাকড-বিটফিল্ড-কম্প্যাট -Wpadded -Wparentheses -Wpedantic -Wpmf- রূপান্তর -Wpointer-arith -Wpointer-Sign -Wpointer-to-int-cast -Wpratymas -অ্যাসাইন-ডিফল্ট -উগ্রোটোকল-ওয়ারিয়াল-কি-ধ্রুবক -আরওয়ালোক-এলএইচস -আল্লিক-এলএইচএস-সমস্ত-ওয়ারডান্ট্যান্ট-ডিক্লস-ওয়ারর্ডার-রাইটার্ন-লোকাল-অ্যাডার -ট্রেট-টাইপ-উইসেকোর-পয়েন্ট -শ্যাডো -শ্যাডো-আইভার -উইশফিট-গণনা-নেতিবাচক -পরিচালনা-গণনা-ওভারফ্লো -সাইন-তুলনা -সাইন-প্রমো -সাইজড-ডিওলোকেশন -সাইজফ-অ্যারে-আর্গুমেন্ট -সাইসফ-পয়েন্টার-মেম্যাক্সেস -স্টাস্ট-প্রটেক্টর -স্ট্রিট-নাল-সেন্ডিনেল -স্ট্রিস্ট-প্রোটোটাইপস -Wstrict-নির্বাচক ম্যাচ-সুগজেস্ট-অ্যাট্রিবিউট = কনস্ট -সুগজেস্ট-অ্যাট্রিবিউট = ফর্ম্যাট -সুগজেস্ট-অ্যাট্রিবিউট = নরটার্ন -সুগজেস্ট-অ্যাট্রিবিউট = খাঁটি -সুগাস্ট-ফাইনাল-পদ্ধতি -সুজেস্ট-চূড়ান্ত-প্রকার -সুগজেস্ট-ওভাররাইড -সুরাইজিং -Wwwitch-bool -Wwwitch -ডিফোল্ট -উইচইচ-এনাম -সাইঙ্ক-ন্যান্ড -সাইসেন্ট -সিসটেম-শিরোলেখ -Wtabs -Warget-Life -Wreditional -Wreditional-রূপান্তর -Wtrampolines -Wtrigraphs -Wype টাইপ সীমা -Wundeclared- নির্বাচক -উন্ডফরাইজডমিনজিন -উনস্যাফ-লুপ-অপটিমাইজেশনস -উনসুফিক্সড-ফ্লোট-কনস্ট্যান্টস -উনউসড -উনউসড-কিন্তু-সেট-প্যারামিটার -উনিউজড-তবে-সেট-ভেরিয়েবল -উনউসড-ডামি-আর্গুমেন্ট -উনিউজড-ফাংশন -উনউসড-লেবেল -উনিউজড-লোকাল-টাইপডেফগুলি -উয়ানউসড-ম্যাক্রোস -উনউসড-প্যারামিটার -উনউসড-রেজাল্ট -উনিউজড-ভ্যালু -উনউসড-ভেরিয়েবল -উইস-বিহীন -উসলেস-নিক্ষেপ -ভ্যারাগারস -ওয়ওয়ারিয়াডিক-ম্যাক্রোস -ভেক্টর-অপারেশন-পারফরম্যান্স-ওয়ার্চুয়াল-মুভ-এসাইন্ট-ডাব্লুওলা -ওয়োলাটাইল-রেজিস্টার-ভ-রাইটিং-স্ট্রিংস-ওয়েজারো-এ-নাল-পয়েন্টার-ধ্রুবক-ওয়েজারোট্রিপ -ফের্কায়ার-রিটার্ন-স্টেটমেন্ট

এটি এখন জিসিসি, অর্থাৎ কল করতে ব্যবহৃত হতে পারে

gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')

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


10
আমি ভয় করি যে এটি ব্যবহারিক নয়। Gcc আমাকে std lib থেকে সতর্কবার্তা দেখিয়েছে।
ভ্যালেন্টিন হেইনিৎজ

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

6
@ ভ্যালেনটিনহেইনিটজ আপনি জিসিসি সম্পর্কিত ডিরেক্টরিগুলির -isystemপরিবর্তে সিস্টেম / স্টাডি / তৃতীয় পক্ষের হেডারগুলির জন্য সতর্কতা জারি করা থেকে বিরত রাখতে পারেন -I
কাইল স্ট্র্যান্ড

4
এটি হ'ল এটি গ্রহণযোগ্য উত্তর হিসাবে প্রকৃতপক্ষে এবং সরাসরি প্রশ্নের উত্তর দেয়।
টিফুটো

16

সমস্ত সতর্কতা সক্ষম করার সাথে প্রোগ্রাম করা কেবল অসম্ভব (যদি না আপনি সেগুলি উপেক্ষা করছেন তবে তবে কেন বিরক্ত করবেন?)। উদাহরণস্বরূপ, আপনি নিম্নলিখিত পতাকার সেট ব্যবহার অনুমান যাক: -Wstrict-prototypes -Wtraditional

এমনকি দুটি সতর্কতা সক্ষম করা সত্ত্বেও, নিম্নলিখিত প্রোগ্রামটি অভিযোগ করবে।

/tmp $ cat main.c 
int main(int argc, char **argv) {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c: In function main’:
main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]
 int main(int argc, char **argv) {
     ^

আপনি ভাবতে পারেন "ভাল, আমি তখন পুরানো স্টাইলের প্রোটোটাইপগুলি ব্যবহার করব"। না, এটি কাজ করবে না।

/tmp $ cat main.c 
int main(argc, argv)
    int argc;
    char **argv;
{
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

এবং না, কোনও প্রোটোটাইপ নির্দিষ্ট না করাও ভুল, কারণ সংকলকটিও অভিযোগ করবে।

/tmp $ cat main.c 
int main() {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isnt a prototype [-Wstrict-prototypes]
 int main() {
     ^

আপনি যদি আপনার প্রোগ্রামের ভিতরে কোনও ফাংশন সংজ্ঞায়িত করেন তবে আপনি সমস্ত পতাকা ব্যবহার করতে পারবেন না, কারণ সংকলক কোনও কল্পনাযোগ্য ফাংশন সংজ্ঞা সম্পর্কে অভিযোগ করবে।

সি ++ এর জন্য এটি সম্ভব ( -Wtraditionalপতাকাটির অস্তিত্ব নেই), এবং খুব সাধারণ প্রোগ্রাম সংকলন করা যায়। সমস্ত সতর্কতা সক্ষম করতে, নিম্নলিখিত সতর্কতাগুলির তালিকা ব্যবহার করুন (সম্ভবত কিছু সতর্কতা নকল করা হয়েছে, কারণ আমি দ্বারা সক্ষম হওয়া সতর্কতাগুলি ফিল্টার করতে বিরক্ত করি নি -Wall)।

-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings

13
আমি এখনও অবধি এটি যাচাই করার বিরক্ত করিনি, তবে আসলে এটি অসম্ভব ... চেষ্টা করুনint main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
ব্যবহারকারীর 4168686

2
এমনকি এই তুচ্ছ প্রোগ্রামের সাথে আমি এখনও "সতর্কতা পেতে পারি: স্ট্যাকের ব্যবহার 16 বাইট [-Wstack- ব্যবহার =]" ;-)
মার্ক গ্লিস

7

কেউ প্রদত্ত জিসিসি বা কলং সংস্করণের জন্য সতর্কতার সম্পূর্ণ সেট নির্ধারণের জন্য সরঞ্জামগুলির একটি সেট তৈরি করেছে ।

জিসিসির জন্য, আপনার সংকলক সংস্করণটির জন্য এই সরঞ্জাম দ্বারা প্রদত্ত সতর্কতার সম্পূর্ণ তালিকা থেকে অনুলিপি করা সমস্ত সতর্কতা চালু রয়েছে তা নিশ্চিত করার একমাত্র উপায় বলে মনে হয়, যেহেতু (ক্ল্যাংয়ের বিপরীতে) জিসিসি সরবরাহ করে না ।-Weverything

সরঞ্জামটি c.optজিসিসির উত্স কোডটিতে আসল ফাইলটিকে বিশ্লেষণ করে দেখা যাচ্ছে , সুতরাং এর ফলাফলগুলি অবশ্যই যথাযথ হওয়া উচিত

বেশিরভাগ জিসিসি এবং ক্ল্যাং সংস্করণে (বর্তমানে 3.30 থেকে 3.7 এবং জিসিসি 3.4 থেকে 5.3 এর মধ্যে জড়িত) সতর্কতার তালিকাগুলির সাহায্যে সংগ্রহস্থলটিতে পাঠ্য ফাইল রয়েছে।

https://github.com/barro/compiler-warnings


এই উত্তর। "শীর্ষ স্তর" তালিকাটি ব্যবহার করুন, এবং শীর্ষ স্তরে থাকা সমস্ত আর্গুমেন্ট যুক্ত করুন (অভিযুক্ত / নেস্টেড নয়)। github.com/Barro/compiler-Warnings/blob/master/gcc/…
এস-টাইপ

6

Gcc 4.3+ এ এখন -Q --help = সতর্কতা রয়েছে, আপনি এমনকি --help = সতর্কতা, সি নির্দিষ্ট করতে পারেন কেবল সি সম্পর্কিত সতর্কতাগুলি মুদ্রণ করতে।

আমি এর সদ্ব্যবহার করার জন্য কেবল একটি এম 4 মডিউল লিখেছি (ঝাঁকুনির -Weverything সমর্থন করে), wget_manywarnings.m4 দেখুন

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

আপনি যদি অটটুলগুলি ব্যবহার না করেন তবে এম 4 মডিউলটিতে সমস্ত অক্ষম সতর্কতা চালু করার কোডটি পাবেন, যা মূলত জিসিসি কলটি অ্যাডকের মাধ্যমে পাইপ করা হয়েছে:

flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'


3

এই পৃষ্ঠা থেকে :

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

আমার মনে হয় প্রশ্নটি কোনটি ? সম্ভবত আপনি পারে grep -w হওয়ার মধ্যে দিয়ে সব লাইন জন্য যে পেজটি এবং সতর্কবার্তা পতাকার একটি সম্পূর্ণ তালিকা পেতে। তারপরে -Wallএবং নীচের তালিকাগুলির সাথে তুলনা করুন -Wextra। এছাড়াও রয়েছে -Wpedantic, যদিও আপনি সম্ভবত আরও বেশি পেডেন্টিক হতে চান =)


"এবং এই তালিকাটি যদি বিস্তৃত হয় তবে আমার এখনও ধারণা নেই" ... হ্যাঁ, আমি অবশ্যই সেই পৃষ্ঠাটি গ্রেপ করতে পারি, তবে প্রশ্নটি কি এটি বিস্তৃত?
ব্যবহারকারী541686

1
আমি জানি না ... আপনাকে জিসিসির উত্স কোডটি দিয়ে pourালাও হতে পারে। আপনি কি একজন প্রোগ্রামার হিসাবে আপনার জীবনকে অত্যন্ত কঠিন করার চেষ্টা করছেন, বা কোনও অনুমানযোগ্য সতর্কতাটি দেখতে চান এমন কোনও কারণ আছে? =)
ধান

2
আমি আমার কোডটি জিসিসির নির্ণয় দেখতে চাই - এটি সত্যই সহায়ক বলে মনে হচ্ছে। তবে স্পষ্টতই, আমি যদি ইতিমধ্যে সমস্ত সতর্কতা সম্পর্কে জানতাম এবং কোনটি কার্যকর (এবং কোনটি কার্যকর নয়), তবে জিজ্ঞাসার মতো কিছুই থাকত না। আমি তাদের চেষ্টা না করে বলার সত্যিকারের উপায় নেই (এবং উদাহরণস্বরূপ আমি ছায়া কাটা একজনকে সহায়ক বলে মনে করেছি, সুতরাং তারা বন্ধ হয়ে যাওয়ার কারণে তারা অকেজো বলে মনে হয় না)।
ব্যবহারকারী541686

3

এবং এই তালিকাটি বিস্তৃত কিনা আমার এখনও ধারণা নেই।

এটি সম্ভবত, তবে একমাত্র তালিকা যা 100% বিস্তৃত তা সংকলকটির আসল উত্স। তবে জিসিসি বড় ! এবং আমি জানি না যে সমস্ত কমান্ড-লাইন প্যারামিটারগুলি এক জায়গায় সংগ্রহ করা হয়েছে বা বেশ কয়েকটি উত্স ফাইলগুলিতে ছড়িয়ে পড়েছে। এছাড়াও লক্ষ করুন যে কিছু সতর্কতাগুলি প্রসেসর প্রসেসরের জন্য, কিছু প্রকৃত সংকলক এবং কিছু লিঙ্কারের জন্য (যা একটি সম্পূর্ণ পৃথক প্রোগ্রাম, এবং বাইনুটিলেস প্যাকেজে পাওয়া যায়) যাতে সম্ভবত তারা ছড়িয়ে পড়ে।


3
আমি আমার উত্তরে বিকল্প সংক্ষিপ্ত পৃষ্ঠার সাথে লিঙ্ক করেছি, যা সমস্ত বিকল্পকে এক পৃষ্ঠায় ভাগ করে দেয়। জিসিসি কোড পর্যালোচনা নীতিগুলি ডকুমেন্টেশন ছাড়াই নতুন বিকল্পগুলিকে মঞ্জুরি দেয় না, সুতরাং ডক্সটি ব্যাপক হওয়া উচিত।
জোনাথন ওয়াকলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.