NUL-deref বা শূন্য দ্বারা বিভাজনের মতো আমরা সাধারণত উদ্বিগ্ন বেশিরভাগ ধরণের ইউবি রানটাইম ইউবি। একটি ফাংশন সংকলন যা মৃত্যুদন্ড কার্যকর করা হলে রানটাইম ইউবির কারণ হতে পারে সংকলকটি ক্র্যাশ হওয়ার কারণ নয়। যদি না এটি প্রমাণ করতে পারে যে ফাংশনটি (এবং ফাংশনটির মধ্য দিয়ে সেই পথটি) অবশ্যই প্রোগ্রাম দ্বারা সম্পাদিত হবে ।
(২ য় মতামত: সম্ভবত আমি সংকলনের সময় টেমপ্লেট / কনস্টেক্সপ্রের প্রয়োজনীয় মূল্যায়ন বিবেচনা করিনি that সম্ভবত এটির সময় ইউবি অনুবাদকের সময় স্বেচ্ছাসূচক অদ্ভুততার কারণ হতে পারে এমনকি ফলাফলের ক্রিয়াকলাপটি কখনই ডাকা হয় না))
অনুবাদ সময় ব্যবহারকে আইএসও সি ++ উদ্ধৃতি অংশ মধ্যে @ গল্পবলিয়ে এর উত্তর আইএসও সি মান ব্যবহৃত ভাষা একই। সি constexpr
সংকলনের সময় টেমপ্লেট বা বাধ্যতামূলক eval অন্তর্ভুক্ত নয় ।
তবে মজাদার ঘটনা : আইএসও সি একটি নোটে বলেছেন যে অনুবাদটি যদি সমাপ্ত হয় তবে এটি অবশ্যই একটি ডায়াগোনস্টিক বার্তা সহ থাকতে হবে। বা "অনুবাদ করার সময় আচরণ করা ... একটি দলিলযুক্ত পদ্ধতিতে"। আমি মনে করি না "পরিস্থিতি সম্পূর্ণ উপেক্ষা করা" অনুবাদ থামানো সহ পড়া যায় read
পুরানো উত্তর, অনুবাদ-সময় ইউবি সম্পর্কে জানার আগে লেখা হয়েছিল। এটি রানটাইম-ইউবির ক্ষেত্রে সত্য, এবং সম্ভবত এটি এখনও কার্যকর।
সেখানে যে UB কোন ধরনের জিনিস ঘটবে কম্পাইল সময়ে। এটা হতে পারে প্রোফাইল সঞ্চালনের একটি নির্দিষ্ট পথ বরাবর কম্পাইলার, কিন্তু সি ++ পদ এটা করেননি ঘটেছে সঞ্চালনের পৌছানোর পর্যন্ত যে একটা ফাংশন মাধ্যমে মৃত্যুদন্ড পথ।
এমন একটি প্রোগ্রামে ত্রুটিগুলি যা সংকলন করাও অসম্ভব করে তোলে তা ইউবি নয়, তারা সিনট্যাক্স ত্রুটি। C ++ পরিভাষায় এই জাতীয় প্রোগ্রামটি "সুগঠিত নয়" (যদি আমার স্ট্যান্ডার্ডগুলি সঠিক থাকে)। একটি প্রোগ্রাম সু-গঠিত হতে পারে তবে এতে ইউবি থাকে। অপরিজ্ঞাত আচরণ এবং ইল-গঠনযুক্ত মধ্যে পার্থক্য, কোনও ডায়াগনস্টিক বার্তা প্রয়োজন
যদি না আমি কিছু ভুল বুঝা করছি, আইএসও সি ++ প্রয়োজন এই প্রোগ্রাম কম্পাইল এবং সঠিকভাবে চালানো, কারণ ফাঁসি না শূন্য দ্বারা বিভক্ত করা ছুঁয়েছে করতে। (অনুশীলন (ইন Godbolt ), ভাল কম্পাইলার শুধু কাজ এক্সেকিউটেবল ভুলবেন না। জিসিসি / ঝনঝন সম্পর্কে সতর্ক x / 0
কিন্তু এই, এমনকি যখন নিখুঁত। কিন্তু যাহাই হউক না কেন, আমরা বলতে কিভাবে চেষ্টা করছেন কম আইএসও সি ++ বাস্তবায়ন মান হতে পারবেন। তাই জিসিসি পরীক্ষণ / প্রোগ্রামটি আমি সঠিকভাবে প্রোগ্রামটি লিখেছি তা নিশ্চিত করা ব্যতীত ঝাঁকুনি খুব কমই কার্যকর পরীক্ষা)
int cause_UB() {
int x=0;
return 1 / x;
}
int main(){
if (0)
cause_UB();
}
এর জন্য ব্যবহারের ক্ষেত্রে সি প্রিপ্রসেসর, বা constexpr
ভেরিয়েবলগুলি এবং সেই ভেরিয়েবলগুলিতে শাখা জড়িত থাকতে পারে যা কিছু পথে বাজে কথা বাড়ে যা ধ্রুবকগুলির পছন্দগুলির জন্য কখনও পৌঁছায় না।
সংকলন-সময়-দৃশ্যমান ইউবির জন্য মৃত্যুদন্ড কার্যকর করার পথগুলি কখনই গ্রহণ করা হবে বলে ধরে নেওয়া যায় না, উদাহরণস্বরূপ x86 এর সংকলক ud2
এর সংজ্ঞা হিসাবে একটি (অবৈধ নির্দেশের ব্যতিক্রম) নির্গত করতে পারে cause_UB()
। বা কোনও ফাংশনের মধ্যে, যদি কোনও এক প্রান্তে প্রমাণযোগ্য ইউবি if()
বাড়ে , শাখাটি সরানো যেতে পারে।
কিন্তু সংকলকটি এখনও বুদ্ধিমান এবং সঠিক উপায়ে অন্য সমস্ত কিছু সংকলন করতে হয়েছে। সমস্ত পাথ যেগুলির মুখোমুখি হয় না (বা মুখোমুখি হওয়ার পক্ষে প্রমাণিত হতে পারে না) ইউবি এখনও অবশ্যই এমন একটি সংশ্লেষ করতে হবে যা সি ++ অ্যাবস্ট্রাক্ট মেশিনটি চালাচ্ছিল এমন হিসাবে কার্যকর করে।
আপনি তর্ক করতে পারেন যে শর্তহীন সংকলন-সময়-দৃশ্যমান ইউবি main
এই নিয়মের ব্যতিক্রম। অথবা অন্যথায় সংকলন-সময়-প্রমাণযোগ্য যে কার্যকরভাবে শুরু হওয়া কার্যকর main
গ্যারান্টিযুক্ত ইউবিতে পৌঁছায়।
আমি এখনও তর্ক করতে পারি যে আইনি সংকলক আচরণের মধ্যে একটি গ্রেনেড উত্পাদন করা অন্তর্ভুক্ত যা চালানো হলে বিস্ফোরিত হয় । বা আরও উদ্বেগজনকভাবে, এর সংজ্ঞাটি main
একটি একক অবৈধ নির্দেশ নিয়ে গঠিত। আমি যুক্তি দিয়ে বলছি যে আপনি যদি প্রোগ্রামটি কখনও চালনা না করেন তবে এখনও কোনও ইউবি হয়নি। সংকলক নিজেই বিস্ফোরণ অনুমোদিত নয়, আইএমও।
শাখাগুলির ভিতরে সম্ভাব্য বা প্রযোজ্য ইউবিযুক্ত ফাংশন
মৃত্যুদণ্ডের কোনও প্রদত্ত পথ বরাবর ইউবি পূর্ববর্তী সমস্ত কোড "দূষিত" করতে পিছনের দিকে পৌঁছে যায়। তবে অনুশীলনে সংকলকরা কেবল তখনই সেই নিয়মের সুযোগ নিতে পারে যখন তারা প্রকৃতপক্ষে প্রমাণ করতে পারে যে মৃত্যুদণ্ডের পথগুলি সময়-দৃশ্যমান ইউবি সংকলন করে। যেমন
int minefield(int x) {
if (x == 3) {
*(char*)nullptr = x/0;
}
return x * 5;
}
সংকলকটি এমন asm তৈরি করতে হবে যা INT_MIN এবং INT_MAX এ স্বাক্ষরিত ওভারফ্লো ইউবির কারণ হিসাবে x
এমন পয়েন্টগুলি পর্যন্ত 3 ব্যতীত অন্য সকলের জন্য কাজ করে x * 5
। যদি এই ফাংশনটি কখনও কল করা না হয় x==3
তবে অবশ্যই প্রোগ্রামটিতে কোনও ইউবি নেই এবং অবশ্যই লিখিত হিসাবে কাজ করতে হবে।
আমরা সম্ভবত if(x == 3) __builtin_unreachable();
জিএনইউ সি-তে লিখেছিলাম এমন সংকলকটি বলতে x
যা অবশ্যই 3 নয়।
অনুশীলনে সাধারণ প্রোগ্রামগুলিতে সমস্ত জায়গায় "মাইনফিল্ড" কোড রয়েছে উদাহরণস্বরূপ, কোনও পূর্ণসংখ্যা দ্বারা কোনও বিভাগ সংকলককে প্রতিশ্রুতি দেয় যে এটি শূন্য নয়। যে কোনও পয়েন্টার ডেরিফ সংকলককে প্রতিশ্রুতি দেয় যে এটি নন-নুল।