Tag: setrlimit

如何限制使用`malloc()`获取的内存而不限制堆栈?

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