2016-04-24 5 views
7

Итак, вопрос прост, есть ли способ сообщить GCC, что я хочу получить предупреждение, если я не освобожу кусок, выделенный блоком? Я знаю, что у нас могут быть несвободные блоки для некоторых целей/мы уже достигли конца программы или что-то в этом роде.Предупреждение GCC для незанятых блоков кучи

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

Если я могу получить предупреждение даже для этого, это было бы замечательно.

+4

GCC? конечно нет. Valgrind yes – Idos

+0

@Idos Я знаю, что Valgrind может проверить, но если бы был способ получить предупреждения раньше, чем аварии, это было бы действительно потрясающе. –

ответ

3

Это не возможная работа для GCC. Статический анализ не может доказать, что свободен забыт, это работа анализаторов времени работы, например valgrind's memcheck, или в конечном итоге gcc -fsanitize=leak, которые я не видел там yet, только с clang -fsanitize=leak.

Но вы не получите предупреждение о компиляции, даже когда gcc или clang поддерживают его. Это будет предупреждение во время выполнения.

+0

Но не время выполнения немного отличается с каждой ситуацией. Так это может быть не доказано, потому что для проверки всех состояний программы потребуется слишком много времени? –

+0

'-fsanitize = leak' - это только оптимизация, AFAIK вы можете просто скомпилировать с' -fsanitize = address', который отлично работает с gcc. –

+0

Yakup: Да, время выполнения только поймает утечки в testuite, а не на непокрытых. Marc: -fsanitize = адрес не поймает утечку, -fsanitize = память делает, но утечка и valgrind являются лучшими. – rurban

2

Компилятор не может прогнозировать и предупреждать о незапущенных блоках. Это работа во время выполнения, а не время компиляции. Вы можете реализовать свою собственную подсистему без проверки malloc или изменить библиотеку управления памятью.

+0

Я знаю, что компилятор не может проверить, выделена ли память из кучи, но я учил, что будет атрибут, используемый «функциями распределения кучи». это было бы возможно. –

+0

Я предполагаю, что есть диагностические реализации управления памятью. Должна быть дополнительная информация для каждого выделенного блока для адреса в программе, где она выделена (с помощью 'malloc'). Затем вы можете вызвать функцию '_mem_leak' при завершении программы, которая будет сканировать все незаблокированные блоки. – i486