Проверка корректности освобождения ресурсов, локальных для функции на языке C - page 6

А.В. Медников, В.А. Крищенко
6
int CountSymbol (char *path, char symbol)
{
int count = 0;
FILE *f = fopen(path, "r");
if (f) {
char ch;
do {
if ((ch = fgetc(f)) == symbol)
count++;
} while (ch != EOF);
fclose(f);
}
return count;
}
Алгоритм обнаружения утечки локального ресурса.
Алгоритм
оперирует представлением ГПУ в виде списков смежности, которое
получено разбором текстового промежуточного представления кода,
включающего информацию о ГПУ. Для этого разбора достаточно ис-
пользовать регулярные выражения.
Наиболее существенным ограничением разрабатываемого алго-
ритма является борьба с зацикливанием простейшим способом, когда
анализируются только те базовые блоки, анализ которых еще не был
проведен. В этом случае итерации цикла, отличные от первой, не бу-
дут проанализированы.
Для определения потока управления, соответствующего теку-
щему состоянию ресурса, необходимо выполнить обход графа с
учетом значений обрабатываемых локальных переменных. В каче-
стве стартового следует выбрать блок, содержащий инструкцию
выделения ресурса. До выполнения данной инструкции состояния
локальных переменных не могут зависеть от идентификатора, по-
этому не влияют на последовательность выполнения команд ис-
пользования ресурса.
При выделении ресурса возможен один из двух исходов, поэтому
для каждого выделения анализ должен быть выполнен дважды — для
корректного и некорректного выделения ресурса соответственно. В
пределах одной функции может быть несколько инструкций выделе-
ния ресурса, поэтому анализ его использования должен быть произ-
веден для каждого выделения.
Входными данными алгоритма анализа выделения ресурса явля-
ются: объект ГПУ, идентификатор базового блока, в котором ресурс
был выделен, и индекс инструкции выделения ресурса в списке ин-
струкций базового блока. В результате работы алгоритма должен
быть совершен обход всех путей исполнения программы, при кото-
рых выполняется выделение ресурса. На рис. 4 представлена схема
алгоритма.
1,2,3,4,5 7,8,9,10,11,12
Powered by FlippingBook