用随机数据填充内存

有没有办法用随机数据填充Linux机器上的免费RAM

我这样问的原因:我正在一个在Fortran中进行数值编程的小组工作。 有时候,人们会使用双精度实数工作,所以那些给出双精度结果的程序只能给出单精度的结果。

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

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

这个想法是否重要?如果不是,我该如何填充内存? 我可以pipe/ dev /随机进入内存,或者什么?

Solutions Collecting From Web of "用随机数据填充内存"

Linux为你提供了/proc/pid/maps/proc/pid/mem ,供你自己享用。 写在那里当然要格外小心。 另外,请记住,每个进程可用的唯一内存段是它自己的,因此您可能需要执行一些附加和代码修补以获得所需的位置。 祝你好运,反正。 🙂

编辑:它比代码审计还要复杂得多 – 这也更有可能揭示问题的实际来源。

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

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

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

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

(评论者:请注意,我故意滑了一些问题来简化说明。)

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

那么问题是如果你的Fortran程序使用glibc malloc(),我想这取决于Fortran编译器。

我会尝试使用诸如fUnit之类的东西来编写单元测试,以确保双精度值始终按照预期工作,编写一些需要双精度结果的测试,在经常出现单精度结果的情况下。

例如:编写一个测试,用各种输入调用一个应该产生双精度输出的函数,然后用assert()来测试它。

你想达到什么样的目的,虽然是高尚的意图,而且有趣的构思,但是我记得Wile E. Coyote计划抓住走人,而步枪和狙击行动将是最好的选择。

如果您遇到了问题,则表示您的代码中存在结构性问题,并且正在失去对程序的控制权。 虽然我完全知道软件是如何在学术界以及在Fortran中发展起来的,只是因为世界其他地方的人才会把自己扔下悬崖,这是有问题的。

你应该做的是对你的代码进行审计。 然后再打败一些研究生。

我认为随机数据会使调试更加困难。 内存中的随机值或计算错误导致的答案中的随机性? 我会固定已知的价值会更好。

在FORTRAN方面,你是说'混合精确'的数字是互换使用的吗? 我并不清楚实际的问题。

但是我不知道如何在Linux中填充任何东西的空闲内存。

你已经要求帮助它实现你的解决方案的问题,作为内存随机化。 不过,我觉得这是一个奇怪的,可能很难调试的解决方案。

在我看来,你会从更多的好处 – 静态代码分析工具 – 特定的单元测试 – 代码审查清单,专门针对这个问题

有时候,人们可以更简单地想到解决方案; 如果没有单精度数学,你可能会阻止链接这样的库,所以错误会显示链接错误; 在你的开发过程早期。 祝你好运。