我试图阻止学生代码在分配中乱跑并将我的测试机器拖到停止状态。我试过了
setrlimit(RLIMIT_DATA, r);
r
保持限制的结构在哪里。但不幸的是,尽管这个限制停止brk
并停止sbrk
分配,C 库只是故障转移到mmap
并继续分配。
我也试过
setrlimit(RLIMIT_AS, r)
这会使进程停止在其轨道上,但是这种补救措施太严重了——进程不可能从ENOMEM
错误中恢复,因为没有堆栈空间用于代码在遇到NULL
从返回的值时进行的调用malloc()
。
我对二进制文件的控制有限,所以如果可以使用系统调用,我会更喜欢。但我需要一些限制分配的方法,而不会破坏进程的恢复能力。有人有建议吗?
更新:我发现了一个叫做failmalloc的东西,但它不是很复杂,虽然我可以用它导致失败,但我总是得到一个 gdb 无法诊断的段错误。
进一步更新:我发现至少在某些情况下,setrlimit(RLIMIT_AS, r)
这似乎确实可以完成我想要的工作——之后发生的段错误是由不相关模块中的错误引起的。除非有人提出一些有趣的事情(或保留问题的理由),否则我可能会删除该问题。