আমাকে এটি পরিষ্কারভাবে বলতে দাও: আমরা আমাদের প্রোগ্রামগুলিতে অপরিজ্ঞাত আচরণের জন্য প্রার্থনা করি না । এটি কখনও একটি ভাল ধারণা, সময়কাল হয় না। এই নিয়মের বিরল ব্যতিক্রম রয়েছে; উদাহরণস্বরূপ, আপনি যদি অফসেট অফ প্রয়োগকারী কোনও গ্রন্থাগার হন । যদি আপনার ক্ষেত্রে এই ধরনের ব্যতিক্রম ঘটে তবে আপনি সম্ভবত এটি ইতিমধ্যে জানেন। এই ক্ষেত্রে আমরা জানি অবিচ্ছিন্ন স্বয়ংক্রিয় ভেরিয়েবলগুলি অনির্ধারিত আচরণ ।
সংকলকগণ অপরিজ্ঞাত আচরণের আশেপাশে অনুকূলিতকরণ নিয়ে অত্যন্ত আগ্রাসী হয়ে পড়েছে এবং আমরা অনেকগুলি ক্ষেত্রেই আবিষ্কার করতে পারি যেখানে অপরিজ্ঞাত আচরণটি সুরক্ষা ত্রুটির দিকে পরিচালিত করে। সবচেয়ে কুখ্যাত কেসটি সম্ভবত লিনাক্স কার্নেল নাল পয়েন্টার চেক অপসারণ যা আমি আমার উত্তরটিতে সি ++ সংকলন বাগের উল্লেখ করেছি? যেখানে অপরিজ্ঞাপিত আচরণের চারপাশে একটি সংকলক অপ্টিমাইজেশন সীমাবদ্ধ লুপটিকে অসীম রূপান্তরিত করে।
আমরা সিইআরটি-র বিপজ্জনক অপটিমাইজেশন এবং লোকসানহানির কারণ ( ভিডিও ) পড়তে পারি যা বলে যে, অন্যান্য জিনিসগুলির মধ্যে:
ক্রমবর্ধমান, সংকলক লেখকগণ অপ্টিমাইজেশান উন্নত করতে সি এবং সি ++ প্রোগ্রামিং ভাষায় অপরিজ্ঞাত আচরণের সুবিধা গ্রহণ করছেন।
প্রায়শই, এই অপ্টিমাইজেশনগুলি তাদের উত্স কোডে কারণ-প্রভাব বিশ্লেষণ করার বিকাশকারীদের ক্ষমতাকে হস্তক্ষেপ করছে, অর্থাত্ পূর্বের ফলাফলগুলিতে প্রবাহের ফলাফলের নির্ভরতা বিশ্লেষণ করে।
ফলস্বরূপ, এই অপ্টিমাইজেশানগুলি সফ্টওয়্যারটিতে কার্যকারিতা অপসারণ করছে এবং সফ্টওয়্যার ত্রুটি, ত্রুটি এবং দুর্বলতার সম্ভাবনা বাড়িয়ে তুলছে।
বিশেষত অনির্দিষ্ট মানগুলির প্রতি শ্রদ্ধা রেখে সি স্ট্যান্ডার্ড ত্রুটি প্রতিবেদন 451: অবিচ্ছিন্ন স্বয়ংক্রিয় ভেরিয়েবলগুলির অস্থিরতা কিছু আকর্ষণীয় পড়ার জন্য তোলে। এটি এখনও সমাধান করা হয়নি তবে দোলা দিয়ে যাওয়া মূল্যবোধের ধারণাটি প্রবর্তন করে যার অর্থ কোনও মানের অনির্দিষ্টতা প্রোগ্রামের মাধ্যমে প্রচার করতে পারে এবং প্রোগ্রামের বিভিন্ন পয়েন্টে বিভিন্ন অনির্দিষ্ট মান থাকতে পারে।
আমি যেখানে এমন ঘটনা ঘটে তার কোনও উদাহরণ জানি না তবে এই মুহুর্তে আমরা এটিকে বাতিল করতে পারি না।
বাস্তব উদাহরণ, আপনি প্রত্যাশিত ফলাফল নয়
আপনি এলোমেলো মান পাওয়ার সম্ভাবনা কম। একটি সংকলক পুরোপুরি লুপটিকে অপ্টিমাইজ করতে পারে। উদাহরণস্বরূপ, এই সরল ক্ষেত্রে:
void updateEffect(int arr[20]){
for(int i=0;i<20;i++){
int r ;
arr[i] = r ;
}
}
ঝনঝন এটি অপ্টিমাইজ করে ( এটি সরাসরি দেখুন ):
updateEffect(int*): # @updateEffect(int*)
retq
বা সম্ভবত সমস্ত জিরো পান, এই পরিবর্তিত কেসের মতো:
void updateEffect(int arr[20]){
for(int i=0;i<20;i++){
int r ;
arr[i] = r%255 ;
}
}
এটি সরাসরি দেখুন :
updateEffect(int*): # @updateEffect(int*)
xorps %xmm0, %xmm0
movups %xmm0, 64(%rdi)
movups %xmm0, 48(%rdi)
movups %xmm0, 32(%rdi)
movups %xmm0, 16(%rdi)
movups %xmm0, (%rdi)
retq
এই উভয় ক্ষেত্রেই নিখুঁত আচরণের পুরোপুরি গ্রহণযোগ্য ফর্ম।
দ্রষ্টব্য, আমরা যদি কোনও ইটানিয়ামে থাকি তবে আমরা একটি ফাঁদ মান দিয়ে শেষ করতে পারি :
[...] যদি নিবন্ধক একটি বিশেষ-মান-মান রাখে, কয়েকটি নির্দেশনা বাদে নিবন্ধের ফাঁদগুলি পড়ুন [...]
অন্যান্য গুরুত্বপূর্ণ নোট
ইউবি ক্যানারি প্রকল্পে জিসিসি এবং ঝনঝনির মধ্যে যে পার্থক্য রয়েছে তা নোট করা আকর্ষণীয়, তারা অনির্ধারিত স্মৃতির প্রতি শ্রদ্ধার সাথে অপরিজ্ঞাত আচরণের সুযোগ নিতে কতটা আগ্রহী। নিবন্ধ নোট ( জোর আমার ):
অবশ্যই আমাদের নিজের সাথে পুরোপুরি পরিষ্কার হওয়া দরকার যে এই জাতীয় প্রত্যাশার কোনও ভাষা সংস্থার সাথে বিশেষ কোনও সংকলক যা ঘটে তার সাথে কিছুই করার থাকে না, কারণ এই সংকলক সরবরাহকারীরা সেই ইউবি শোষণ করতে রাজি নয় বা কেবল কারণ তারা এখনও এটি কাজে লাগাতে পারেনি । যখন সংকলক সরবরাহকারীর কাছ থেকে কোনও সত্যিকারের গ্যারান্টি উপস্থিত নেই, আমরা বলতে চাই যে অ-এখনও অপ্রদর্শিত ইউবিগুলি টাইম বোমা হয় : সংকলকটি আরও কিছুটা আক্রমণাত্মক হয়ে উঠলে তারা পরের মাসে বা পরের বছর যাওয়ার জন্য অপেক্ষা করছেন।
যেমন ম্যাথিউ এম। উল্লেখ করেছেন যে প্রতিটি সি প্রোগ্রামার অপরিজ্ঞাত আচরণ # 2/3 সম্পর্কে কী জেনে রাখা উচিত তাও এই প্রশ্নের সাথে প্রাসঙ্গিক। এটি অন্যান্য বিষয়গুলির মধ্যে বলে ( জোর দেওয়া খনি ):
উপলব্ধি করা গুরুত্বপূর্ণ এবং ভীতিকর জিনিস যে প্রায় কোনো
অনির্ধারিত আচরণের উপর ভিত্তি করে অপ্টিমাইজেশান ভবিষ্যতে যে কোন সময়ে বগী কোডের উপর আলোড়ন সৃষ্টি হচ্ছে শুরু করতে পারেন । ইনলাইনিং, লুপ আনرولলিং, মেমরি প্রচার এবং অন্যান্য অপ্টিমাইজেশানগুলি আরও ভাল হতে থাকবে, এবং বিদ্যমান থাকার জন্য তাদের কারণগুলির একটি উল্লেখযোগ্য অংশ হ'ল উপরেরগুলির মতো গৌণ অপ্টিমাইজেশানগুলি প্রকাশ করা।
আমার কাছে এটি গভীরভাবে অসন্তুষ্টিজনক, আংশিক কারণ সংকলক অবশ্যম্ভাবীভাবে দোষারোপ করা শেষ করে, তবে এর কারণ এটিও হ'ল সি কোডের বিশাল মৃতদেহগুলি কেবল বিস্ফোরণের অপেক্ষায় স্থল খনি mines
সম্পূর্ণতার জন্য আমার সম্ভবত এটি উল্লেখ করা উচিত যে বাস্তবায়নগুলি অপরিজ্ঞাত আচরণকে ভালভাবে সংজ্ঞায়িত করা বেছে নিতে পারে, উদাহরণস্বরূপ, জিসিসি ইউনিয়নগুলির মাধ্যমে টাইপ পাঞ্জিংকে মঞ্জুরি দেয় যখন সি ++ এ এটি অপরিবর্তিত আচরণের মতো বলে মনে হয় । যদি এটি হয় তবে বাস্তবায়নটির এটি নথি করা উচিত এবং এটি সাধারণত বহনযোগ্য হবে না।