table of contents
mcheck(3) | Library Functions Manual | mcheck(3) |
NUME¶
mcheck, mcheck_check_all, mcheck_pedantic, mprobe - verifică consistența grămezii
BIBLIOTECA¶
Biblioteca C standard (libc, -lc)
SINOPSIS¶
#include <mcheck.h>
int mcheck(void (*abortfunc)(enum mcheck_status mstatus)); int mcheck_pedantic(void (*abortfunc)(enum mcheck_status mstatus)); void mcheck_check_all(void);
enum mcheck_status mprobe(void *ptr);
DESCRIERE¶
Funcția mcheck() instalează un set de cârlige de depanare pentru familia de funcții de alocare a memoriei malloc(3). Aceste cârlige determină efectuarea anumitor verificări de consistență asupra stării grămezii. Verificările pot detecta erori ale aplicației, cum ar fi eliberarea unui bloc de memorie de mai multe ori sau coruperea structurilor de date de evidență care preced imediat un bloc de memorie alocat.
Pentru a fi eficientă, funcția mcheck() trebuie să fie apelată înainte de primul apel la malloc(3) sau la o funcție conexă. În cazurile în care acest lucru este dificil de asigurat, legarea programului cu -lmcheck inserează un apel implicit la mcheck() (cu un argument NULL) înainte de primul apel la o funcție de alocare a memoriei.
Funcția mcheck_pedantic() este similară cu mcheck(), dar efectuează verificări asupra tuturor blocurilor alocate ori de câte ori este apelată una dintre funcțiile de alocare a memoriei. Acest lucru poate fi foarte lent!
Funcția mcheck_check_check_all() determină o verificare imediată a tuturor blocurilor alocate. Acest apel este eficient numai dacă mcheck() este apelată mai înainte.
În cazul în care sistemul detectează o inconsistență în grămadă, funcția furnizată de apelant, indicată de abortfunc, este invocată cu un singur argument, mstatus, care indică ce tip de inconsistență a fost detectată. Dacă abortfunc este NULL, o funcție implicită afișează un mesaj de eroare la stderr și apelează abort(3).
Funcția mprobe() efectuează o verificare a consistenței blocului de memorie alocat indicat de ptr. Funcția mcheck() trebuie apelată în prealabil (în caz contrar, mprobe() returnează MCHCHECK_DISABLED).
Următoarea listă descrie valorile returnate de mprobe() sau transmise ca argument mstatus atunci când este invocată abortfunc:
- MCHECK_DISABLED (doar mprobe())
- mcheck() nu a fost apelată înainte de a fi apelată prima funcție de alocare a memoriei. Verificarea consistenței nu este posibilă.
- MCHECK_OK (doar mprobe())
- Nu s-a detectat nicio inconsecvență.
- MCHECK_HEAD
- Memoria anterioară unui bloc alocat a fost alterată.
- MCHECK_TAIL
- Memoria care a urmat unui bloc alocat a fost alterată.
- MCHECK_FREE
- Un bloc de memorie a fost eliberat de două ori.
VALOAREA RETURNATö
mcheck() și mcheck_pedantic() returnează 0 în caz de succes, sau -1 în caz de eroare.
ATRIBUTE¶
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare |
mcheck(), mcheck_pedantic(), mcheck_check_all(), mprobe() | Siguranța firelor | MT-Unsafe race:mcheck const:malloc_hooks |
STANDARDE¶
GNU.
ISTORIC¶
- mcheck_pedantic()
- mcheck_check_all()
- glibc 2.2.
- mcheck()
- mprobe()
- glibc 2.0.
NOTE¶
Legarea unui program cu -lmcheck și utilizarea variabilei de mediu MALLOC_CHECK_ (descrisă în mallopt(3)) determină detectarea acelorași tipuri de erori. Însă, utilizarea MALLOC_CHECK_ nu necesită relegarea aplicației.
EXEMPLE¶
Programul de mai jos apelează mcheck() cu un argument NULL și apoi eliberează același bloc de memorie de două ori. Următoarea sesiune shell demonstrează ce se întâmplă la rularea programului:
$ ./a.out Pe cale să se elibereze Pe cale să se elibereze a doua oară bloc eliberat de două ori Operație abandonată (memorie descărcată)
Sursa programului¶
#include <mcheck.h> #include <stdio.h> #include <stdlib.h> int main(void) {
char *p;
if (mcheck(NULL) != 0) {
fprintf(stderr, "mcheck() a eșuat\n");
exit(EXIT_FAILURE);
}
p = malloc(1000);
fprintf(stderr, "Pe cale să se elibereze\n");
free(p);
fprintf(stderr, "\nPe cale să se elibereze a doua oară\n");
free(p);
exit(EXIT_SUCCESS); }
CONSULTAȚI ȘI¶
TRADUCERE¶
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
2 mai 2024 | Pagini de manual Linux (nepublicate) |