用随机数据填充内存

Mic*_*erz 5 linux memory ram fortran

有没有办法用随机数据填充linux机器上的空闲RAM?

我问这个的原因是:我在一个我们在Fortran中进行数值编程的小组工作.有时候,人们搞砸双精度实数,因此应该给出双精度结果的程序只能提供单精度.

如果我的理解是正确的,那么在这样的程序中,在单精度限制之后会看到结果的随机波动.也就是说,如果您使用相同的输入多次运行相同的程序,则每次都会得到随机不同的结果.你看到的(随机部分)取决于机器的空闲RAM中的随机值.但实际上,如果在同一台机器上重复运行程序,则会重复使用相同的内存部分,其中包含相同的随机数据,每次都会导致相同的输出.

我的想法是,如果你可以用随机数据覆盖内存,你实际上会看到程序输出中的随机波动.这样可以更容易地找到这些错误.

这个想法是否重击,或者如果没有,我如何填补记忆?我可以管道/开发/随机进入RAM,或者什么?

uek*_*rom 5

如果您有一个最近的(似乎是 >=2.4)glibc,您可以使用设置环境变量 MALLOC_PERTURB_ 来使 malloc() 返回设置为某个值的内存。见http://udrepper.livejournal.com/11429.html和里面的http://people.redhat.com/drepper/defprogramming.pdf

那么问题是您的 Fortran 程序是否使用 glibc malloc(),我猜这取决于 Fortran 编译器。


Ste*_*n C 5

你的理解是不正确的.在开始执行之前,您无法使用随机数据填充程序的内存,即使可以,也无法解决您的问题.

如果您的Fortran程序声明了一个单精度浮点变量,编译器将在内存中分配一个32位单元来保存该值.每次程序从变量读取时,处理器将从单元格中获取32位值.每次分配给变量时,处理器都会向单元格写入32位值.在任何情况下,随机位都不应该在细胞之前或之后"渗入"细胞的值.

虽然浮点运算不精确,但它也不是随机的.如果你计算1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0)一千次,你会得到0.99999...每一次.

第二点是,当在Linux上执行程序时,操作系统会将所有数据存储器小心地预先初始化为零.这样做是为了避免每次运行程序时程序的行为都不同:这将是一件糟糕的事情.编辑:这样做的另一个原因是防止私人信息从一个进程泄漏到另一个进程.

(评论者:请注意,我故意在一些问题上滑过,以使解释变得简单.)


Mic*_*kis 2

Linux 为您提供了 和/proc/pid/maps/proc/pid/mem以满足您的喜好。当然,在那里书写时必须格外小心。另外,请记住,每个进程唯一可用的内存段是它自己的,因此您可能需要进行一些附加和代码修补才能到达您想要的位置。无论如何,祝你好运。:)

编辑:它仍然比代码审计复杂很多倍 - 代码审计也有更大的机会揭示问题的实际根源。