为什么将变量设置为自己的地址会在不同的程序运行中产生不同的结果?

tem*_*def 6 c pointers memory-address conways-game-of-life

昨天我可以通过这个混淆的C代码实现Conway的生命游戏.作为伪随机生成器,它将代码写入此效果:

int pseudoRand = (int) &pseudoRand;
Run Code Online (Sandbox Code Playgroud)

根据作者对该计划的评论:

这是一个很大的数字,每次运行应该是不同的,所以它作为种子很好地工作.

我相信这里的行为是实现定义的还是未定义的.但是,我不确定为什么这个值会随着运行而变化.我对大多数操作系统工作的理解是,由于虚拟内存,每次运行程序时堆栈都被初始化为相同的虚拟地址,因此每次地址应该相同.

在大多数操作系统上,此代码是否会在不同的运行中产生不同的结果 它是依赖于操作系统的吗?如果是这样,为什么操作系统会在每次运行时将相同的程序映射到不同的虚拟地址?

谢谢!

R..*_*R.. 3

虽然为具有自动存储的对象分配地址是未指定的(并且地址到整数的转换是实现定义的),但您在您的情况下所做的只是窃取内核分配给初始堆栈地址的熵,如下所示地址空间布局随机化(ASLR)的一部分。使用它作为熵源是一个坏主意,它可能会从程序中泄漏,特别是在通过网络与不受信任的、可能是恶意的远程主机进行交互的应用程序中,因为您实际上泄露了内核提供给您的随机地址基数攻击者可能想知道它,从而破坏 ASLR 的目的。(即使你只是用它作为种子,只要攻击者知道PRNG算法,他们就可以逆向获得种子。)