2016-04-24 24 views
7

Pytanie jest więc proste: czy istnieje sposób, aby powiedzieć GCC, że chcę otrzymywać ostrzeżenie, jeśli nie zwolnię bloku przydzielonego sterty? Wiem, że możemy mieć niewolne bloki do pewnych celów/już osiągnęliśmy koniec programu lub coś podobnego.GCC ostrzega o niezablokowanych blokach sterty

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

Jeśli mogę uzyskać ostrzeżenie, nawet w tym przypadku byłoby niesamowite.

+4

GCC? Oczywiście nie. Valgrind tak – Idos

+0

@Idos Wiem, że Valgrind może to sprawdzić, ale jeśli byłby sposób, aby uzyskać ostrzeżenia przed awarią, byłoby naprawdę niesamowicie. –

Odpowiedz

3

Dla GCC nie jest to możliwe. Analiza statyczna nie może udowodnić, że wolny jest zapomniany, to zadanie analizatorów wykonawczych, takich jak valgrind's memcheck, lub ostatecznie gcc -fsanitize=leak, którego nie widziałem tam yet, tylko z clang -fsanitize=leak.

Ale nie otrzymasz ostrzeżenia podczas kompilacji, nawet jeśli obsługuje go gcc lub clang. Będzie to ostrzeżenie o uruchomieniu.

+0

Ale nie jest runtime nieco inaczej z każdą sytuacją. Czyż nie można tego udowodnić, ponieważ wymagałoby to zbyt wiele czasu, aby sprawdzić wszystkie stany programu? –

+0

'-fsanitize = leak' jest tylko optymalizacją, AFAIK można po prostu skompilować z' -fsanitize = address', który działa dobrze z gcc. –

+0

Yakup: Tak, czas działania tylko złapie przecieki w testsuite, nie te odkryte. Marc: -fsanitize = adres naprawdę nie złapie przecieku, -fsanitize = pamięć robi, ale przeciek i valgrind są najlepsze. – rurban

2

Kompilator nie może przewidzieć i ostrzegać o niezwiązanych blokach. Jest to zadanie uruchomieniowe, a nie czas kompilacji. Możesz zaimplementować własny podsystem sprawdzania wolnych obiektów malloc lub zmodyfikować bibliotekę zarządzania pamięcią.

+0

Wiem, że kompilator nie może sprawdzić, czy pamięć jest przydzielona z sterty, ale nauczyłem, że istnieje atrybut, który jest używany przez "funkcje przydzielania sterty". to byłoby możliwe. –

+0

Przypuszczam, że istnieją diagnostyczne implementacje zarządzania pamięcią. Każda przydzielona blok musi zawierać dodatkowe informacje o adresie w programie, w którym jest przydzielona (z "malloc"). Następnie możesz wywołać funkcję '_mem_leak' przy zakończeniu programu, która wyszuka wszystkie niezablokowane bloki. – i486

Powiązane problemy