Jump to content

Анализ формы (программный анализ)

В анализе программ анализ формы — это метод статического анализа кода , который обнаруживает и проверяет свойства связанных , динамически выделяемых структур данных в (обычно императивных ) компьютерных программах. Обычно он используется во время компиляции для поиска ошибок в программном обеспечении или для проверки свойств корректности программ на высоком уровне. В программах Java его можно использовать для обеспечения правильной сортировки списка методом сортировки. В программах на языке C он может искать места, где блок памяти не освобожден должным образом.

Приложения

[ редактировать ]

Анализ формы применялся для решения множества задач:

Анализ формы — это разновидность анализа указателей , хотя он более точен, чем обычный анализ указателей. Анализ указателя пытается определить набор объектов, на которые может указывать указатель (называемый набором точек указателя). К сожалению, этот анализ обязательно является приблизительным (поскольку совершенно точный статический анализ может решить проблему остановки ). Анализ формы может определить меньшие (более точные) наборы точек.

Рассмотрим следующую простую программу на C++.

Item *items[10];
for (int i = 0; i < 10; ++i) {
    items[i] = new Item(...); // line [1]
}
process_items(items); // line [2]
for (int i = 0; i < 10; ++i) {
    delete items[i]; // line [3]
}

Эта программа формирует массив объектов, обрабатывает их каким-то произвольным образом, а затем удаляет. Предполагая, что process_items функция не содержит ошибок, видно, что программа безопасна: она никогда не обращается к освобожденной памяти и удаляет все построенные ею объекты.

К сожалению, при большинстве анализов указателей возникают трудности с точным анализом этой программы. Чтобы определить наборы точек на, анализ указателей должен иметь возможность присваивать имена объектам программы. В общем, программы могут размещать неограниченное количество объектов; но для завершения анализа указателя можно использовать только конечный набор имен. Типичным приближением является присвоение всем объектам, расположенным в данной строке программы, одного и того же имени. В приведенном выше примере все объекты, созданные в строке [1], будут иметь одно и то же имя. Поэтому, когда delete оператор анализируется впервые, анализ определяет, что один из объектов с именем [1] удаляется. При втором анализе оператора (поскольку он находится в цикле) анализ предупреждает о возможной ошибке: поскольку он не может различить объекты в массиве, возможно, что второй delete удаляет тот же объект, что и первый delete. Это предупреждение является ложным, и цель анализа формы — избежать таких предупреждений.

Подведение итогов и материализация

[ редактировать ]

Анализ формы решает проблемы анализа указателей за счет использования более гибкой системы именования объектов. Вместо того, чтобы давать объекту одно и то же имя во всей программе, объекты могут менять имена в зависимости от действий программы. Иногда несколько отдельных объектов с разными именами могут быть суммированы или объединены так, чтобы у них было одно и то же имя. Затем, когда суммированный объект будет использоваться программой, его можно материализовать , т. е. суммированный объект разбивается на два объекта с разными именами: один представляет один объект, а другой представляет остальные суммированные объекты. Основная эвристика анализа формы заключается в том, что объекты, используемые программой, представляются с помощью уникальных материализованных объектов, а неиспользуемые объекты суммируются.

Массив объектов в приведенном выше примере суммируется по отдельности в строках [1], [2] и [3]. В строке [1] массив построен лишь частично. Элементы массива 0..i-1 содержат построенные объекты. Элемент массива i скоро будет создан, а следующие элементы не инициализированы. Анализ формы может аппроксимировать эту ситуацию, используя сводку для первого набора элементов, материализованную ячейку памяти для элемента i и сводку для остальных неинициализированных ячеек следующим образом:

0 .. я-1 я я+1 .. 9
указатель на созданный объект (сводка) неинициализированный неинициализированный (сводка)

После завершения цикла в строке [2] нет необходимости сохранять что-либо материализованным. На этом этапе анализ формы определяет, что все элементы массива инициализированы:

0 .. 9
указатель на созданный объект (сводка)

Однако в строке [3] элемент массива i снова используется. Поэтому анализ разбивает массив на три сегмента, как в строке [1]. Однако на этот раз первый сегмент перед i был удален, а оставшиеся элементы все еще действительны (при условии, что delete оператор еще не выполнен).

0 .. я-1 я я+1 .. 9
бесплатно (сводка) указатель на созданный объект указатель на созданный объект (сводка)

Обратите внимание, что в этом случае анализ распознает, что указатель по индексу i еще не удален. Поэтому он не предупреждает о двойном удалении.

См. также

[ редактировать ]
  1. ^ Ринецкий, Ноам; Сагив, Мули (2001). «Межпроцедурный анализ формы для рекурсивных программ» (PDF) . Конструкция компилятора . Конспекты лекций по информатике. Том. 2027. С. 133–149 . дои : 10.1007/3-540-45306-7_10 . ISBN  978-3-540-41861-0 .
  2. ^ Jump up to: а б Бердин, Джош; Кальканьо, Криштиану; Кук, Байрон; Дистефано, Дино; о'Хирн, Питер В.; Вис, Томас; Ян, Хонсок (2007). «Анализ формы составных структур данных» (PDF) . Компьютерная проверка . Конспекты лекций по информатике. Том. 4590. стр. 178–192. дои : 10.1007/978-3-540-73368-3_22 . ISBN  978-3-540-73367-6 .

Библиография

[ редактировать ]
  • Вильгельм, Рейнхард; Сагив, Мули; Репс, Томас (2007). «Глава 12: Анализ формы и приложения». В Шриканте, Ю.Н.; Шанкар, Прити (ред.). Справочник по проектированию компиляторов: оптимизации и генерация машинного кода, второе издание . ЦРК Пресс. стр. 12–1–12–44. ISBN  978-1-4200-4382-2 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7dd735acd8431a53ca8c175f3ac7f3b6__1691526480
URL1:https://arc.ask3.ru/arc/aa/7d/b6/7dd735acd8431a53ca8c175f3ac7f3b6.html
Заголовок, (Title) документа по адресу, URL1:
Shape analysis (program analysis) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)