Есть ли способ статически анализировать выделение памяти в C? - PullRequest
2 голосов
/ 30 апреля 2020

Если часть памяти динамически выделяется в функции, либо она должна быть освобождена в функции, либо указатель на часть памяти должен выйти из функции. Поэтому я думаю, что должна быть возможность отслеживать указатели на выделенные фрагменты памяти в функции во время анализа 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;
...