সি
একটি ফাইলের মধ্যে চিঠি "এক্স" হারিয়ে গেছে। এটির জন্য একটি প্রোগ্রাম লেখা হয়েছিল:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE* fp = fopen("desert_file", "r");
char letter;
char missing_letter = argv[1][0];
int found = 0;
printf("Searching file for missing letter %c...\n", missing_letter);
while( (letter = fgetc(fp)) != EOF ) {
if (letter == missing_letter) found = 1;
}
printf("Whole file searched.\n");
fclose(fp);
if (found) {
printf("Hurray, letter lost in the file is finally found!\n");
} else {
printf("Haven't found missing letter...\n");
}
}
এটি সংকলিত হয়েছিল এবং দৌড়াতে হয়েছিল এবং এটি শেষ পর্যন্ত চিৎকার করে:
Hurray, letter lost in the file is finally found!
নতুন লোকটি এসে কোডটি অনুকূলিত না করা অবধি বহু বছর ধরে চিঠিগুলি এইভাবে উদ্ধার করা হয়েছে। তিনি ডেটাটাইপগুলির সাথে পরিচিত ছিলেন এবং জানতেন যে অ-নেতিবাচক মানগুলির জন্য স্বাক্ষর করা ছাড়া স্বাক্ষরযুক্ত ব্যবহার করা আরও ভাল কারণ এর বিস্তৃত পরিসীমা রয়েছে এবং এটি ওভারফ্লো থেকে কিছুটা সুরক্ষা দেয়। সুতরাং তিনি স্বাক্ষরবিহীন ইন মধ্যে int পরিবর্তন । তিনি এসকিও যথেষ্ট পরিমাণে জানতেন যে তাদের সর্বদা অ-নেতিবাচক মূল্য রয়েছে। সুতরাং তিনি চরটি স্বাক্ষরবিহীন চরেও পরিবর্তন করলেন । তিনি কোডটি সংকলন করেছিলেন এবং নিজের ভাল কাজের জন্য গর্বিত হয়ে বাড়ি চলে গেলেন। প্রোগ্রামটি এরকম দেখাচ্ছে:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE* fp = fopen("desert_file", "r");
unsigned char letter;
unsigned char missing_letter = argv[1][0];
unsigned int found = 0;
printf("Searching file for missing letter %c...\n", missing_letter);
while( (letter = fgetc(fp)) != EOF ) {
if (letter == missing_letter) found = 1;
}
printf("Whole file searched.\n");
fclose(fp);
if (found) {
printf("Hurray, letter lost in the file is finally found!\n");
} else {
printf("Haven't found missing letter...\n");
}
}
পরের দিন তিনি একটি সর্বনাশ ফিরে এসেছিলেন। চিঠি "এ" অনুপস্থিত ছিল এবং যদিও এটি "মরুভূমি_ফায়লে" থাকার কথা ছিল যাতে "এবিসি" রয়েছে প্রোগ্রামটি চিরতরে কেবল এটি মুদ্রণ করে যাচ্ছিল:
Searching file for missing letter a...
তারা লোকটিকে বরখাস্ত করে এবং পূর্ববর্তী সংস্করণে ফিরে গেছে মনে করে যে কারও কাছে কোডিং ডেটাটাইপগুলি কখনই অনুকূলিত করা উচিত নয় working
তবে তাদের এখানে কী শিক্ষা নেওয়া উচিত ছিল?
প্রথমত, আপনি যদি এসকিআই টেবিলটি একবার দেখে থাকেন তবে খেয়াল করবেন যে কোনও ইওফ নেই। এজন্য যে ইওএফ কোনও অক্ষর নয় তবে fgetc () থেকে প্রত্যাবর্তিত একটি বিশেষ মান, যা হয় অক্ষরের পূর্বে বা -1 ফাইলের শেষ পর্যন্ত প্রসারিত করতে পারে।
যতক্ষণ না আমরা স্বাক্ষর করা চর ব্যবহার করি সবকিছু ভালভাবে কাজ করে - 50 এর সমান চরটি fgetc () দ্বারা 50 এর সমান প্রান্তেও প্রসারিত হয়। তারপরে আমরা এটিকে আবার চরে রূপান্তর করি এবং এখনও 50 টি আছে-একই -1 -1 বা fgetc () থেকে আসা অন্য কোনও আউটপুটও ঘটে।
তবে দেখুন যখন আমরা স্বাক্ষরবিহীন চরটি ব্যবহার করি তখন কী ঘটে। আমরা fgetc এ একটি চর দিয়ে শুরু করি () এটি প্রসারিত পর্যন্ত প্রসারিত করি এবং তারপরে স্বাক্ষরবিহীন অক্ষর রাখতে চাই। একমাত্র সমস্যা হ'ল আমরা স্বাক্ষরবিহীন চরে -1 সংরক্ষণ করতে পারি না। প্রোগ্রাম এটিকে 255 হিসাবে সংরক্ষণ করছে যা আর ইওফের সমান নয়।
বিচারকার্য স্থগিত রাখার আদেশ
আপনি যদি বিভাগ 3.1.2.5 এ একবার নজর দেন তবে এএনএসআই সি ডকুমেন্টেশনের অনুলিপিগুলিতে আপনি জানতে পারবেন যে চরটি স্বাক্ষরিত হয়েছে কিনা তা সম্পূর্ণ বাস্তবায়নের উপর নির্ভর করে। কোডটিতে খুব জটিল একটি ত্রুটিপূর্ণ ত্রুটি পাওয়া গেছে বলে লোকটিকে সম্ভবত বরখাস্ত করা উচিত নয়। সংকলক পরিবর্তন করার সময় বা বিভিন্ন স্থাপত্যে যাওয়ার সময় এটি বেরিয়ে আসতে পারে। আমি ভাবছি যদি এমন পরিস্থিতিতে বাগ বেরিয়ে আসে তবে কে বরখাস্ত করা হবে;)
গীত। পল এ কার্টার দ্বারা পিসি অ্যাসেম্বলি ভাষায় উল্লিখিত বাগের চারপাশে প্রোগ্রামটি তৈরি করা হয়েছিল