появляются отдельные точки выполнения, условно соответствующие
конечным точкам подграфа вложенного вызова функции. В связи с
этим при построении отчета о найденном дефекте нельзя традицион-
ным способом указать путь, который прошло выполнение программы
при вызове функции. Для построения отчета при межпроцедурном
анализе методом резюме в настоящей работе предложен следующий
метод.
Задача проверяющих модулей — отложенная проверка: на основе
резюме вызываемой функции и состояния на момент вызова проверя-
ющий модуль должен сделать вывод о необходимости выдачи преду-
преждения (о срабатывании). Существует два варианта срабатывания
проверки. В первом варианте выдача предупреждения происходит вну-
три вызываемой функции. Допустим, что уровень вложенности вызова
равен единице. Такое допущение возможно, поскольку к нему можно
свести стек вызовов произвольного уровня вложенности. В этом слу-
чае конечной точкой трассы является узел графа выполнения вызыва-
емой функции. Если этот узел известен, то от него можно построить
трассу до корневого узла графа выполнения. Такая трасса-подграф бу-
дет путем, проходимым внутри функции при выполнении программы
до критической точки.
Второй вариант предполагает построение пути при необходимо-
сти показать путь внутри вызванной функции целиком, от точки входа
до точки выхода. Эта задача сводится к первой при условии, что в
качестве конечной точки выбирается лист графа выполнения, соответ-
ствующий выбранной ветви выполнения резюме. Таким образом, для
корректного построения пути при моделировании вложенного вызо-
ва функции достаточно иметь информацию об узле графа выполне-
ния вызываемой функции, для которого выдается срабатывание, или о
листе графа выполнения, к которому относится выбранный путь вы-
полнения при применении резюме. Для этого достаточно сохранить
ссылку на этот узел. В случае построения пути изнутри вызываемой
функции за хранение ссылки может отвечать проверяющий модуль, ге-
нерирующий срабатывание. При построении полного пути по вложен-
ному вызову ссылку на лист графа выполнения вызываемой функции
можно хранить в узле применения резюме в качестве дополнительной
информации.
Поясним описанный метод примером. Рассмотрим функцию сле-
дующего вида:
1 void close_file(bool flag, FILE *f) {
2 . . .
3 if (flag)
4
fclose(f);
5 }
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2015. № 5 89