কোডের কোন অংশগুলি কখনই ব্যবহৃত হয় না তা আমি কীভাবে জানতে পারি?


312

আমার লিগ্যাসি সি ++ কোড রয়েছে যা থেকে আমি অব্যবহৃত কোডটি সরিয়ে ফেলব। সমস্যাটি হ'ল কোড বেসটি বড়।

কোন কোডটি কখনই বলা হয় না / কখনও ব্যবহৃত হয় না তা আমি কীভাবে জানতে পারি?


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

3
এখানে রেফারেন্সটি দেখুন: en.wikedia.org/wiki/Unreachable_code
মার্টিন ইয়র্ক

6
আমি একই বিষয় খুঁজে। stackoverflow.com/questions/229069/...
UmmaGumma

3
হ্যাঁ, সি ++ এর একটি মজার বিষয় হ'ল "অব্যবহৃত" ফাংশনগুলি অপসারণের ফলে কোনও প্রোগ্রামের ফলাফলের পরিবর্তন হতে পারে।
MSalters

1
@ এসএমএলটারস: এটি একটি আকর্ষণীয় ... এটির জন্য আমাদের একটি ওভারলোড সেটে কোন ফাংশনটি একটি প্রদত্ত কলের জন্য বেছে নেওয়া হয়েছে, সে সম্পর্কে সঠিক কথা বলতে হবে? আমার জানা মতে , যদি এখানে 2 টি ক্রিয়াকলাপের নামকরণ করা হয় f()এবং কোনও কল f()কলহীনভাবে 1 তম স্থির করে, তবে কেবলমাত্র 3 র্থ ফাংশন যুক্ত করে কলটি সংকল্প 2 য় করা সম্ভব নয় f()- "সবচেয়ে খারাপ আপনি করতে পারেন "তৃতীয় ফাংশনটি যুক্ত করে কলটি দ্বিধাগ্রস্ত হয়ে যায় এবং তাই প্রোগ্রামটি সংকলন থেকে আটকাতে হয়। কাউন্টারিক্স নমুনাটি দেখতে (= ভয়ঙ্কর হতে হবে) পছন্দ করবে।
j_random_hacker

উত্তর:


197

অব্যবহৃত কোডের দুটি প্রকার রয়েছে:

  • স্থানীয় এক, এটি হ'ল কিছু ফাংশনে কিছু পাথ বা ভেরিয়েবলগুলি অব্যবহৃত হয় (বা ব্যবহৃত তবে অর্থবহ উপায়ে নয়, লিখিত তবে কখনও পড়েনি)
  • বিশ্বব্যাপী এক: ফাংশন যা কখনও বলা হয় না, বৈশ্বিক বস্তু যা কখনও অ্যাক্সেস হয় না

প্রথম ধরণের জন্য, একটি ভাল সংকলক সাহায্য করতে পারে:

  • -Wunused(জিসিসি, ক্ল্যাং ) অব্যবহৃত ভেরিয়েবল সম্পর্কে সতর্ক করা উচিত, কলং অব্যবহৃত বিশ্লেষক এমনকি কখনও কখনও পড়েন না (এমনকি ব্যবহৃত না হলেও) ভেরিয়েবল সম্পর্কে সতর্ক করার জন্য বৃদ্ধি করা হয়েছে।
  • -Wunreachable-code(পুরানো জিসিসি, ২০১০-এ সরিয়ে দেওয়া ) এমন কোনও স্থানীয় ব্লক সম্পর্কে সতর্ক করা উচিত যা কখনও অ্যাক্সেস করা হয় না (এটি প্রারম্ভিক রিটার্ন বা শর্তগুলির সাথে ঘটে যা সর্বদা সত্যকে মূল্যায়ন করে)
  • অব্যবহৃত catchব্লক সম্পর্কে সতর্ক করার মতো আমার কোনও বিকল্প নেই , কারণ সংকলক সাধারণত প্রমাণ করতে পারে না যে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হবে না।

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

সুতরাং দুটি উপায় আছে:

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

আপনি যদি বিষয়টিতে চূড়ান্ত আগ্রহী হন এবং আপনার নিজের দ্বারা কোনও সরঞ্জাম তৈরি করার সময় এবং ঝোঁক থাকে তবে আমি এই জাতীয় সরঞ্জামটি তৈরির জন্য ক্ল্যাং লাইব্রেরিগুলি ব্যবহার করার পরামর্শ দেব।

  1. একটি এএসটি (বিমূর্ত সিনট্যাক্স ট্রি) পেতে ক্ল্যাং লাইব্রেরি ব্যবহার করুন
  2. এন্ট্রি পয়েন্টগুলি থেকে পরের দিকে একটি চিহ্ন এবং ঝাড়ু বিশ্লেষণ সম্পাদন করুন

যেহেতু ক্ল্যাং আপনার জন্য কোডটি বিশ্লেষণ করবে এবং ওভারলোড রেজোলিউশন করবে, তাই আপনাকে সি ++ ভাষা সংক্রান্ত বিধিগুলি মোকাবেলা করতে হবে না এবং আপনি নিজেই সমস্যাটিতে মনোনিবেশ করতে সক্ষম হবেন।

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


7
খুব সুন্দর, +1। আমি আপনাকে পছন্দ করি যে আপনি এমন কোডের মধ্যে পার্থক্য করেছেন যা স্থিতিশীলভাবে নির্ধারণ করা যেতে পারে যে কোনও পরিস্থিতিতে এবং কোড চালাচ্ছে না যা কোনও নির্দিষ্ট দৌড়ে চলে না, তবে সম্ভাব্যভাবে পারে। পূর্ববর্তীটি আমার মনে হয় গুরুত্বপূর্ণ, এবং আপনি যেমনটি বলেন পুরো প্রোগ্রামটির এএসটি ব্যবহার করে একটি পুনঃব্যবহারযোগ্য বিশ্লেষণ এটি পাওয়ার উপায়। ( foo()"ডাকা" হিসাবে চিহ্নিত হওয়া থেকে বিরত রাখা যখন এটি কেবল if (0) { foo(); }বোনাস হিসাবে উপস্থিত হয় তবে এতে অতিরিক্ত স্মার্ট প্রয়োজন requires)
j_random_hacker

@ জেআর্যান্ডম_হ্যাকার: সম্ভবত যে সিএফজি (কন্ট্রোল-ফ্লো গ্রাফ) ব্যবহার করা এখন আমার পক্ষে এটির জন্য ভাল মনে হয় (আপনার উদাহরণের জন্য ধন্যবাদ)। আমি জানি যে ক্ল্যাং আপনি উল্লিখিত ব্যক্তির মতো টোটোলজিকাল তুলনা সম্পর্কে মন্তব্য করতে আগ্রহী এবং এভাবে সিএফজি ব্যবহার করে আমরা সম্ভবত ডেড-কোডটি শুরুর দিকে খুঁজে পেতে পারি।
ম্যাথিউ এম।

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

1
@ j_random_hacker: আসলে সিএফজি সাধারণ ডিগ্রাফের চেয়ে জটিল, যেহেতু এটি শর্তাধীন বিবৃতিগুলির ভিত্তিতে একটি ব্লক থেকে অন্য ব্লকের লিঙ্কগুলির সাথে ব্লকগুলিতে কার্যকর করার জন্য সমস্ত কোডকে প্রতিনিধিত্ব করে। প্রধান সুবিধাটি হ'ল এটি ছাঁটাইয়ের কোডের সাথে প্রাকৃতিকভাবে উপযুক্ত যা স্থিরভাবে মৃত হওয়ার জন্য নির্ধারিত হতে পারে (এটি সনাক্তযোগ্য অজানা ব্লক তৈরি করে যা সনাক্ত করা যায়), তাই আপনি ডিজিট্রাফটি তৈরির জন্য এটিএসটির চেয়ে সিএফজি ব্যবহার করা ভাল you're সম্পর্কে কথা বলছি ... আমি মনে করি :)
ম্যাথিউ এম।

1
@ জেআর্যান্ডম_হ্যাকার: আসলে ক্ল্যাংয়ের এএসটি এটি সমস্ত কিছু স্পষ্ট করে তোলে (বা প্রায় ...) কারণ এটি কোডটি কেবলমাত্র সংকলনের জন্য নয়, কাজ করার জন্য তৈরি। এই মুহূর্তে আসলে একটি আলোচনা আছে কারণ স্পষ্টতই প্রাথমিক সূচীর তালিকাগুলিতে একটি সমস্যা রয়েছে যেখানে এএসটি-তে এই ধরনের অন্তর্নিহিত রূপান্তর উপস্থিত হয় না, তবে আমার ধারণা এটি স্থির হয়ে যাবে।
ম্যাথিউ এম।

35

অব্যবহৃত পুরো ফাংশনগুলির (এবং অব্যবহৃত গ্লোবাল ভেরিয়েবলগুলির ক্ষেত্রে) জিসিসি আসলে আপনার বেশিরভাগ কাজটি জোগাতে পারে আপনি জিসিসি এবং জিএনইউ এলডি ব্যবহার করছেন।

উত্সটি সংকলন করার সময়, ব্যবহারের সাথে সংযোগ স্থাপনের সময় -ffunction-sectionsএবং -fdata-sectionsব্যবহার করুন -Wl,--gc-sections,--print-gc-sections। লিঙ্কার এখন মুছে ফেলা হতে পারে এমন সমস্ত ফাংশন তালিকাভুক্ত করবে কারণ তাদের কখনই ডাকা হয়নি এবং এমন সমস্ত গ্লোবাল যা কখনও উল্লেখ করা হয়নি।

(অবশ্যই, আপনি এই --print-gc-sectionsঅংশটি এড়িয়ে যেতে পারেন এবং লিঙ্কারটি নিঃশব্দে ফাংশনগুলি সরিয়ে ফেলুন, তবে তাদের উত্সতে রাখুন।)

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

কিছু সি ++ - নির্দিষ্ট বৈশিষ্ট্যগুলিও বিশেষত সমস্যা সৃষ্টি করবে:

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

উভয় ক্ষেত্রেই ভার্চুয়াল ফাংশন বা গ্লোবাল-ভেরিয়েবল কনস্ট্রাক্টর দ্বারা ব্যবহৃত যে কোনও কিছুকেও প্রায় রাখতে হবে।

একটি অতিরিক্ত সতর্কতা হ'ল যদি আপনি একটি ভাগ করা লাইব্রেরি তৈরি করেন তবে জিসিসিতে ডিফল্ট সেটিংস ভাগ করা লাইব্রেরির প্রতিটি ক্রিয়াকলাপ রফতানি করবে , যার ফলে লিঙ্কারের সাথে সম্পর্কিত হিসাবে এটি "ব্যবহৃত" হবে। এটি রোধ করার জন্য আপনাকে রফতানির পরিবর্তে চিহ্নগুলি লুকানোর ক্ষেত্রে ডিফল্ট সেট করতে হবে (উদাহরণস্বরূপ ব্যবহার করে -fvisibility=hidden) এবং তারপরে আপনাকে রফতানি করতে হবে এমন রফতানি ফাংশনগুলি স্পষ্টভাবে নির্বাচন করুন।


দুর্দান্ত ব্যবহারিক পরামর্শ। কেবলমাত্র যে ক্রিয়াকলাপগুলি কোথাও ব্যবহার করা হবে না বলে পরিচিত (তারপরেও, যেমন আপনি বলেছেন, এই তালিকাটি সম্পূর্ণ নয়) এর ফলে অনেকগুলি নিম্ন-স্তব্ধ ফল পাবে বলে আমি মনে করি।
j_random_hacker

আমি মনে করি না এর কোনওটিই অনিচ্ছাকৃত টেম্পলেটগুলির জন্য কাজ করে ।
জাকুব ক্লিনকভস্কে

25

আচ্ছা আপনি যদি জি ++ ব্যবহার করেন তবে আপনি এই পতাকাটি ব্যবহার করতে পারেন -Wunused

ডকুমেন্টেশন অনুযায়ী:

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

http://docs.freebsd.org/info/gcc/gcc.info.Warning_Options.html

সম্পাদনা করুন : এখানে অন্যান্য দরকারী পতাকা রয়েছে -Wunreachable-code ডকুমেন্টেশন অনুসারে:

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

আপডেট : আমি লিগ্যাসি সি / সি ++ প্রকল্পে ডেড কোড সনাক্তকরণের অনুরূপ বিষয় পেয়েছি


4
এটি এমন শিরোনামগুলিকে ধরবে না যেগুলি প্রোটোটাইপ ফাংশন যা কখনও বলা হয় না। বা পাবলিক ক্লাসের পদ্ধতিগুলি যা কল হয় না। এটি কেবল স্থানীয়ভাবে স্কোপযুক্ত ভেরিয়েবলগুলি সেই সুযোগের মধ্যে ব্যবহার করা হয় কিনা তা পরীক্ষা করতে পারে।
ফালমারি

@ ফালমারি আমি এই পতাকাটি কখনই ব্যবহার করি না। আমি কী ধরণের ডেড কোডগুলি এর সাথে খুঁজে পেতে পারি তা নিজেই বের করার চেষ্টা করছি।
উম্মা গুম্মা

-Wunusedভেরিয়েবলগুলি সম্পর্কে সতর্ক করে যা ঘোষিত হয় (বা একসাথে ঘোষিত ও সংজ্ঞায়িত) তবে বাস্তবে কখনও ব্যবহৃত হয় না। উপায় দ্বারা স্কোপড গার্ডদের সাথে খুব বিরক্তিকর: p ক্লাংয়ের একটি পরীক্ষামূলক বাস্তবায়ন রয়েছে যাতে এটি অ-উদ্বায়ী ভেরিয়েবলগুলির জন্যও সতর্ক করে দেওয়া হয়েছিল যা (টেড ক্রেমেনেকের দ্বারা) কখনও লেখা হয় না। -Wunreachable-codeকোনও ফাংশনের মধ্যে কোড সম্পর্কে সতর্ক করে যা পৌঁছানো যায় না, এটি কোনও শাখায় throwবা returnবিবৃতি বা কোডের পরে অবস্থিত কোড হতে পারে যা কখনই নেওয়া হয় না (যা টোটোলজিকাল তুলনার ক্ষেত্রে ঘটে) উদাহরণস্বরূপ।
ম্যাথিউ এম। 14

18

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

আপনি এই ওপেন সোর্স কোড কভারেজ সরঞ্জামটিকে একটি সুযোগ দেওয়ার চেষ্টা করতে পারেন: টেস্টককুন - সি / সি ++ এবং সি # এর জন্য কোড কভারেজ সরঞ্জাম।


7
এখানে কীটি "যেমন চলছে তেমনই" - যদি আপনার ইনপুট ডেটাটি কোনও কোড পাথ ব্যবহার না করে তবে সেই পথটি ব্যবহার হিসাবে স্বীকৃত হবে না, তাই না?
শার্পথুথ

1
ঐটা ঠিক. কোডটি পরিচালনা না করে কোন লাইনে পৌঁছানো হচ্ছে তা জানার উপায় নেই। আমি আশ্চর্য হয়েছি যে কয়েকটি সাধারণ রান অনুকরণ করতে কিছু ইউনিট টেস্ট স্থাপন করা কতটা কঠিন।
কার্লোস ভি

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

1
@ ডিগ্রিচ সত্য, সংকলকটি এমন কিছু কোডের যত্ন নিতে পারে যা অ্যাক্সেসযোগ্য নয়, যেমন ফাংশনগুলি ঘোষিত হলেও বলা হয় না এবং কিছু সংক্ষিপ্ত সার্কিট মূল্যায়ন, তবে ব্যবহারকারীর ক্রিয়া বা রান টাইম ভেরিয়েবলের উপর নির্ভর করে এমন কোড সম্পর্কে কী বলা যায়?
কার্লোস ভি

1
@golcarcol ঠিক আছে, আসুন আমরা void func()a.cpp এ ফাংশন করব যা বি.সি.পি.পি. সংকলক কীভাবে চেক করতে পারে, সেই ফানক () প্রোগ্রামে ব্যবহৃত হয়? এটা লঙ্কার কাজ।
উম্মা গুম্মা

15

এখানে আসল উত্তরটি হ'ল: আপনি কখনই নিশ্চিতরূপে জানতে পারবেন না।

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

double x = sqrt(2);
if (x > 5)
{
  doStuff();
}

উইকিপিডিয়া সঠিকভাবে নোট হিসাবে, একটি চৌকস সংকলক এই জাতীয় কিছু ধরতে সক্ষম হতে পারে। তবে একটি পরিবর্তন বিবেচনা করুন:

int y;
cin >> y;
double x = sqrt((double)y);

if (x != 0 && x < 1)
{
  doStuff();
}

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

এবং তারপরে এমন ইনপুট সেট রয়েছে যা কেবল কখনও প্রবেশ করা হয় না। ইনপুট যা বাস্তব জীবনে কোনও ধারণা রাখে না বা অন্য কোথাও বৈধতা যুক্তি দ্বারা অবরুদ্ধ হবে। সংকলকগুলির সেগুলি সম্পর্কে জানার কোনও উপায় নেই।

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

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


1
সত্য এবং মৃত কোডটি ছেড়ে যাবেন না! আপনি যদি কোনও বৈশিষ্ট্য অপসারণ করেন তবে ডেড কোডটি মেরে ফেলুন। এটি "কেবলমাত্র ক্ষেত্রে" রেখে যাওয়ার ফলে ফোলাভাব ঘটে যা (যেমন আপনি আলোচনা করেছেন) পরে খুঁজে পাওয়া শক্ত। সংস্করণ নিয়ন্ত্রণ য এর জন্য হোর্ডিং করুক।
অরবিটে মেঘের হালকাতা রেস

12

আমি নিজে এটি ব্যবহার করি নি, তবে সিপিস চেক , অব্যবহৃত ফাংশনগুলি সন্ধান করার দাবি করে। এটি সম্ভবত সম্পূর্ণ সমস্যার সমাধান করবে না তবে এটি একটি শুরু হতে পারে।


হ্যাঁ, এটি স্থানীয় নয় এমন রেফারেন্সড ভেরিয়েবল এবং ফাংশন সন্ধান করতে সক্ষম।
চুগাইস্টার

cppcheck --enable=unusedFunction --language=c++ .এই অব্যবহৃত ফাংশনগুলি খুঁজে পেতে হ্যাঁ ব্যবহার করুন ।
জেসন হ্যারিস

9

আপনি জিম্পল সফ্টওয়্যার থেকে পিসি-লিন্ট / ফ্লেক্সিলিন্ট ব্যবহার করার চেষ্টা করতে পারেন । এটি দাবি করে

পুরো প্রকল্প জুড়ে অব্যবহৃত ম্যাক্রো, টাইপিডস, ক্লাস, সদস্য, ঘোষণা ইত্যাদি সন্ধান করুন

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


5

অব্যবহৃত জিনিসগুলি সন্ধান করার জন্য আমার স্বাভাবিক পদ্ধতিটি

  1. নিশ্চিত করুন যে বিল্ড সিস্টেম নির্ভরতা ট্র্যাকিং সঠিকভাবে পরিচালনা করে
  2. একটি পূর্ণ-স্ক্রিন টার্মিনাল উইন্ডো সহ একটি দ্বিতীয় মনিটর সেট আপ করুন, পুনরাবৃত্তি বিল্ডগুলি চালনা করে এবং আউটপুটটির প্রথম স্ক্রিনফুল দেখায়। watch "make 2>&1"ইউনিক্সে কৌতুক করতে থাকে।
  3. প্রতিটি লাইনের শুরুতে "//?" যুক্ত করে পুরো উত্স ট্রিটিতে একটি অনুসন্ধান ও প্রতিস্থাপন অপারেশন চালান
  4. "//?" সরিয়ে কম্পাইলার দ্বারা চিহ্নিত প্রথম ত্রুটিটি ঠিক করুন? সংশ্লিষ্ট লাইনে
  5. কোনও ত্রুটি না থাকা পর্যন্ত পুনরাবৃত্তি করুন।

এটি কিছুটা দীর্ঘ প্রক্রিয়া, তবে এটি ভাল ফলাফল দেয়।


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

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

@ সিমন: মুল প্রশ্নটি মূলত একটি মন্তব্যে, এমসাল্টারস উল্লেখ করেছেন যে এমনকি এমন কোনও ফাংশনের জন্য কোনও ঘোষণার উপস্থিতি / অনুপস্থিতি ওভারলোড রেজোলিউশনের দ্বারা আরও 2 টি ফাংশনগুলির মধ্যে কোনটি পাওয়া যায় তা প্রভাবিত করতে পারে। স্বীকারযোগ্যভাবে এটির জন্য একটি অত্যন্ত উদ্ভট এবং স্বীকৃত সেটআপ প্রয়োজন, সুতরাং এটি অনুশীলনে সমস্যা হওয়ার সম্ভাবনা কম।
j_random_hacker

4

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

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

এই পদ্ধতির সুবিধাটি হ'ল আপনি এটি প্রতি মডিউল ভিত্তিতে করতে পারেন, তাই আপনার কোড ভাঙা কোডটি পেয়ে গেলে বড় সময় ব্যতীত আপনার ইউনিট পাস করা সহজ।


3

আপনি যদি লিনাক্সে থাকেন তবে আপনি callgrindসিসির একটি অংশ C / C ++ প্রোগ্রাম বিশ্লেষণ সরঞ্জামটি সন্ধান করতে পারেন valgrind, এতে এমন সরঞ্জাম রয়েছে যা মেমরি ফাঁস এবং অন্যান্য মেমরির ত্রুটিগুলি পরীক্ষা করে (যা আপনার পাশাপাশি ব্যবহার করা উচিত)। এটি আপনার প্রোগ্রামের একটি চলমান উদাহরণ বিশ্লেষণ করে এবং এর কল গ্রাফ এবং কল গ্রাফের নোডের কার্যকারিতা ব্যয় সম্পর্কিত ডেটা উত্পাদন করে। এটি সাধারণত পারফরম্যান্স বিশ্লেষণের জন্য ব্যবহৃত হয় তবে এটি আপনার অ্যাপ্লিকেশনগুলির জন্য একটি কল গ্রাফও তৈরি করে, যাতে আপনি কী ফাংশনগুলি বলা হয় তা দেখতে পারবেন এবং তাদের কলকারীদেরও।

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


3

আমি সত্যিই এমন কোনও সরঞ্জাম ব্যবহার করি নি যা এই জাতীয় কাজ করে ... তবে যতদূর আমি সমস্ত উত্তরগুলিতে দেখেছি, কেউ কখনও বলেনি যে এই সমস্যাটি আপোনাযোগ্য।

আমি এর অর্থ কি? এই সমস্যাটি কোনও কম্পিউটারে কোনও অ্যালগরিদম দ্বারা সমাধান করা যায় না। এই উপপাদ্য (যে এই ধরণের অ্যালগোরিদমের অস্তিত্ব নেই) টিউরিংয়ের হ্যালটিং সমস্যাটির একটি মূলত।

আপনি যে সমস্ত সরঞ্জাম ব্যবহার করবেন তা হ'ল অ্যালগরিদম নয় তবে হিউরিস্টিকস (যেমন সঠিক অ্যালগরিদম নয়)। ব্যবহার করা হয়নি এমন সমস্ত কোড তারা আপনাকে দেবে না।


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

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

2

একটি উপায় হ'ল সংকলনের সময় ডিবাগার এবং অব্যবহৃত মেশিন কোড অপসারণের সংকলক বৈশিষ্ট্য।

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

কমপক্ষে এটি ভিজ্যুয়াল স্টুডিওতে কীভাবে কাজ করে এবং আমার ধারণা অন্যান্য সরঞ্জামসেটগুলিও এটি করতে পারে।

এটি প্রচুর কাজ, তবে আমি সমস্ত কোড ম্যানুয়ালি বিশ্লেষণ করার চেয়ে দ্রুত অনুমান করি।


4
আমি মনে করি যে ওপির প্রশ্নটি উত্স কোডের আরও ছোট, আরও পরিচালিত উপসেট কীভাবে সন্ধান করতে হবে, সংকলিত বাইনারি কার্যকর কিনা তা নিশ্চিত করে না।
j_random_hacker

@ j_random_hacker আমি এটিকে কিছুক্ষণ দিয়েছি - এবং কোড বিলোপটি এমনকি আসল উত্স কোডে ফিরে ট্র্যাকিংয়ের জন্য ব্যবহার করা যেতে পারে।
শার্পথুথ

এটি অর্জনের জন্য আপনার কাছে কি ভিজ্যুয়াল স্টুডিওতে কিছু নির্দিষ্ট সংকলক পতাকা রয়েছে? এবং এটি কি কেবল রিলিজ মোডে কাজ করে বা এটি ডিবাগেও কাজ করবে?
নবীন

সংকলক দ্বারা ব্যবহৃত কিন্তু অপ্টিমাইজড আউট লাইন সম্পর্কে কি?
ইটামার কাটজ

ICF: @Naveen: ভিসুয়াল সি ++ 9 তোমার উপর এবং ব্যবহার / opt অপ্টিমাইজেশান চালু আছে
sharptooth

2

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

দাবি অস্বীকার : আমি সেখানে কাজ করি না, তবে আমি এই সরঞ্জামটির লাইসেন্স পেয়েছি (পাশাপাশি এনডিপেন্ড , যা। নেট কোডের জন্য আরও শক্তিশালী বিকল্প)।

যারা কৌতূহলী তাদের জন্য, এখানে সিসিকিউইনকি-র লিখিত মৃত পদ্ধতিগুলি সনাক্ত করার জন্য বিল্ট-ইন (কাস্টমাইজযোগ্য) নিয়ম রয়েছে :

// <Name>Potentially dead Methods</Name>
warnif count > 0
// Filter procedure for methods that should'nt be considered as dead
let canMethodBeConsideredAsDeadProc = new Func<IMethod, bool>(
    m => !m.IsPublic &&       // Public methods might be used by client applications of your Projects.
         !m.IsEntryPoint &&            // Main() method is not used by-design.
         !m.IsClassConstructor &&      
         !m.IsVirtual &&               // Only check for non virtual method that are not seen as used in IL.
         !(m.IsConstructor &&          // Don't take account of protected ctor that might be call by a derived ctors.
           m.IsProtected) &&
         !m.IsGeneratedByCompiler
)

// Get methods unused
let methodsUnused = 
   from m in JustMyCode.Methods where 
   m.NbMethodsCallingMe == 0 && 
   canMethodBeConsideredAsDeadProc(m)
   select m

// Dead methods = methods used only by unused methods (recursive)
let deadMethodsMetric = methodsUnused.FillIterative(
   methods => // Unique loop, just to let a chance to build the hashset.
              from o in new[] { new object() }
              // Use a hashet to make Intersect calls much faster!
              let hashset = methods.ToHashSet()
              from m in codeBase.Application.Methods.UsedByAny(methods).Except(methods)
              where canMethodBeConsideredAsDeadProc(m) &&
                    // Select methods called only by methods already considered as dead
                    hashset.Intersect(m.MethodsCallingMe).Count() == m.NbMethodsCallingMe
              select m)

from m in JustMyCode.Methods.Intersect(deadMethodsMetric.DefinitionDomain)
select new { m, m.MethodsCallingMe, depth = deadMethodsMetric[m] }

আপডেট: ৩.১ সংস্করণে লিনাক্সের জন্য 3.৪-বিট সমর্থন যুক্ত করা হয়েছে।
রোমান বোইকো

1

আপনার অ্যাপ্লিকেশন তৈরি করতে আপনি যে প্ল্যাটফর্মটি ব্যবহার করেন এটি নির্ভর করে।

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

অন্যথায়, আপনার অ্যাপ্লিকেশনটির কোন ফাংশনটি আপনার শেষ ব্যবহারকারী দ্বারা প্রকৃতপক্ষে ব্যবহৃত হয় তা যদি আপনার জানতে প্রয়োজন হয় এবং আপনি যদি সহজেই আপনার অ্যাপ্লিকেশনটি প্রকাশ করতে পারেন তবে আপনি একটি নিরীক্ষণের জন্য লগ ফাইল ব্যবহার করতে পারেন।

প্রতিটি প্রধান ফাংশনের জন্য, আপনি এর ব্যবহারটি সনাক্ত করতে পারেন, এবং কয়েক দিন / সপ্তাহের পরে কেবল সেই লগ ফাইলটি পান এবং এটি একবার দেখুন।


1
.এনএএনটিএস প্রোফাইলার দেখতে এটি সি # এর মতো দেখাচ্ছে - আপনি কি নিশ্চিত যে এটি সি ++ এর জন্যও কাজ করে?
j_random_hacker

@ j_random_hacker: যতক্ষণ না আমি জানি, এটি পরিচালিত কোড সহ কাজ করে। সুতরাং। নেট এএনটিএস অবশ্যই 'স্ট্যান্ডার্ড' সি ++ কোড (যেমন জিসিসি সহ সংকলিত, ...) বিশ্লেষণ করতে সক্ষম হবে না।
এএস

0

আমি মনে করি এটি স্বয়ংক্রিয়ভাবে করা যায় না।

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

খুব জটিল এবং উচ্চমূল্যের স্ট্যাটিক বিশ্লেষণ সরঞ্জাম হতে পারে যেমন কভারিটির বা এলএলভিএম সংকলক থেকে সহায়তা হতে পারে।

তবে আমি নিশ্চিত নই এবং আমি ম্যানুয়াল কোড পর্যালোচনা পছন্দ করব।

আপডেট

ভাল .. শুধুমাত্র অব্যবহৃত ভেরিয়েবলগুলি অপসারণ করা, অব্যবহৃত ফাংশনগুলি যদিও শক্ত নয়।

আপডেট

অন্যান্য উত্তর এবং মন্তব্য পড়ার পরে, আমি আরও দৃ strongly়ভাবে নিশ্চিত যে এটি করা যায় না।

অর্থপূর্ণ কোড কভারেজ পরিমাপের জন্য আপনাকে কোডটি জানতে হবে এবং আপনি যদি জানেন তবে ক্রেডিট ফলাফল প্রস্তুত / চালানো / পর্যালোচনা করার চেয়ে অনেক বেশি ম্যানুয়াল সম্পাদনা দ্রুত হবে।


2
আপনার উত্তরের বাক্যটি বিভ্রান্তিমূলক, এলএলভিএম সম্পর্কে দামি কিছু নেই ... এটি নিখরচায়!
ম্যাথিউ এম।

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

0

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

https://blog.flameeyes.eu/2008/01/today-how-to-identify-unused-exported-functions-and-variables

আপাতদৃষ্টিতে অবাস্তব নিদর্শন চিহ্নিত করার উদ্দেশ্যে ডিজাইন করা কয়েকটি জিসিসি পতাকা কীভাবে ব্যবহার করতে হয় এটির সম্পূর্ণ বিবরণ!


0

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


-3

আচ্ছা আপনি যদি জি ++ ব্যবহার করেন তবে আপনি এই পতাকাটি ব্যবহার করতে পারবেন -চালিত

ডকুমেন্টেশন অনুযায়ী:

Warn whenever a variable is unused aside from its declaration, whenever a function is declared static but never defined, whenever a label is declared but not used, and whenever a statement computes a result that is explicitly not used.

http://docs.freebsd.org/info/gcc/gcc.info.Warning_Options.html

সম্পাদনা করুন: এখানে অন্যান্য ব্যবহারযোগ্য পতাকা -Wunreachable- কোড ডকুমেন্টেশন অনুযায়ী:

This option is intended to warn when the compiler detects that at least a whole line of source code will never be executed, because some condition is never satisfied or because it is after a procedure that never returns.

6
এই সঠিক তথ্য ইতিমধ্যে বর্তমানে শীর্ষ রেটিং উত্তরে উল্লেখ করা হয়েছে। অকারণে সদৃশতা এড়াতে দয়া করে বিদ্যমান উত্তরগুলি পড়ুন।
j_random_hacker

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