Если часть памяти динамически выделяется в функции, либо она должна быть освобождена в функции, либо указатель на часть памяти должен выйти из функции. Поэтому я думаю, что должна быть возможность отслеживать указатели на выделенные фрагменты памяти в функции во время анализа stati c и, если указатель не выходит из функции и его память не освобождается, анализатор должен выдать ошибка.
В C неизвестно, какие функции выводят указатели на выделенную память. Таким образом, для того, чтобы этот анализ работал, он должен анализировать также все функции, вызываемые в функции.
Иногда не так просто отследить указатель, например, если указатель на часть выделенной памяти был помещен в массив и массив были перетасованы таким образом, что это трудно вычислить. Тогда анализатор может выдать предупреждение, если он не может отследить указатель. Но анализ был бы полезен для проверки, есть ли у функции место, где она заканчивается без очистки (закрытие файлов и освобождение временных массивов).
Анализ был бы проще, если бы объявления функций включали информацию о том, как Функция может выводить указатель на часть выделенной памяти, подобно тому, как декалирации метода Java включают информацию о том, какие исключения они выдают. Это не в C, но есть ли язык, в котором есть объявления функций, которые включают информацию о том, как функция может выводить указатели на фрагменты выделенной памяти? Объявления функций могут выглядеть так:
void* malloc(size_t size) allocates return;
// this function creates an array of unknown size and writes it to *dest,
// returns the size of the array
size_t createArray(int** dest) allocates *dest;