2016-04-24 14 views
7

Quindi la domanda è semplice c'è un modo per dire al GCC che voglio essere avvisato se non libero un blocco assegnato all'heap? So che possiamo avere blocchi non liberati per alcuni scopi/abbiamo già raggiunto la fine del programma o qualcosa del genere.GCC warn per blocchi heap non liberati

int main(){ 
    int *a = malloc(sizeof(int)); 
    return 0; 
} 

Se riesco a ottenere un avviso anche per questo sarebbe fantastico.

+4

GCC? ovviamente no. Valgrind yes – Idos

+0

@Idos So che Valgrind può controllare, ma se ci fosse un modo per ottenere gli avvertimenti prima di crash sarebbe davvero fantastico. –

risposta

3

Questo non è un lavoro possibile per GCC. L'analisi statica non può dimostrare che un free è stato dimenticato, questo è il lavoro degli analizzatori di run-time come valgrind's memcheck, o eventualmente gcc -fsanitize=leak, che non ho visto lì yet, solo con clang -fsanitize=leak.

Ma non si ottiene un avviso in fase di compilazione, anche quando gcc o clang lo supporta. Sarà un avviso di runtime.

+0

Ma il runtime non è un po 'diverso in ogni situazione. Quindi non può essere provato perché richiederebbe troppo tempo per controllare tutti gli stati del programma? –

+0

'-fsanitize = leak' è solo un'ottimizzazione, AFAIK si può semplicemente compilare con' -fsanitize = address' che funziona bene con gcc. –

+0

Yakup: Sì, il tempo di esecuzione catturerà solo le perdite nella suite di test, non quelle scoperte. Marc: -fsanitize = l'indirizzo non cattura realmente una perdita, -fsanitize = la memoria lo fa, ma leak e valgrind sono i migliori. – rurban

2

Il compilatore non può prevedere e avvertire per i blocchi non liberati. Questo è un lavoro di runtime, non un tempo di compilazione. È possibile implementare il proprio sottosistema di controllo senza malloc o modificare la libreria di gestione della memoria.

+0

So che un compilatore non può controllare se la memoria è allocata dall'heap ma ho insegnato che ci sarebbe un attributo usato da "heap allocating functions". sarebbe possibile –

+0

Suppongo che ci siano implementazioni diagnostiche della gestione della memoria. Ci devono essere informazioni extra per ogni blocco assegnato per l'indirizzo nel programma in cui è allocato (con 'malloc'). Quindi puoi chiamare la funzione '_mem_leak' al termine del programma che eseguirà la scansione di tutti i blocchi non liberati. – i486

Problemi correlati