Существует ли какой-либо автоматический метод или инструмент для анализа кода C, чтобы определить, логически ли все вызовы функций инициализатора связаны с соответствующим вызовом функции finalizer в области блока ?Убедитесь, что инициализаторы и финализаторы гарантированно логически спарены в области объема
С помощью инициализатора и финализатора я имею в виду пару, такую как fopen()
и fclose()
.
Значительное редактирование к изначальному вопросу состоялось: Фраза «код путь» был удален и фразы «логически парные» и «в блоке сферы» были добавлены в попытке прояснить первоначальное намерение , См. Подробное обсуждение ответа Юджина Ш. Под «логически сопряженным» я противопоставляю текстовое сопряжение, например. неважно, есть ли в тексте исходного кода одинаковые номера вызовов инициализатора и финализатора. Вместо этого, когда выходит область блока (если когда-либо), любые вызовы функций инициализатора гарантированно имеют соответствующий вызов функции финализатора.
Примеры
Ok:
initialize();
mystery_function_that_may_never_return();
finalize();
Ok:
initialize();
if (cond)
finalize();
else
finalize();
Не хорошо:
initialize();
initialize();
finalize();
Не хорошо:
initialize();
finalize();
finalize();
Не хорошо:
initialize();
if (cond)
finalize();
else
return;
Это также может иметь смысл перенести финализации ответственность/передачи «права собственности» на то, что ресурс управляется так как в этом случае проверка будет то, что все инициализации приводят к завершению или передаче прав собственности.
Для этого потребуется решить проблему с остановкой (https://en.wikipedia.org/wiki/Halting_problem). – Schwern
Они могут быть не в строгих парах. Там может быть один 'fopen' и два альтернативных' fclose' того же файла, в зависимости от условий выполнения или наоборот. Значит ли это ваш гипотетический инструмент? Хотя они нужны парами, нет строгого синтаксического спаривания, как это требуется (скобки) и {скобки}, "кавычки" или/* комментарии * /. –
Например, 'void read_filehandle (FILE * fh) {... if (done || feof (fh)) {fclose (fh)}}' Как вы это учитываете? Это длинный извращенный способ сказать «возможно, нет». – Schwern