Помилка перевищення ліміту пам'яті

Помилка діагностується, якщо в процесі роботи тестирующая програма спожила більше пам'яті, ніж зазначено в обмеженнях задачі. Обгрунтованість діагностування цієї помилки викликає дискусії (див. Далі).

Діагностування помилки перевищення обмеження по пам'яті в системі ejudge працює, толко якщо встановлений патч до ядра Linux. Якщо патч не встановлено, перевищення обмеження по пам'яті буде діагностовано як помилка часу виконання. Крім того, система ejudge дозволяє відключити діагностування даної помилки навіть якщо патч до ядра встановлений.

Хоча діагностування цієї помилки може бути корисно для учасників для налагодження їх рішень, в большистве ситуацій межа між помилкою при виконанні програми і помилкою перевищення обмеження по пам'яті виявляється дуже розмитою.

Наприклад, якщо перевищено максимальний розмір стека через те, що програма увійшла в нескінченну рекурсію, то така ситуація повинна швидше розглядатися як помилка при виконанні програми. Але з іншого боку, якщо програма спробувала виділити занадто багато пам'яті в стеку (наприклад, через занадто великого локального масиву), така ситуація повинна розглядатися як перевищення обмеження по пам'яті. Природно, неможливо простим способом чітко розрізнити ці дві ситуації.

З іншого боку, наприклад, в мові C функція malloc повертає NULL, якщо пам'ять виділити не вдалося. Якщо тестована програма не перевіряє результат функції malloc на NULL і отримує помилку доступу по нульовому вказівником, то це типова помилка програміста і повинна розглядатися як помилка при виконанні програми. І навпаки, програма може відловлювати ситуації, коли malloc повертає NULL, і модифікувати свою поведінку (наприклад, почистивши хеш-таблицю).

Схожі статті