আমি কেন সবসময় সংকলক সতর্কতাগুলি সক্ষম করব?


302

আমি প্রায়শই শুনেছি যে সি এবং সি ++ প্রোগ্রামগুলি সংকলন করার সময় আমার "সর্বদা সংকলক সতর্কতাগুলি সক্ষম করা উচিত"। কেন এটি প্রয়োজনীয়? আমি কেমন করে ঐটি করি?

কখনও কখনও আমি আরও শুনেছি যে আমার "সতর্কতাগুলিকে ত্রুটি হিসাবে গণ্য করা উচিত"। আমি কি? আমি কেমন করে ঐটি করি?

উত্তর:


341

সতর্কতা কেন সক্ষম করবেন?

সি এবং সি ++ সংকলকগুলি সাধারণ কিছু প্রোগ্রামার ভুলগুলি ডিফল্টরূপে রিপোর্ট করার ক্ষেত্রে কুখ্যাত হয় যেমন:

  • ভেরিয়েবলের সূচনা করতে ভুলে যাচ্ছি
  • returnএকটি ফাংশন থেকে একটি মান ভুলে যাওয়া
  • printfএবং scanfপরিবারগুলির মধ্যে ফর্ম্যাট স্ট্রিংয়ের সাথে মেলে না যুক্তি
  • পূর্বে ঘোষণা না করে একটি ফাংশন ব্যবহার করা হয় (কেবলমাত্র সি)

এগুলি সনাক্ত এবং রিপোর্ট করা যায়, সাধারণত সাধারণত ডিফল্ট হিসাবে নয়; এই বৈশিষ্ট্যটি স্পষ্টভাবে সংকলক বিকল্পগুলির মাধ্যমে অনুরোধ করা উচিত।

সতর্কতা কীভাবে সক্ষম করবেন?

এটি আপনার সংকলকের উপর নির্ভর করে।

মাইক্রোসফট সি এবং সি ++ কম্পাইলার বুঝতে সুইচ পছন্দ /W1, /W2, /W3, /W4এবং /Wall। কমপক্ষে ব্যবহার করুন /W3/W4এবং /Wallসিস্টেম শিরোলেখ ফাইলগুলির জন্য উদাসীন সতর্কতা নির্গত করতে পারে তবে আপনার প্রকল্পটি যদি এই বিকল্পগুলির মধ্যে একটির সাথে পরিষ্কারভাবে সংকলন করে তবে এর জন্য যান। এই বিকল্পগুলি পারস্পরিক একচেটিয়া।

সর্বাধিক অন্যান্য কম্পাইলার মত অপশন বুঝতে -Wall, -Wpedanticএবং -Wextra-Wallঅপরিহার্য এবং বাকি সমস্তগুলি সুপারিশ করা হয় (নোট করুন যে, এর নাম সত্ত্বেও, -Wallকেবলমাত্র সমস্ত গুরুত্বপূর্ণ নয়, সবচেয়ে গুরুত্বপূর্ণ সতর্কতা সক্ষম করে)। এই বিকল্পগুলি পৃথকভাবে বা সমস্ত একসাথে ব্যবহার করা যেতে পারে।

আপনার আইডিইর ইউজার ইন্টারফেস থেকে এগুলি সক্ষম করার একটি উপায় থাকতে পারে।

সতর্কবাণীকে ত্রুটি হিসাবে কেন আচরণ করবেন? তারা কেবল সতর্কতা!

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

আপনি সমস্ত সতর্কতা হিসাবে সতর্কতা হিসাবে ছেড়ে যেতে চান না যদিও সেগুলির সমস্তই ভুয়া অ্যালার্ম। এটি খুব ছোট প্রকল্পগুলির জন্য ঠিক হতে পারে যেখানে নির্ধারিত মোট সতর্কতাগুলির সংখ্যা 7. এর চেয়ে কম। যে অনুমতি দেয় না। কেবলমাত্র আপনার সমস্ত প্রকল্প পরিষ্কারভাবে সংকলন করতে দিন।

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

সতর্কতাগুলি ত্রুটি হিসাবে বিবেচনা করবেন কীভাবে?

এটি আবার সংকলক সুইচগুলি দিয়ে সম্পন্ন হয়। /WXমাইক্রোসফ্টের জন্য, বেশিরভাগ অন্যরা ব্যবহার করে -Werror। উভয় ক্ষেত্রেই, যদি কোনও সতর্কতা উত্পাদিত হয় তবে সংকলনটি ব্যর্থ হবে।


107
আমি এই প্রশ্নোত্তর পোস্ট করেছি কারণ আমি মানুষকে সতর্কবার্তা সক্ষম করতে বলতে ক্লান্ত হয়ে পড়েছি। এখন আমি কেবল তাদের এখানে এখানে নির্দেশ করতে পারি (বা, আমি যদি বিশেষভাবে খারাপ মেজাজে থাকি তবে তাদের প্রশ্নটি ডুপ হিসাবে বন্ধ করুন)। এই উত্তরটি উন্নত করতে বা আপনার নিজস্ব যুক্ত করতে আপনাকে স্বাগতম!
এন। 'সর্বনাম' মি।


9
আমি কেবলমাত্র সংশোধনকারী যুক্ত করব তা হ'ল কিছু সতর্কতা আপনার আবেদনের জন্য সহায়ক নাও হতে পারে। (আমি সতর্কতা দেখেছি যে সংকলকটি কাঠামোর মধ্যে উপাদানগুলির মধ্যে 2 বাইট প্যাড যুক্ত করেছে The অ্যাপ্লিকেশনটি প্রোটোটাইপিংয়ের জন্য ছিল, তাই সামান্য নষ্ট স্মৃতি আমাদের বিরক্ত করে না)) সমস্ত সতর্কতাগুলিকে ত্রুটি হিসাবে বিবেচনা করে এবং কেবলমাত্র একটি সতর্কতা অক্ষম করলেই আপনি জানেন কেন সেই সতর্কতা আপনাকে সাহায্য করবে না।
কাইল এ

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

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

94

সি, বিখ্যাত হিসাবে, এইচএলএলগুলি যেতে গেলে এটি একটি নিম্ন স্তরের ভাষা। সি ++, যদিও এটি সি এর তুলনায় যথেষ্ট উচ্চ-স্তরের ভাষা বলে মনে হচ্ছে তবুও এর বৈশিষ্ট্যগুলি বেশ কয়েকটি ভাগ করে দেয়। এবং এই বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল ভাষাগুলি প্রোগ্রামারদের দ্বারা, প্রোগ্রামারদের জন্য - এবং বিশেষত প্রোগ্রামাররা যারা জানত যে তারা কী করছে doing

[এই উত্তরটির বাকি অংশে আমি সি এর দিকে মনোনিবেশ করতে চলেছি আমি যা বলব তার বেশিরভাগটি সি ++ এর ক্ষেত্রেও প্রযোজ্য, যদিও সম্ভবত এটি দৃ strongly়তার সাথে নয়। যদিও বাজর্ন স্ট্রাস্ট্রপ যেমন বিখ্যাত বলেছেন, "সি নিজেকে পায়ে গুলি করা সহজ করে; সি ++ আরও শক্ত করে তোলে, তবে আপনি যখন এটি করেন তখন আপনার পুরো পাটি বন্ধ করে দেয়।" ]

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

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

তবে অবশ্যই সব প্রোগ্রামারদের সত্যিই তারা কি করছেন জানি। এবং, বিশেষত, প্রতিটি সি প্রোগ্রামার (যতই অভিজ্ঞ হোক না কেন) প্রারম্ভিক সি প্রোগ্রামার হওয়ার একটি পর্যায়ে চলে যায়। এমনকি অভিজ্ঞ সি প্রোগ্রামাররাও অযত্ন পেতে এবং ভুল করতে পারে।

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

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

(এই জাতীয় "ভুল" এর একটি সর্বোত্তম উদাহরণ পরীক্ষা test if(a = b)বেশিরভাগ সময়, এটি একটি ভুল, তাই বেশিরভাগ সংকলক আজকাল এটি সম্পর্কে সতর্ক করে - কিছু এমনকি ডিফল্টরূপেও But তবে আপনি যদি সত্যই নির্ধারিত এবং পরীক্ষা উভয়ই দিতে bচান aফলস্বরূপ, আপনি টাইপ করে সতর্কতাটি অক্ষম করতে পারেন if((a = b))))

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

তাই সংকলককে ত্রুটি হিসাবে সতর্কতা হিসাবে বিবেচনা করা জিজ্ঞাসা করা একটি ছোট কৌশল যা আপনি এই মানুষের বোধগম্য হয়ে উঠতে নিজের উপর খেলতে পারেন।

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


9
"প্রোগ্রামাররা যারা জানত তারা কী করছে" - এলএল; "সত্যিকারের স্কটসম্যান" নেই যে যদি আমি
কোনওদিনই

3
পুনঃটুইট করুন আমি কখনই পুরোপুরি নিশ্চিত নই যে আমি কোনও সত্যই স্কটসম্যানের ত্রুটি বুঝতে পারি না , তবে আমি এটি পছন্দ করি, তাই এটি আমার পক্ষে ভাল অনুশীলন হবে। আমি অনুমান করি যে অ্যাপ্লিকেশনটি এখানে এর মত: "কোনও সি প্রোগ্রামার কখনও লিখতে if(a = b)পারে না, সুতরাং আমাদের এটি সম্পর্কে সতর্ক করার দরকার নেই।" (তারপরে কেউ প্রকাশিত 10 টি পণ্যের মধ্যে 10 টি সমালোচক বাগের একটি তালিকা তৈরি করে যা এই বিশেষ ত্রুটির ফলে আসে)) "ঠিক আছে, কোনও অভিজ্ঞ সি প্রোগ্রামার কখনও এটি লিখতে পারে না ..."
স্টিভ সামিট

3
@ স্টিভসমিট তবে সত্যই অভিজ্ঞ সি প্রোগ্রামার if (returnCodeFromFoo = foo(bar))কোডটি এক জায়গায় ক্যাপচার এবং পরীক্ষা করার জন্য এটি লিখে এবং এটি বোঝাতে পারে (ধরে নিই এর একমাত্র উদ্দেশ্য এর fooপার্শ্ব প্রতিক্রিয়া রয়েছে!) সত্যই অভিজ্ঞ প্রোগ্রামার জানতে পারে যে এটি কোনওটি নয় ভাল কোডিং শৈলী বিন্দুর পাশে;)
আলেফজেরো

5
জিনিসটি হ'ল, অত্যন্ত অভিজ্ঞ প্রোগ্রামাররা সতর্কতাগুলি সর্বাধিক, যদি না হয় তবে সর্বাধিক সক্ষম করে। যদি তারা এর মতো কিছু ব্যবহার করতে চান if (returnCodeFromFoo = foo(bar)), তবে তারা একটি মন্তব্য করেছিলেন এবং সতর্কতাটি বন্ধ করে দিয়েছেন (যাতে ৪ বছর পরে রক্ষণাবেক্ষণ প্রোগ্রামার যখন এটি দেখবে, তখন সে বুঝতে পারবে যে কোডটি উদ্দেশ্যমূলক al সে বলেছে, আমি কাজ করেছি কারও সাথে যারা (ইন মাইক্রোসফট সি ++ জমি) জোর দেন যা ত্রুটির যেমন সতর্কবার্তা চিকিত্সা সঙ্গে মিশ্রন / ওয়াল যেতে উপায় ছিল উহ, তাই নয় কি (যতক্ষণ না আপনি দমন মন্তব্য অনেক মধ্যে লাগাতে
Flydog57

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

39

সতর্কতাগুলির মধ্যে সেরা পরামর্শের সমন্বিত সবচেয়ে দক্ষ সি ++ বিকাশকারীদের মধ্যে একটি অ্যাপ্লিকেশন বেক করতে পারে। তারা কাছাকাছি রাখা মূল্যবান।

সি ++, টিউরিং সম্পূর্ণ ভাষা হওয়ায় প্রচুর কেস রয়েছে যেখানে সংকলককে অবশ্যই বিশ্বাস করতে হবে যে আপনি কী করছেন তা আপনি জানেন। তবে এমন অনেকগুলি ঘটনা রয়েছে যেখানে সংকলক বুঝতে পারে যে আপনি সম্ভবত যা লিখেছেন তা লেখার ইচ্ছা ছিল না। এটা একটা ধ্রুপদী উদাহরণ printf, () কোড যা আর্গুমেন্ট, অথবা এসটিডি :: স্ট্রিং printf, প্রেরণ মিলছে না আছে (না যে কি কখনো আমার হবে!)। এই ক্ষেত্রে, আপনার লেখা কোডটি কোনও ত্রুটি নয়। কম্পাইলারের কাজ করার জন্য এটি বৈধ ব্যাখ্যার সাথে একটি বৈধ সি ++ এক্সপ্রেশন। তবে সংকলকটির শক্তিশালী কুঁচক আছে যা আপনি কেবল এমন কোনও বিষয়টিকে উপেক্ষা করেছেন যা আধুনিক সংকলকটির পক্ষে সনাক্ত করা সহজ। এগুলি হ'ল সতর্কতা। এগুলি হ'ল এমন বিষয় যা সংকলকের কাছে সুস্পষ্ট, এর সমাধানের ক্ষেত্রে সি ++ এর সমস্ত কঠোর নিয়মগুলি ব্যবহার করে, আপনি হয়ত উপেক্ষা করতে পারেন।

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

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

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


11
সি ++ টিউরিং সম্পূর্ণ হ'ল এর সাথে কি করতে হবে। অনেকগুলি ভাষা সম্পূর্ণ টিউরিং করছে এবং আপনি যদি কোনও ভুল করেন তবে আপনার বিশ্বাস করবেন না ....
বিদায় SE

3
@KamiKaze প্রতিটি ভাষায় কথ্য ভুল থাকবে (যেমন জাভা আপনি একটি অসঙ্গত লেখা বন্ধ করতে পারবেন না equals/ hashCode), এবং এটি বাস্তবায়ন সংখ্যার কোন গুণ থাকে যার ঐ রিপোর্ট করা হয় না।
কালেথ

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

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

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

19

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

সঠিক প্রকারটি ব্যবহার করুন, সেই মানটি ফিরিয়ে দিন, সেই ফেরতের মানটি মূল্যায়ন করুন। সময় নিন এবং প্রতিফলিত করুন "এটি কি এই প্রসঙ্গে সত্যই সঠিক ধরণের?" "আমার কি এটি ফিরিয়ে দেওয়া দরকার?" এবং বিগী; "এই কোডটি কি আগামী 10 বছরের জন্য বহনযোগ্য হবে?"

প্রথমে সতর্কতা-মুক্ত কোড লেখার অভ্যাসে প্রবেশ করুন।


17

অন্যান্য উত্তরগুলি দুর্দান্ত এবং তারা যা বলেছে তা আমি পুনরাবৃত্তি করতে চাই না।

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

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

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

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

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


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

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

15

অ-স্থির সতর্কতাগুলি শীঘ্রই বা পরে আপনার কোডটিতে ত্রুটি ঘটায়


বিভাগের ত্রুটি ডিবাগ করার জন্য, উদাহরণস্বরূপ, প্রোগ্রামারটিকে ত্রুটির মূল (কারণ) সনাক্ত করতে হবে যা সাধারণত আপনার কোডের পূর্ববর্তী স্থানে অবস্থিত রেখার চেয়ে অবশেষে বিভাজন ত্রুটির কারণ হয়ে দাঁড়ায়।

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

সতর্কবার্তা ঠিক করা সমস্যার সমাধানের দিকে নিয়ে যায় .. একটি ক্লাসিক!

উপরের একটি প্রদর্শন .. নিম্নলিখিত কোড বিবেচনা করুন:

#include <stdio.h>

int main(void) {
  char* str = "Hello world!";
  int idx;

  // Colossal amount of code here, irrelevant to 'idx'

  printf("%c\n", str[idx]);

  return 0;
}

যা যখন "ওয়েক্সট্রা" পতাকাটি সংকলিত হয়ে জিসিসিতে প্রেরণ করা হয়:

main.c: In function 'main':
main.c:9:21: warning: 'idx' is used uninitialized in this function [-Wuninitialized]
    9 |   printf("%c\n", str[idx]);
      |                     ^

যা আমি করতে পারে উপেক্ষা এবং যেকোনোভাবে কোড এক্সিকিউট .. এবং তারপর আমি একটি "গ্র্যান্ড" সেগমেন্টেশন ফল্ট সাক্ষী হবে, আমার আইপি epicurus অধ্যাপক হিসেবে বলতঃ

বিভাজন ত্রুটি

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

একদিন অবধি, তারা নিজেদেরকে এমন পরিস্থিতিতে আবিষ্কার করেছিল যেখানে তারা আবিষ্কার করে যে idxঅবিচ্ছিন্নভাবে ব্যবহার করা হয়, সুতরাং এটির একটি আবর্জনা মূল্য রয়েছে যার ফলস্বরূপ (উপায়) এর সীমানা ছাড়িয়ে সূচকে পরিণত হয়, যা বিভাজন ত্রুটির দিকে পরিচালিত করে।

যদি তারা এই সতর্কতাটিকে উপেক্ষা না করত তবে তারা তত্ক্ষণাত বাগটি খুঁজে পেত!


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

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

^ যে কোনও কিছুই ত্রুটিতে রূপান্তরিত হতে পারে। আংশিক প্রথম বন্ধনীযুক্ত কোডের মধ্যে সম্পূর্ণ তত্ক্ষণিত কোড হিসাবে একটি বাগ প্রবর্তন করা ঠিক তত সহজ।
জিম বাল্টার

... একটি সরাইয়া হিসাবে, আমি আছে হিসাবে প্রশ্ন ডিবাগার যার প্রথম প্রতিক্রিয়া থেকে "ওহ, তা থেকে segfaulted জন্য str[idx]" নয় "ঠিক আছে, কোথায় আছেন strএবং idxসংজ্ঞায়িত`?
পুনর্বহাল মনিকা - জাস্টিন সময়

2
আপনি ভাগ্যবান যদি আপনি বিভাগের ত্রুটি পান। আপনি যদি কম ভাগ্যবান হন তবে আপনি সম্ভবত সুযোগ idxহিসাবে আপনার পরীক্ষায় প্রত্যাশিত মান হতে পেরেছিলেন (প্রত্যাশিত মান 0 হলে খুব বেশি সম্ভাবনা নেই) এবং বাস্তবে এমন কিছু সংবেদনশীল ডেটার দিকে নির্দেশ করতে পারেন যা কখন মোতায়েন করা উচিত নয়।
celtschk

14

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

আপনি বিদ্যমান কোডটিতে সমস্যা সমাধান না করা পর্যন্ত নতুন কোড যুক্ত করবেন না

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

কোনও সরঞ্জাম অচল নয়। আপনি যদি লিখেন তবে const float pi = 3.14;বেশিরভাগ সরঞ্জাম আপনাকে বলবে না যে আপনি সংজ্ঞায়িত করেছেন a একটি খারাপ নির্ভুলতার সাথে যা রাস্তায় সমস্যা হতে পারে। বেশিরভাগ সরঞ্জামগুলি ভ্রু বাড়াবে না if(tmp < 42), এমনকি যদি এটি সাধারণত জানা যায় যে ভেরিয়েবলগুলিকে অর্থহীন নাম দেওয়া এবং যাদুর সংখ্যা ব্যবহার করা বড় প্রকল্পগুলিতে বিপর্যয়ের উপায়। আপনি বুঝতে যে কোনো "দ্রুত পরীক্ষা" কোড আপনি লিখতে শুধু যে আছে: একটি পরীক্ষা, এবং আপনি সঠিক আগে আপনি, অন্যান্য কাজগুলো উপর সরানো যখন আপনি এখনো তার ভুলত্রুটি দেখতে এটি পেতে আছে। আপনি যদি সেই কোডগুলি যেমন রেখে দেন তবে নতুন বৈশিষ্ট্য যুক্ত করার পরে আপনি যদি দুটি মাস ব্যয় করেন তবে ডিবাগ করা উল্লেখযোগ্যভাবে শক্ত হবে।

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


3
আরও ভাল বা আরও খারাপের জন্য, clippyমরিচাটির জন্য আবরণ সরঞ্জামটি ধ্রুবক "3.14" সম্পর্কে সতর্ক করবে। এটি ডক্সে আসলে একটি উদাহরণ । তবে আপনি নামটি থেকে অনুমান হিসাবে clippyআক্রমণাত্মকভাবে সহায়ক হতে পেরে গর্বিত হন।
এমএম

1
@ এমকে এই উদাহরণের জন্য ধন্যবাদ, সম্ভবত আমার উত্তরটি কখনই "কখনও নয়" ধরণের বলে পুনরায় লিখতে হবে । আমি বলতে চাইছিলাম না যে অনর্থক π মানগুলির জন্য পরীক্ষা করা অসম্ভব, কেবলমাত্র সতর্কতা থেকে মুক্তি পাওয়া শালীন কোড মানের গ্যারান্টি দেয় না।
দিমিত্রি গ্রিগরিয়েভ

ত্রুটি হিসাবে আপনাকে একটি জিনিস সতর্কতা হ'ল স্বয়ংক্রিয় বিল্ডগুলি ব্যর্থ হবে, এভাবে আপনাকে কিছুটা ভুল হয়েছে বলে সতর্ক করে। অটোমেটেড এছাড়াও linting স্বয়ংক্রিয় (বিস্ফোরণ 3 2 আছে ... ... 1 জন্য অনুমতি তৈরী করে .. :)
Moz

8

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

ভেরিয়েবলগুলি পিছনে ফেলে রাখা হচ্ছে

এটি সহজেই অসমাপ্ত কাজ এবং এমন ক্ষেত্রগুলির দিকে ইঙ্গিত করতে পারে যেগুলি পাস হতে পারে সমস্ত ভেরিয়েবল ব্যবহার করে না যা সমস্যা হতে পারে। আসুন একটি সাধারণ ফাংশন দেখুন যা এটি ট্রিগার করে:

int foo(int a, int b)
{
   int c = 0;

   if (a > 0)
   {
        return a;
   }
   return 0;
}

কেবল-ওয়াল বা ওয়েস্ট্রা ছাড়াই এটি সংকলন করে কোনও সমস্যা নেই। - ওয়াল আপনাকে জানাবে যদিও এটি cকখনই ব্যবহৃত হয় না:

foo.c: ফাংশনে 'foo':

foo.c: 9: 20: সতর্কতা: অব্যবহৃত ভেরিয়েবল 'সি' [-উনুজেড-ভেরিয়েবল]

-ভেক্সট্রা আপনাকে এও বলবে যে আপনার প্যারামিটার খ কিছুই করে না:

foo.c: ফাংশনে 'foo':

foo.c: 9: 20: সতর্কতা: অব্যবহৃত ভেরিয়েবল 'সি' [-উনুজেড-ভেরিয়েবল]

foo.c: 7: 20: সতর্কতা: অব্যবহৃত প্যারামিটার 'বি' [-উক্ষিত-প্যারামিটার] ইন ফু (ইনট্রে, ইনট বি)

গ্লোবাল ভেরিয়েবল শেডিং

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

int c = 7;

int foo(int a, int b)
{
   int c = a + b;
   return c;
}

-শ্যাডো চালু করা হলে, এই সমস্যাটি চিহ্নিত করা সহজ।

foo.c: 11: 9: সতর্কতা: 'গ' এর ছায়া গোছের ঘোষণা বিশ্বব্যাপী ঘোষণা [-শাদো]

foo.c: 1: 5: নোট: ছায়াযুক্ত ঘোষণা এখানে

ফর্ম্যাট স্ট্রিং

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

void foo(const char * str)
{
    printf("str = %d\n", str);
}

এটি স্ট্রিংটি মুদ্রণ করে না কারণ ফর্ম্যাটিং পতাকাটি ভুল এবং জিসিসি খুশিতে আপনাকে জানাবে এটি সম্ভবত আপনি যা চেয়েছিলেন তা নয়:

foo.c: ফাংশনে 'foo':

foo.c: 10: 12: সতর্কতা: ফর্ম্যাট '% d' 'int' টাইপের আর্গুমেন্টের প্রত্যাশা করে, তবে আর্গুমেন্ট 2-তে টাইপ করা হয়েছে 'কনস্ট চর' * [-ফরম্যাট =]


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


7
এম্বেড করা বিশ্বে যে সতর্কতাগুলি আমাকে সবচেয়ে বেশি উদ্বেগ দেয় তা হ'ল " possible loss of precision" এবং " comparison between signed and unsigned" সতর্কতা। কয়জন "প্রোগ্রামার" এগুলি উপেক্ষা করে তা বুঝতে আমার অসুবিধা হয়েছে (বাস্তবে তারা ত্রুটি কেন নয় আমি সত্যিই নিশ্চিত নই)
মাওগ মনিকারকে

3
পরবর্তী ক্ষেত্রে, @ মাওগ, আমি বিশ্বাস করি যে এটি ত্রুটি নয় এমন প্রাথমিক কারণ sizeofহ'ল স্বাক্ষরযুক্ত, তবে ডিফল্ট পূর্ণসংখ্যার প্রকারে স্বাক্ষরিত। sizeofফলাফলের প্রকার, size_t, সাধারণত, যেমন, যেমন, প্রান্তিককরণ বা অ্যারে / ধারক উপাদান গণনা টাইপ আকার এর সাথে সম্পর্কিত কিছু জন্য ব্যবহৃত যখন সাধারণভাবে পূর্ণসংখ্যার "হিসেবে ব্যবহার করার উদ্দেশ্যে করা হয় intযদি না অন্যথায় প্রয়োজনীয়"। ঠিক কতজন লোককে এইভাবে intতাদের পাত্রে পুনরাবৃত্তি করতে ব্যবহার করতে শেখানো হয় (তুলনা intকরা size_t), এটিকে একটি ত্রুটি তৈরি করে মোটামুটি সবকিছুই ভেঙে ফেলা হবে। ; পি
জাস্টিন সময় - মনিকা

6

এটি সি এর একটি নির্দিষ্ট উত্তর এবং কেন এটি অন্য কোনও কিছুর চেয়ে সি এর থেকে বেশি গুরুত্বপূর্ণ।

#include <stdio.h>
int main()
{
   FILE *fp = "some string";
}

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

সাথে gcc, আমরা এটি হিসাবে gcc -Wall -Werror

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


5

সংকলক সতর্কতাগুলি আপনার বন্ধু (চিৎকার নয়, জোরের জন্য বড় হাতের অক্ষর)।

আমি লিগ্যাসি ফোর্টরান -77 সিস্টেমে কাজ করি। সংকলকটি আমাকে মূল্যবান জিনিসগুলি বলে: একটি ভ্যারিয়েবলে মান নির্ধারণের আগে স্থানীয় চলকটি ব্যবহার করে একটি সাব্রুটাইন কলটিতে আর্গুমেন্ট ডাটাটাইপ মেলেনি, যদি আমার কোনও ভেরিয়েবল বা সাব্রোটাইন যুক্তি থাকে যা ব্যবহার হয় না। এগুলি প্রায় সর্বদা ত্রুটি।

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


5

আপনার সর্বদা সংকলক সতর্কতাগুলি সক্ষম করা উচিত কারণ সংকলকটি প্রায়শই আপনাকে বলতে পারে যে আপনার কোডে কী সমস্যা। এটি করার জন্য, আপনি সংকলকটি পাস -Wall -Wextraকরুন।

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


4

সি ++ এ সংকলক সতর্কতা কিছু কারণে খুব দরকারী।

1 - এটি আপনাকে দেখানোর অনুমতি দেয় যে আপনি কোথায় ভুল করতে পারেন যারা আপনার ক্রিয়াকলাপের চূড়ান্ত ফলাফলকে প্রভাবিত করতে পারে। উদাহরণস্বরূপ, যদি আপনি কোনও পরিবর্তনশীল আরম্ভ না করেন বা "==" পরিবর্তে "=" রাখেন (কেবল উদাহরণ রয়েছে)

2 - এটি আপনাকে দেখানোর অনুমতি দেয় যেখানে আপনার কোডটি সি ++ এর মানের সাথে খাপ খায় না। এটি কার্যকর কারণ কোডটি যদি প্রকৃত মান অনুসারে হয় তবে উদাহরণস্বরূপ কোডটিকে অন্য একটি প্ল্যাটফর্মে সরানো সহজ হবে।

সাধারণভাবে, সতর্কতাগুলি আপনাকে দেখানোর জন্য আপনাকে দরকারী যেখানে আপনার কোডে ভুল রয়েছে যারা আপনার অ্যালগরিদমের ফলাফলকে প্রভাবিত করতে পারে বা যখন ব্যবহারকারী আপনার প্রোগ্রামটি ব্যবহার করবে তখন কিছু ত্রুটি রোধ করতে পারে।


4

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


2
আমি আশা করি আমি এই উত্তরটি একাধিকবার উপস্থাপন করতে পারতাম!
এফকেইন্টারনেট

4

আমি একবার একটি বৃহত (ফরচুন 50) প্রতিষ্ঠানের হয়ে কাজ করেছি যা বৈদ্যুতিন পরীক্ষার সরঞ্জাম প্রস্তুত করে।

আমার গোষ্ঠীর মূল পণ্যটি ছিল একটি এমএফসি প্রোগ্রাম যা বছরের পর বছর ধরে আক্ষরিক অর্থে কয়েকশ সতর্কতা তৈরি করে। যা প্রায় সব ক্ষেত্রেই উপেক্ষা করা হয়েছিল।

বাগগুলি দেখা দিলে এটি হ'ল ফ্রিগিং দুঃস্বপ্ন।

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

আমি সমস্ত বিল্ডের জন্য একটি 'সতর্কতা না' নীতিকে উত্সাহিত করেছি, সংকলক সতর্কতা স্তরগুলি বেশ গোলমাল হতে চলেছে।

আমাদের অনুশীলনটি ছিল # প্রগমা সতর্কতা - এমন কোডের জন্য ধাক্কা / অক্ষম / পপ যা বিকাশকারী নিশ্চিত ছিলেন যে ঠিক ততক্ষণে ডিবাগ স্তরে লগ স্টেটমেন্ট সহ।

এই অনুশীলনটি আমাদের পক্ষে ভাল কাজ করেছিল।


1
Seconded। #pragma warningকেবল সতর্কবাণী দমন করে না, এটি অন্যান্য প্রোগ্রামারদের সাথে দ্রুত যোগাযোগ করার দ্বৈত উদ্দেশ্যে কাজ করে যা কিছু ইচ্ছাকৃত এবং দুর্ঘটনাজনক নয় এবং যখন কিছু ভেঙে যায় তবে ত্রুটি সংশোধন / সতর্কতাগুলি স্থির করে না এমন সম্ভাব্য সমস্যাযুক্ত জায়গাগুলি দ্রুত সনাক্ত করার জন্য অনুসন্ধান ট্যাগ হিসাবে কাজ করে ঠিক কর.
জাস্টিন সময় - মনিকা

আপনি ঠিক জাস্টিন, আমি ঠিক ঠিক এইভাবেই # প্যাগমা সতর্কতা দেখেছি
জিম ইন টেক্সাস

3

একটি সতর্কতা হল ত্রুটি যা হওয়ার অপেক্ষায়। সুতরাং আপনাকে অবশ্যই সংকলক সতর্কতাগুলি সক্ষম করতে হবে এবং কোনও সতর্কতা অপসারণ করতে আপনার কোডটি পরিপাটি করা উচিত।


3

সতর্কতাগুলিকে ত্রুটি হিসাবে বিবেচনা করার ক্ষেত্রে কেবল একটি সমস্যা রয়েছে: আপনি যখন অন্য উত্সগুলি (যেমন, মাইক্রো $ ** টি লাইব্রেরি, ওপেন সোর্স প্রকল্পগুলি) থেকে আসা কোডটি ব্যবহার করেন, তখন তারা তাদের কাজটি সঠিকভাবে করেনি এবং তাদের কোডগুলি সংকলন টন উত্পন্ন করে সতর্কতা।

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

আমি আমার কোডটিও নথিভুক্ত করেছি কারণ আমি জানি যে সফটওয়্যারটির আসল আজীবন ব্যয় বেশিরভাগ রক্ষণাবেক্ষণ থেকে আসে, প্রাথমিকভাবে এটি লেখা থেকে নয়, তবে এটি একটি ভিন্ন গল্প ...


এটিকে আঘাত করবেন না, যারা ক্লায়েন্টদের কাছে জোরে জোরে সংকলক সতর্কতাগুলি পড়তে পারেন তাদের জন্য পরামর্শমূলক কাজের ভাল অর্থ রয়েছে।
এম

অন্যান্য উত্স সতর্কবার্তা উৎপাদিত থেকে কোড না প্রয়োজনীয় গড় যে লেখক পঙ্কিল ছিলেন। এর অর্থ এইও হতে পারে যে তারা কোডটি একটি পৃথক সংকলক সহ সংকলন করেছে যা সতর্কতার বিভিন্ন সেট তৈরি করেছে। কোডটি একটি সংকলকটিতে সতর্কতা ছাড়াই সংকলন করতে পারে এবং অন্যটিতে সতর্কতা উত্পন্ন করতে পারে। অথবা এটি কেবল সতর্কতার বিকল্পগুলির একটি আলাদা সেট; যেমন তারা ব্যবহার করেছে -Wallএবং আপনি ব্যবহার করেন -Wall -Wextra
celtschk

2

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

কিছু সংকলক যেমন, জিসিসি, "ত্রুটি হিসাবে সতর্কতা" মোড সক্রিয় করার জন্য একটি কমান্ড লাইন বিকল্প রাখে, এটা দুর্দান্ত, নিষ্ঠুর হলে, নবাগত কোডারদের শিক্ষিত করার সরঞ্জাম।


1

সত্য যে সি ++ কম্পাইলার কোড কম্পাইল করেন যে স্পষ্টত অনির্ধারিত আচরণ ফলাফল এ সব কম্পাইলার একটি প্রধান ত্রুটি নেই। তারা এটি ঠিক না করার কারণ হ'ল এটি করার ফলে কিছু ব্যবহারযোগ্য বিল্ডস ভেঙে যায়।

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


ব্যঙ্গাত্মকভাবে, অনেক অপরিজ্ঞাত আচরণ আসলে সতর্কবার্তা সৃষ্টি করে না, তবে চুপচাপ একটি অদ্ভুত সামান্য সময় বোমাতে কেবল সূক্ষ্ম সংকলন করে। ; পি
জাস্টিন সময় - মনিকা

1
সমস্যাটি হ'ল মানটি যদি কোনও ত্রুটি বার্তার দাবি করে তবে সমস্যাটি ঘটেছে এমন সমস্ত ক্ষেত্রে সেই ত্রুটি বার্তা জারি করতে হবে , তবে কখনও সমস্যাটি না ঘটলে। তবে অপরিজ্ঞাত আচরণের মতো ক্ষেত্রে সিদ্ধান্ত নেওয়া অসম্ভব হতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি বিবেচনা করুন: int i; if (fun1()) i=2; if (fun2()) i=3; char s="abcde"[i];এই কোডটি যদি উভয়ই হয় fun1()এবং একই ফাংশন সম্পাদন fun2()করতে পারে তবেই এই কোডটি অপরিজ্ঞিত আচরণ প্রদর্শন falseকরে। কোনটি সত্য বা নাও হতে পারে তবে সংকলকটি কীভাবে বলবেন?
celtschk

-2

আপনার অবশ্যই স্পষ্টভাবে সংকলক সতর্কতাগুলি সক্ষম করা উচিত কারণ কিছু সংকলক নিম্নলিখিত কয়েকটি সাধারণ প্রোগ্রামিং ভুলগুলি রিপোর্ট করার ক্ষেত্রে খারাপ bad

-> প্রাথমিকভাবে কোনও ভেরিয়েবল ভুলে যায় -> কোনও ফাংশন থেকে কোনও মূল্য মিস হয়ে যায় -> প্রিন্টফ এবং স্ক্যানফ পরিবারগুলিতে ফর্ম্যাট স্ট্রিংয়ের সাথে মেলে না এমন সাধারণ যুক্তিগুলি আগেই ঘোষণা না করেই ব্যবহৃত হয়, যদিও কেবল সি তে ঘটে

সুতরাং এই ফাংশনগুলি সনাক্ত এবং রিপোর্ট করা যেতে পারে, কেবলমাত্র ডিফল্টরূপে নয়; সুতরাং এই বৈশিষ্ট্যটি স্পষ্টভাবে সংকলক বিকল্পগুলির মাধ্যমে অনুরোধ করা উচিত।


-32

এটিকে সহজ করে নিন: আপনার দরকার নেই, এটি প্রয়োজনীয় নয়। -ওয়াল এবং-ওয়ারার কোডটি রিফ্যাক্টরিং পাগলগুলি তাদের জন্য ডিজাইন করেছিল: এটি ব্যবহারকারীর পক্ষ থেকে সংকলক আপডেটের পরে বিদ্যমান বিল্ডগুলি না ভাঙ্গার জন্য সংকলক বিকাশকারীরা আবিষ্কার করেছিলেন it । বৈশিষ্ট্যটি কিছুই নয়, তবে বিল্ডটি ভাঙার বা না ভাঙার সিদ্ধান্ত সম্পর্কে।

এটি ব্যবহার করা বা না করা আপনার পছন্দগুলির উপর নির্ভর করে। আমি এটি সর্বদা ব্যবহার করি কারণ এটি আমার ভুলগুলি সংশোধন করতে আমাকে সহায়তা করে।


19
যদিও এটি বাধ্যতামূলক নয় তবে
এগুলি

18
-Wall and -Werror was designed by code-refactoring maniacs for themselves.[উদ্ধৃতি আবশ্যক]
ওয়াইএসসি

22
দেখে মনে হচ্ছে আপনি নিজের মতবিরোধ করছেন। আপনি যদি "সর্বদা এটির জন্য ব্যবহার করেন কারণ এটি [আপনার] ভুলগুলি সংশোধন করতে সহায়তা করে", তবে নতুন প্রোগ্রামারদের শেখানো কি উপযুক্ত নয় যাতে তারা যেকোন জায়গা থেকে এই কাজটি করবে? আমি মনে করি না যে এই প্রশ্নটি জিজ্ঞাসা করছে কিনা তা নয় ছাড়া সংকলন করা সম্ভব-Wall এবং -Werrorএটি কেবল একটি ভাল ধারণা কিনা তা জিজ্ঞাসা করছে। কোনটি, আপনার শেষ বাক্য থেকে মনে হচ্ছে আপনি এটি বলছেন।
scohe001

12
আপনার দ্বারা লিখিত না থাকা কোড বজায় রাখার বিষয়ে আরও অভিজ্ঞতা পেলে, এই উত্তরটি আবার দেখুন।
থরবজর্ন রাভন অ্যান্ডারসন

এটি কোনও সহায়ক উত্তর নয়। ওপিএস প্রশ্নে 4 টি প্রশ্ন চিহ্ন রয়েছে। এই উত্তরটি কতজন দেয়?
অ্যান্ডার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.