通过在未初始化的数据段(bss)中打印“垃圾值”,我们可以映射出先前程序中的所有值

我有一个奇怪的问题,我不确定我是否能够解释它,但我们开始吧。在学习 C 并使用它时,您通常会遇到术语“垃圾”或“垃圾”值,我的第一个问题是,该内存地址中的数据是来自某个不同程序或其他任何东西的数据,还是实际上是一些“随机'值,如果我认为那个内存地址中的剩余值是真的,为什么我们仍然能够从这样的内存地址读取,我的意思是假设我们只是声明了 int x; 现在它存储在某个内存地址的 bss 中,我们要输出它的值,我们将获得驻留在该地址上的值,所以如果我说的所有事情都是真的,

回答

不,该.bss部分的内容在您的程序启动之前被清零。这是为了满足 C 的保证,即全局static变量和变量,如果没有显式初始化,将被初始化为零。

实际上,在典型的多任务系统上,您的进程分配的所有内存在您获得访问权限之前都会被操作系统清零。这是为了避免您提到的安全漏洞。

auto如果未初始化,堆栈上的局部 ( ) 变量的值通常包含“垃圾”,但到目前为止,这将是您自己的程序执行过程中遗留下来的垃圾。如果您的程序碰巧没有向堆栈上的特定位置写入任何内容,那么它仍将包含零(再次在典型的操作系统上);它永远不会包含来自其他程序的内存内容。

由 分配的内存也是如此malloc。如果它直接来自操作系统,则它包含零。如果它碰巧是一个先前分配和释放的块,它可能包含您先前使用该内存或 malloc 的内部数据的垃圾,但它永远不会包含另一个程序的数据。


以上是通过在未初始化的数据段(bss)中打印“垃圾值”,我们可以映射出先前程序中的所有值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>