কম্পাইলারটি আমার কোডটি ভেঙেছে কিনা তা আমি কীভাবে জানব এবং যদি সংকলকটি হয় তবে আমি কী করব?


14

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

ধরুন আমার কাছে এমন কিছু কোড রয়েছে যা কেবলমাত্র উচ্চতর অপটিমাইজেশন স্তরের সাথে সংকলিত হয়ে গেলে ব্রেক হয়ে যায়। এটি কোড বা সংকলক কিনা তা আমি কীভাবে জানতে পারি এবং এটি সংকলক হলে আমি কী করব?


43
সম্ভবত এটি আপনি।
littleadv

9
@ লিটলিয়াডভ, এমনকি সিসিএসসি এবং এমএসভিসি-র সাম্প্রতিক সংস্করণগুলি বাগগুলি পূর্ণ, তাই আমি এতটা নিশ্চিত হতে পারি না।
এসকে-যুক্তি

3
আপনি সমস্ত সতর্কতা সক্ষম করেছেন?

@ থরবজর্ন রাভন অ্যান্ডারসন: হ্যাঁ, আমি সেগুলি সক্ষম করেছি।
ধারালো টুথ

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

উত্তর:


19

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

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


@ এসকে-যুক্তি, যথেষ্ট ন্যায্য, এটির পিছনে আমার কাছে কোনও পরিসংখ্যান নেই। এটি আমার নিজের অভিজ্ঞতার ভিত্তিতে তৈরি, এবং আমি স্বীকার করি যে আমি ভাষা এবং / অথবা সংকলকটির সীমা খুব কমই প্রসারিত করেছি - অন্যরা এটি প্রায়শই ঘন ঘন করতে পারে।
প্যাটার তুরিক

(1) @ এসকে-লজিক: সবেমাত্র একটি সি ++ সংকলক বাগ, একই কোড পাওয়া গেছে, একটি সংকলকটিতে চেষ্টা করে কাজ করেছে, অন্যটিতে চেষ্টা করেছে kes
umlcat

8
@ অমলক্যাট: সম্ভবত অনিষ্টিত আচরণের উপর নির্ভর করে এটি আপনার কোড ছিল; একটি সংকলকটিতে এটি আপনার প্রত্যাশার সাথে মেলে, অন্যথায় তা হয় না। তার মানে এই নয় যে এটি ভেঙে গেছে।
জাভিয়ের

@ রিচ মেল্টন, আপনি কি কখনও এলটিও ব্যবহার করেছেন?
এসকে-যুক্তি

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

14

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


কি সাহায্য করতে পারে? এটি যদি একটি সংকলক বাগ হয় - তবে কী?
littleadv

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

সুতরাং আমি আমার উত্তরে যেমন বলেছি - রিপোর্ট করা বাদে চিকিত্সার ক্ষেত্রে তেমন কোনও পার্থক্য নেই, এর দোষ নির্বিশেষে।
littleadv

3
@ লিটলএডিভি, কোনও সমস্যার প্রকৃতি না বুঝে আপনি বার বার এর মুখোমুখি হতে পারেন। এবং প্রায়শই নিজের থেকেই একটি সংকলক ঠিক করার সম্ভাবনা থাকে। এবং হ্যাঁ, দুর্ভাগ্যক্রমে, সি ++ সংকলকটিতে বাগ খুঁজে পাওয়া মোটেই "সম্ভাবনা" নয়।
এসকে-যুক্তি

10

ফলস্বরূপ অ্যাসেম্বলি কোডটি পরীক্ষা করুন এবং দেখুন এটি আপনার উত্স যেটি কল করছে তা করে কিনা what মনে রাখবেন যে প্রতিক্রিয়াগুলি খুব বেশি যে এটি কোনও অ-সুস্পষ্ট ফ্যাশনে দোষের জন্য সত্যই আপনার কোড।


1
সত্যই এই প্রশ্নের একমাত্র উত্তর। এই ক্ষেত্রে সংকলকগুলির কাজ আপনাকে সি ++ থেকে অ্যাসেম্বলি ভাষায় নিয়ে আসা। আপনি মনে করেন এটি সংকলক ... সংকলকগুলির কাজ পরীক্ষা করুন। এটা যে সহজ।
old_timer

7

৩০ বছরেরও বেশি প্রোগ্রামিংয়ের মধ্যে, জেনুইন সংকলক (কোড জেনারেশন) বাগের সন্ধান পেয়েছি এখনও 10 ডলার is একই সময়টিতে আমার নিজের (এবং অন্যান্য লোকদের) যে বাগগুলি খুঁজে পেয়েছি এবং ঠিক করেছি তা সম্ভবত সম্ভবত > 10,000 আমার "থাম্বের নিয়ম" তখন হ'ল সংকলকটির কারণে প্রদত্ত কোনও বাগের সম্ভাবনাটি <0.001।


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

2
25 বছর এবং আমি খুব অনেক দেখেছি। সংকলকগুলি প্রতি বছর খারাপ হচ্ছে।
old_timer

5

আমি একটি মন্তব্য লিখতে শুরু করেছিলাম এবং তারপরে এটির সিদ্ধান্তটি অনেক দীর্ঘ এবং খুব বেশি মাত্রায়।

আমি তর্ক করব যে এটি আপনার কোডটি ভঙ্গ হয়েছে। আপনি সংকলকটিতে একটি বাগ আবিষ্কার করেছেন এমন সম্ভাব্য ইভেন্টে - আপনার এটি সংকলক বিকাশকারীদের কাছে রিপোর্ট করা উচিত, তবে এখানেই পার্থক্যটি শেষ হয় ends

সমাধানটি হ'ল আপত্তিকর নির্মাণগুলি সনাক্ত করা এবং এটি পুনরায় চুলক করা যাতে এটি একই যুক্তিটি ভিন্নভাবে করতে পারে। এটি সম্ভবত সমস্যাটি সমাধান করবে, বাগ আপনার পক্ষে বা সংকলকটিতে রয়েছে কিনা।


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

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

2

এটি আপনার কোড বা সংকলক কিনা তা জানতে চাইলে আপনাকে সি ++ এর স্পেসিফিকেশনটি পুরোপুরি জানতে হবে।

সন্দেহ যদি অব্যাহত থাকে তবে আপনাকে x86 সমাবেশটি পুরোপুরি জানতে হবে।

আপনি যদি উভয়কে সিদ্ধিতে শেখার মুডে না থাকেন তবে এটি অবশ্যই একটি অপরিজ্ঞাত আচরণ যা আপনার সংকলকটি অপ্টিমাইজেশন স্তরের উপর নির্ভর করে ভিন্নভাবে সমাধান করে।


(+1) @ মউভিচিয়েল: এটি বৈশিষ্ট্যটি যদি সংকলক দ্বারা সমর্থিত হয়, এমনকি যদি এটি নির্দিষ্টকরণে থাকে তবে এটিও নির্ভর করে। আমার সাথে জিসিসি সহ একটি অদ্ভুত বাগ রয়েছে। আমি একটি "ফাংশন পয়েন্টার" সহ একটি "সরল সি কাঠামো" ঘোষণা করি, এটি নির্দিষ্টকরণে অনুমোদিত, তবে কিছু পরিস্থিতিতে কাজ করে এবং অন্যটিতে হয় না।
umlcat

1

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

এটি আপনার বা সংকলক কিনা তা জানতে আমার কোনও পরামর্শ নেই have আপনি অন্য সংকলক চেষ্টা করতে পারেন।

একদিন আমি ভাবছিলাম যে এটি আমার কোড কিনা বা না এবং কেউ আমার কাছে ভালগ্রাইন্ডের পরামর্শ দেয়। এটির সাথে আমার প্রোগ্রামটি চালাতে আমি 5 বা 10 মিনিট ব্যয় করেছি (আমি মনে করি)valgrind --leak-check=yes myprog arg1 arg2 এটি করেছে তবে আমি অন্যান্য বিকল্পের সাথে খেলেছি) এবং এটি তাত্ক্ষণিকভাবে আমাকে একটি লাইন দেখিয়েছিল যা একটি নির্দিষ্ট মামলার অধীনে চলেছিল যা সমস্যা ছিল। তারপরে কোনও অদ্ভুত ক্র্যাশ, ত্রুটি বা অদ্ভুত আচরণ না করেই আমার অ্যাপটি সহজেই চলেছিল ran ভালগ্রাইন্ড বা এর মতো অন্য কোনও সরঞ্জাম এটি আপনার কোড কিনা তা জানার একটি ভাল উপায়।

পার্শ্ব দ্রষ্টব্য: আমি একবার ভাবলাম কেন আমার অ্যাপ্লিকেশনটির কর্মক্ষমতা চুষছে। এটি দেখা গেল আমার সমস্ত পারফরম্যান্স সমস্যাগুলিও একই লাইনে ছিল। আমি লিখেছি for(int i=0; i<strlen(sz); ++i) {। Sz কয়েক এমবি ছিল। কোনও কারণে সংযোজকটি প্রতিবার অপ্টিমাইজেশনের পরেও শক্ত হয়ে গেছে ran এক লাইন বড় জিনিস হতে পারে। পারফরম্যান্স থেকে ক্রাশ পর্যন্ত


1

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

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


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

@ প্রতিলিপি: সি ৮৯ সংকলকগুলি তাদের পূর্বসূরীদের সাথে wardর্ধ্বমুখীভাবে সামঞ্জস্যপূর্ণ হিসাবে প্রচারিত হয়েছিল, এবং একইভাবে সি 99 ইত্যাদির জন্য, যদিও সি 89 আগে কিছু প্ল্যাটফর্মে সংজ্ঞায়িত করা হয়েছিল তবে অন্যদের নয় এমন আচরণের ক্ষেত্রে কোনও প্রয়োজনীয়তা আরোপ করে না, wardর্ধ্বমুখী সামঞ্জস্যতা সি -৯৯ সংকলকগুলির প্রস্তাব দেয় প্ল্যাটফর্মগুলি যে আচরণগুলিকে সংজ্ঞায়িত হিসাবে বিবেচনা করে সেগুলি করা চালিয়ে যাওয়া উচিত; সংক্ষিপ্ত স্বাক্ষরযুক্ত প্রকারের লক্ষণগুলিতে প্রচারের যুক্তিটি সুপারিশ করবে যে স্ট্যান্ডার্ড এটি বাধ্যতামূলক করেছে কিনা তা স্ট্যান্ডার্ডের সংকলকগুলির লেখকরা সেভাবে আচরণ করবেন expected আরও ...
সুপারক্যাট

... এলিয়াসিং বিধিমালার কঠোর ব্যাখ্যা উইন্ডো থেকে upর্ধ্বমুখী সামঞ্জস্যতা ফেলে দেয় এবং অনেক ধরণের কোডকে অকার্যকর করে তোলে তবে কয়েকটি সামান্য টুইট (যেমন কিছু প্যাটার্নগুলি চিহ্নিত করা যেখানে ক্রস-টাইপ আলিয়াসিং আশা করা উচিত এবং তাই অনুমতিযোগ্য) উভয় সমস্যার সমাধান করবে । এই নিয়মের পুরো উল্লিখিত উদ্দেশ্যটি হ'ল "হতাশাবাদী" এলিয়াসিং অনুমানগুলি তৈরি করার জন্য সংকলকগুলির প্রয়োজনীয়তা এড়ানো, তবে "ফ্লোট এক্স" দেওয়া উচিত, "foo" (int *) & x) "foo" না করলেও x পরিবর্তন করা উচিত বলে মনে করা উচিত 'ফ্লোট * "বা" চর * "টাইপের কোনও বিন্দুতে লিখবেন না" হতাশাবাদী "বা" সুস্পষ্ট "হিসাবে বিবেচিত?
সুপারক্যাট

0

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

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


0

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

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

Valgrind টুল, এবং সাম্প্রতিক -fsanitize= যন্ত্রানুষঙ্গের অপশন থেকে জিসিসি (অথবা ঝনঝন / LLVM ), এছাড়াও সহায়ক হওয়া উচিত। এবং অবশ্যই, সমস্ত সতর্কতা সক্ষম করুন:g++ -Wall -Wextra

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