Sto provando a mantenere il codice studente in esecuzione con allocazioni e il trascinamento della mia macchina di prova. Ho provatoCome posso limitare la memoria acquisita con `malloc()` senza limitare anche lo stack?
setrlimit(RLIMIT_DATA, r);
dove r
è una struct tenendo i limiti. Ma sfortunatamente, sebbene questo limite si fermi a brk
e sbrk
dall'allocazione, la libreria C fallisce a mmap
e continua a essere assegnata.
Ho anche provato
setrlimit(RLIMIT_AS, r)
e questo arresta il processo nei suoi brani, ma questo rimedio è troppo grave — è impossibile per il processo per recuperare l'errore ENOMEM
perché non c'è spazio dello stack per le chiamate effettuate dal codice quando si incontra un valore NULL
restituito da malloc()
.
Ho controlli limitati sui binari, quindi se è possibile fare con una chiamata di sistema, preferirei che. Ma ho bisogno di alcuni mezzi per limitare l'allocazione senza distruggere la capacità del processo di recuperare. Qualcuno ha suggerimenti?
UPDATE: ho trovato qualcosa chiamato failmalloc, ma non è molto sofisticato, e anche se posso causare un errore con esso, ho sempre arrivare un segfault che gdb non può diagnosticare.
ULTERIORI UPDATE: ho scoperto che setrlimit(RLIMIT_AS, r)
fa sembrano fare il lavoro che voglio, almeno in alcuni casi, le — segfault che si stavano verificando in seguito sono stati causati da un guasto in un modulo non correlato. A meno che qualcuno non presenti qualcosa di interessante (o una ragione per mantenere la domanda), probabilmente eliminerò la domanda.
Se si sta solo tentando di impedire che programmi abusivi/inceppati eliminino il sistema, non preoccuparsi di consentire il ripristino da malloc 'non riuscito. Lascia che il sistema operativo li uccida e sii fatto. Un programma corretto presumibilmente non dovrebbe mai raggiungere il limite in ogni caso. –
Molti studenti inviano programmi errati. Se eseguono il dump core, ottengono zero. Se recuperano e abortiscono, ottengono il credito parziale. –