"কখনই 4 এর মান পরিবর্তন করবেন?" - এটি হেইস-টমাস কুইজে কীভাবে আসল?


24

1989 সালে ফেলিক্স লি, জন হেইস এবং অ্যাঞ্জেলা থমাস একটি হ্যাকারের পরীক্ষা লিখেছিলেন অনেকগুলি অভ্যন্তরীণ রসিকতা দিয়ে কুইজের রূপ নিয়ে, " আপনি কি স্লাইম-ছাঁচ খান? "

আমি নিম্নলিখিত সিরিজ বিবেচনা করছি:

0015 Ever change the value of 4?
0016 ... Unintentionally?
0017 ... In a language other than Fortran?

সিরিজে "4" নম্বরটি নির্দিষ্ট করে কি কোনও বিশেষ উপাখ্যান রয়েছে?

কিছু ফোর্টরান বাস্তবায়ন কি ধ্রুবকের মান সংশোধন করার অনুমতি দিয়েছে? তখন কি অন্যান্য ভাষায় সাধারণ ব্যবহারে এটি সম্ভব ছিল?


2
@ আরডস যদি আমরা এখানে দ্বিতীয় প্রশ্ন রাখি তবে আমার আপত্তি নেই, বিশেষ করে উত্তরদাতারা কেন আধুনিক ভাষায় এই ধরনের আচরণ বিদ্যমান তা বোঝাতে যত্ন নেওয়া (যেমন এর কোন ব্যবহারিক ব্যবহার আছে?)। তাই বলা হয়, এটা হবে আরো একটি চমৎকার জন্য কোড গলফ প্রশ্ন।
ইয়ানিস

8
সম্পর্কিত: একটি প্রোগ্রাম লিখুন যা 2 + 2 = 5 করে । একটা জাভা এবং পাইথন সেখানে প্রতিস্থাপন উত্তর 4জন্য 5অন্তরীণ পূর্ণসংখ্যার তালিকায়।
মার্টিজন পিটারস

5
এবং সেই পৃষ্ঠাটিতে একটি মন্তব্য বলেছে যে আপনি ফোরট্রান চতুর্থে আক্ষরিকগুলি পুনরায় সংজ্ঞা দিতে পারেন; 4 = 5সম্ভব ছিল।
মার্টিজন পিটারস

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

5
আমি একবার ফরট্রান প্রোগ্রামে ধ্রুবক শূন্যের মান পরিবর্তন করেছি। এটি ট্র্যাক ডাউন একটি খুব কঠিন বাগ ছিল।
ব্রায়ান ওকলে

উত্তর:


32

পুরানো দিনগুলিতে (1970 এবং তার আগে) কিছু কম্পিউটারের কোনও এমএমইউ ছিল না (এবং এটি আজ খুব সস্তা মাইক্রোকন্ট্রোলারদের ক্ষেত্রে সত্য)।

এই জাতীয় সিস্টেমে কোনও মেমরির সুরক্ষা নেই তাই ঠিকানার জায়গাতে কোনও পঠনযোগ্য বিভাগ নেই , এবং কোনও বগি প্রোগ্রাম একটি ধ্রুবককে ওভাররাইট করতে পারে (হয় ডেটা মেমরিতে বা এমনকি মেশিন কোডের অভ্যন্তরে)।

ফোর্টরান সংকলকরা সেই সময় রেফারেন্স দ্বারা ফর্মাল আর্গুমেন্ট পাস করেছিলেন । সুতরাং যদি আপনি এটি করেন CALL FUN(4)এবং SUBROUTINE FUN(I)এর শরীরের পরিবর্তন হয় I- উদাহরণস্বরূপ তার শরীরে একটি বিবৃতি দিয়ে I = I + 1, আপনি একটি বিপর্যয় ঘটাতে পারেন, কলারে 4 বা 5 পরিবর্তন করে (বা আরও খারাপ)।

এমএস-ডস সহ, 1984 থেকে আসল আইবিএম পিসি এটি এর মতো প্রথম মাইক্রো কম্পিউটারগুলিতেও এটি সত্য ছিল

এফডাব্লুআইডাব্লু, ১৯ 1970০ এর দশকের গোড়ার দিকে কৈশোর বয়সী হিসাবে আমি এইরকম কম্পিউটার ব্যবহার করেছি: IBM1620 এবং CAB500 (একটি যাদুঘরে: এটি 1960 এর যুগের কম্পিউটার!)। আইবিএম 1620 বেশ মজাদার ছিল: এটি সংযোজন এবং গুণনের জন্য মেমরি টেবিলগুলিতে ব্যবহৃত হয় (এবং আপনি যদি এই টেবিলগুলিকে ওভাররোট করেন তবে বিশৃঙ্খলা তৈরি করা হবে)। সুতরাং আপনি কেবল একটি 4 টি ওভাররাইট করতে পারেন তা নয়, আপনি এমনকি প্রতিটি ভবিষ্যতে 2 + 2 সংযোজন বা 7 * 8 গুণগুলিও ওভাররাইট করতে পারেন (তবে আমি সত্যিই এই নোংরা বিবরণগুলি ভুলে গেছি তাই ভুল হতে পারে)।

আপনি যথেষ্ট অধ্যবসায়ী হলে আজ, আপনি ফ্ল্যাশ মেমরিতে BIOS কোডটি ওভাররাইট করতে পারেন। দুঃখের বিষয়, আমি আর মজা অনুভব করি না, তাই আমি কখনও চেষ্টা করিনি। (আমি আমার মাদারবোর্ডে কিছু লিনাক্সবিওস ইনস্টল করতেও ভয় পাই)।

বর্তমান কম্পিউটার এবং অপারেটিং সিস্টেমগুলিতে রেফারেন্স সহ ধ্রুবক অতিক্রম করা এবং এটিকে কলির অভ্যন্তরে পরিবর্তন করা কেবল একটি বিভাজন লঙ্ঘনকে উত্সাহিত করবে , যা অনেক সি বা সি ++ বিকাশকারীদের কাছে পরিচিত বলে মনে হচ্ছে।

বিটিডাব্লু: নিটপিকিং করা: ওভাররাইট 4 টি ভাষা নয়, বাস্তবায়নের বিষয়।


14
1620 এর ডাক নাম ছিল ক্যাডেট: যুক্ত করা যায় না, এমনকি চেষ্টাও করে না।
পিট বেকার

কৌতুকটি প্রায় এখনই পুনরাবৃত্তি হতে পারে gfortran। ধ্রুবকগুলি তাদের সেগমেন্টে রাখা হয় এবং একটি সাবরুটিনের রেফারেন্স দিয়ে পাস করা হয়। ডিফল্টরূপে, ধ্রুবক বিভাগটি কেবল পঠনযোগ্য, তাই মেমরির সুরক্ষা ত্রুটি প্রোগ্রামটিকে হত্যা করে।
নেচ

7

এটি একটি ভুল সংকলক অপ্টিমাইজেশনের সাথে মিশ্রণে ফরটারের ফাংশন কল মূল্যায়ন কৌশলটির একটি অজান্তেই পার্শ্ব প্রতিক্রিয়া ছিল।

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

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

CALL SUBFOO(X + Y, 4)

সংকলক এটিকে পর্দার আড়ালে এমন কিছু রূপান্তরিত করবে

TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)

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

CALL SUBBAR(4)
CALL SUBBAZ(4)

এটি যেমন ছিল তেমন আচরণ করা হবে

FOUR = 4
CALL SUBBAR(FOUR)
CALL SUBBAZ(FOUR)

যা আপনার কাছে এমন একটি উপ-প্রোগ্র্যাম না হওয়া পর্যন্ত করা একেবারে যুক্তিসঙ্গত জিনিস বলে মনে হয় যা এর পরামিতির মান পরিবর্তন করে।

SUBROUTINE SUBBAR(X)
    !...lots of code...
    X = 5
    !...lots of code...
END SUBROUTINE SUBBAR

পরিস্ফুটন! CALL SUBBAR(4)আক্ষরিক পুলের 4 টির মান একটি 5 এ পরিবর্তিত করে And এবং তারপরে আপনি ভাবছেন যে কেন SUBBAZআপনি কোডটিতে 4প্রকৃতপক্ষে লিখেছেন তার পরিবর্তে আপনি এটি 5 টি পাস করে ধরে নিচ্ছেন কেন ?

ফরট্রানের নতুন সংস্করণগুলি আপনাকে INTENTপরিবর্তনকের হিসাবে INবা হিসাবে ঘোষণা করে OUTএবং যদি আপনি OUTপরামিতি হিসাবে ধ্রুবকটি পাস করেন তবে আপনাকে একটি ত্রুটি (বা কমপক্ষে একটি সতর্কতা) দিয়ে এই সমস্যাটি প্রশমিত করে ।


5

ফরটারনে, যখন একটি ধ্রুবক অন্য পদ্ধতিতে পাস করা হয়, এটি আর সুরক্ষিত হয় না। এটাই তারা উল্লেখ করে। একই সময়ে অন্যান্য জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি ছিল সি এবং পাস্কাল যা এই সমস্যাটি নেই (এবং এখনও নেই)। সম্ভবত এখানে পুরানো প্রোগ্রামিং ভাষা রয়েছে যা সম্পর্কে আমি সচেতন নই যে একই সমস্যা রয়েছে।


এছাড়াও, এটি সত্যকে বোঝায় যে ধ্রুবক পুলটি কেবল পঠনযোগ্য বিভাগে ছিল না। যদি এটি হয়, এবং 4 রেফারেন্স দ্বারা পাস করা হয়, এবং কলি দ্বারা পরিবর্তিত হয়, এসইজিভি সফলভাবে 4 পরিবর্তন না করেই ঘটবে
বাসাইল স্টারিনকিভিচ

এটি কারণ প্রতিটি ওএসের কেবল পঠনযোগ্য বিভাগ নেই। দোষটি উদাহরণস্বরূপ, ডস-এ ব্যবহার করা যেতে পারে, ইউনিক্সের মতো কেবল পঠনযোগ্য খণ্ডগুলির (ভার্চুয়াল মেমরি ব্যবহার করে) অপারেটিং সিস্টেমগুলি রান সময়টিতে একটি সেগমেন্টেশন ত্রুটি ত্রুটি প্রদান করবে। যাইহোক, সংকলক এটি অনুমতি দেওয়া উচিত নয়।
ডিজে বাজি ওয়াজি

4
আমি পাস্কেলটি মিস করছি :(
গ্যারেথ

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

1
কেবলমাত্র সেই ধ্রুবকটি (রেফারেন্স দিয়ে পাস করা) পঠন-লেখার বিভাগে থেকে যায়। যদি এটি .rodataকেবল পঠনযোগ্য বিভাগে থাকে (বর্তমান সংকলকরা যেমন করে) পরিবর্তন করা এটি ধ্রুবককে পরিবর্তন করবে না তবে এসইজিভি তৈরি করবে।
বেসাইল স্টারিনকিভিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.