我试图限制学生的代码不要进行过多的内存分配,以免拖慢我的测试机。我已经尝试过:
setrlimit(RLIMIT_DATA, r);
这里的r
是一个保存限制的结构体。但遗憾的是,尽管这个限制可以阻止brk
和sbrk
进行分配,但C库会切换到使用mmap
并继续分配内存。
我还尝试过其他方法。
setrlimit(RLIMIT_AS, r)
这将导致进程停止,然而这种解决方法过于严厉—由于没有栈空间来处理从malloc()
返回的NULL
值时代码调用的函数,因此进程无法从ENOMEM
错误中恢复。
我对二进制文件的控制有限,所以如果可以使用系统调用,我更喜欢这种方式。但我需要一些限制内存分配的方法,而不会破坏进程的恢复能力。有人有建议吗?
更新:我找到了一个叫做failmalloc的东西,但它并不是很复杂,尽管我可以用它引发故障,但我总是得到一个gdb无法诊断的段错误。
进一步更新:我发现setrlimit(RLIMIT_AS, r)
似乎可以做到我想要的工作,至少在某些情况下—之后出现的段错误是由与问题无关的模块中的错误引起的。除非有人提供一些有趣的东西(或者有理由保留问题),否则我可能会删除这个问题。
malloc
中恢复。只需让操作系统终止它们并结束掉。一个正确的程序本来就不应该超过限制的。 - R.. GitHub STOP HELPING ICE