আমার ডেবিয়ান জিএনইউ / লিনাক্স 9 সিস্টেমে, যখন বাইনারি কার্যকর হয়,
- স্ট্যাকটি অবিচ্ছিন্ন তবে
- গাদা শূন্য-আরম্ভ হয়।
কেন?
আমি ধরে নিয়েছি যে শূন্য-সূচনাটি সুরক্ষা প্রচার করে তবে, যদি গাদা হয়ে থাকে, তবে কেন স্ট্যাকের জন্য নয়? স্ট্যাকেরও কি সুরক্ষার দরকার নেই?
আমার প্রশ্নটি আমি যতটা জানি দেবিয়ানের সাথে সুনির্দিষ্ট নয়।
নমুনা সি কোড:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
const size_t n = 8;
// --------------------------------------------------------------------
// UNINTERESTING CODE
// --------------------------------------------------------------------
static void print_array(
const int *const p, const size_t size, const char *const name
)
{
printf("%s at %p: ", name, p);
for (size_t i = 0; i < size; ++i) printf("%d ", p[i]);
printf("\n");
}
// --------------------------------------------------------------------
// INTERESTING CODE
// --------------------------------------------------------------------
int main()
{
int a[n];
int *const b = malloc(n*sizeof(int));
print_array(a, n, "a");
print_array(b, n, "b");
free(b);
return 0;
}
আউটপুট:
a at 0x7ffe118997e0: 194 0 294230047 32766 294230046 32766 -550453275 32713
b at 0x561d4bbfe010: 0 0 0 0 0 0 0 0
সি স্ট্যান্ডার্ড malloc()
অবশ্যই বরাদ্দ করার আগে মেমরি পরিষ্কার করতে বলবে না , তবে আমার সি প্রোগ্রামটি কেবল উদাহরণের জন্য। প্রশ্নটি সি সম্পর্কে বা সি-র মানক গ্রন্থাগার সম্পর্কে কোনও প্রশ্ন নয়। বরং, কার্নেল এবং / অথবা রান-টাইম লোডার স্ট্যাকের পরিবর্তে কেন গাদাটি শূন্য করছে এমন প্রশ্ন একটি প্রশ্ন।
অন্য অভিজ্ঞতা
আমার প্রশ্ন মান নথিগুলির প্রয়োজনীয়তার চেয়ে পর্যবেক্ষণযোগ্য জিএনইউ / লিনাক্স আচরণকেই সম্মান করে। আমার অর্থটি সম্পর্কে যদি অনিশ্চিত থাকে তবে এই কোডটিটি ব্যবহার করে দেখুন, যা আরও অনির্ধারিত আচরণের ( অনির্ধারিত, অর্থাৎ সি স্ট্যান্ডার্ডের সাথে সম্পর্কিত) অনুরোধ করে:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
const size_t n = 4;
int main()
{
for (size_t i = n; i; --i) {
int *const p = malloc(sizeof(int));
printf("%p %d ", p, *p);
++*p;
printf("%d\n", *p);
free(p);
}
return 0;
}
আমার মেশিন থেকে আউটপুট:
0x555e86696010 0 1
0x555e86696010 0 1
0x555e86696010 0 1
0x555e86696010 0 1
যতদূর সি স্ট্যান্ডার্ড সম্পর্কিত, আচরণটি অপরিজ্ঞাত, সুতরাং আমার প্রশ্নটি সি স্ট্যান্ডার্ডকে বিবেচনা করে না। একটি কল malloc()
প্রতিটি বার একই ঠিকানা ফেরত দেওয়া প্রয়োজন না, যেহেতু এই কলটি malloc()
প্রকৃতপক্ষে প্রতিবার একই ঠিকানা ফিরে আসে, তাই এটি লক্ষ্য করা আকর্ষণীয় যে মেমরিটি, যে স্তূপে রয়েছে, প্রতিবার শূন্য হয়েছে।
বিপরীতে, স্ট্যাকটি শূন্য বলে মনে হয় নি।
আপনার মেশিনে পরবর্তী কোডটি কী করবে তা আমি জানি না, কারণ জিএনইউ / লিনাক্স সিস্টেমের কোন স্তরটি পর্যবেক্ষণ আচরণের কারণ ঘটছে তা আমি জানি না। আপনি কিন্তু এটি চেষ্টা করতে পারেন।
হালনাগাদ
@ কুসালানন্দ মন্তব্যগুলিতে লক্ষ্য করেছেন:
এটি মূল্যবান কিসের জন্য, আপনার অতি সাম্প্রতিক কোড ওপেনবিএসডি চালানোর সময় বিভিন্ন ঠিকানা এবং (মাঝে মাঝে) আনবিটিয়ালাইজড (শূন্য নয়) ডেটা দেয়। এটি লিনাক্সে আপনি যে আচরণের সাক্ষ্য দিচ্ছেন সে সম্পর্কে স্পষ্টতই কিছু বলা যায় না।
আমার ফলাফলটি ওপেনবিএসডি-র ফলাফলের চেয়ে পৃথক হওয়া সত্যই আকর্ষণীয়। স্পষ্টতই, আমার পরীক্ষাগুলি কার্নেল (বা লিঙ্কার) সুরক্ষা প্রোটোকলটি আবিষ্কার করছিল না, যেমনটি আমি ভেবেছিলাম, তবে একটি নিখরচায় বাস্তবায়িত শৈল্পিক।
এই আলোকে, আমি বিশ্বাস করি যে, একসাথে, @ ম্যাসভি, @ স্টেফেনকিট এবং @ অ্যান্ড্রেস গ্র্যাপেনটিনের নীচের উত্তরগুলি আমার প্রশ্ন নিষ্পত্তি করে।
স্ট্যাক ওভারফ্লোতেও দেখুন: ম্যালোক কেন গিসিতে 0 টি মানগুলিকে আরম্ভ করে? (ক্রেডিট: @ বিটিএ)
new
সি ++ এ অপারেটর (এছাড়াও "হিপ") লিনাক্সে ম্যালোক () এর জন্য কেবল একটি মোড়ক রয়েছে; কার্নেল "হিপ" কী তা জানে না বা যত্ন করে না।