आज मैं निम्नलिखित स्थिति में आया हूं। मैं कई बार निम्न कार्यक्रम चलाने:कार्यक्रम के प्रत्येक भाग में argc का पता अलग क्यों है?
#include <stdio.h>
int main(int argc, char **argv) {
printf("%p\n", &argc);
}
लिनक्स और जीसीसी संकलक के साथ एक इंटेल i7 पर, इस कार्यक्रम के प्रत्येक रन पर विभिन्न उत्पादन देता है:
i7:~/tmp$ gcc t.c
i7:~/tmp$ ./a.out
0x7fffc127636c
i7:~/tmp$ ./a.out
0x7fffdefed97c
i7:~/tmp$ ./a.out
0x7fff7f32454c
मैं उम्मीद होती है कि लिनक्स, योगिनी के डेवलपर्स , जीसीसी या जो कुछ भी संबंधित है, यह सुनिश्चित करने का प्रयास करेगा कि एक कार्यक्रम के प्रत्येक आमंत्रण पर स्टैक को उसी पते पर रखा गया हो। यह अजीब बग का पता लगाने और फिक्सिंग की सुविधा प्रदान करेगा जो चर के पॉइंटर्स और पतों से निपटने के दौरान हो सकता है (जैसे भौतिक पते की तुलना में बग फिक्स करने के लिए आभासी पते बेहतर होते हैं)।
मुझे आश्चर्य है कि कार्यक्रम के प्रत्येक आमंत्रण पर स्टैक को अलग-अलग पते पर क्यों मैप किया गया है?
https://en.wikipedia.org/wiki/Address_space_layout_randomization? – dbrank0
ओटी: इसे 'printf ("% p \ n", (शून्य *) &argc); ', बीटीडब्लू होना चाहिए। रूपांतरण विनिर्देशक' पी 'केवल' शून्य 'पॉइंटर्स के लिए परिभाषित किया गया है। – alk
संबंधित: http: // stackoverflow .com/प्रश्न/11238457/अक्षम और पुन: सक्षम-पता-अंतरिक्ष-लेआउट-यादृच्छिकीकरण-केवल के लिए अपने आप को – alk