Я пытаюсь заставить код студента работать с распределением и перетащить мою тестовую машину на остановку. Я пробовал
setrlimit(RLIMIT_DATA, r);
где r
- структура, удерживающая пределы. Но, к сожалению, хотя этот предел останавливает выделение brk
и sbrk
, библиотека C просто терпит неудачу до mmap
и сохраняет право на выделение.
Я также пробовал
setrlimit(RLIMIT_AS, r)
и это останавливает процесс на своих дорожках, но это средство слишком тяжелое: невозможно восстановить процесс из ошибки ENOMEM
, потому что нет места стека для вызовов, которые код создает при встрече с NULL
значение, возвращаемое из malloc()
.
У меня ограниченный контроль над двоичными файлами, поэтому, если это возможно сделать с системным вызовом, я бы предпочел это. Но мне нужно какое-то средство укупорки, не разрушая способность процесса к восстановлению. У кого-нибудь есть предложения?
ОБНОВЛЕНИЕ. Я нашел что-то под названием failmalloc, но он не очень сложный, и хотя я могу вызвать с ним сбой, Я всегда получаю segfault, который gdb не может диагностировать.
ДАЛЬНЕЙШЕЕ ОБНОВЛЕНИЕ. Я обнаружил, что setrlimit(RLIMIT_AS, r)
, похоже, выполняет задание, которое я хочу, по крайней мере, в некоторых случаях: segfaults, которые произошли после этого, были вызваны ошибкой в несвязанном модуле. Если кто-то не придумает что-то интересное (или повод оставить вопрос), я, вероятно, удалю вопрос.