Jump to content

Анализ указателя

В информатике указатели анализ указателей или анализ точек на — это метод статического анализа кода , который устанавливает, какие или ссылки на кучу могут указывать на какие переменные или места хранения . Часто он является компонентом более сложных анализов, таких как анализ бегства . Близко к этому методу относится анализ формы .

Это наиболее распространенное разговорное употребление этого термина. Во вторичном использовании анализ указателей является собирательным названием как для анализа точек , определенного выше, так и для анализа псевдонимов . Анализ точек и псевдонимов — тесно связанные, но не всегда эквивалентные задачи.

Пример [ править ]

В следующем примере программы анализ точек на вычислит, что набор точек на p является { x, y}.

int x;
int y;
int* p = unknown() ? &x : &y;

Введение [ править ]

Можно показать, что как форма статического анализа полностью точный анализ указателей неразрешим . [1] Большинство подходов надежны , но их производительность и точность сильно различаются. Многие проектные решения влияют как на точность, так и на производительность анализа; часто (но не всегда) более низкая точность приводит к более высокой производительности. Эти варианты включают в себя: [2] [3]

  • Чувствительность поля (также известная как чувствительность структуры ): анализ может либо обрабатывать каждое поле структуры или объекта отдельно , либо объединять их.
  • Чувствительность массива . Анализ указателей, чувствительный к массиву, моделирует каждый индекс в массиве отдельно. Другие варианты включают моделирование только первой записи отдельно, а остальных вместе или объединение всех записей массива.
  • Контекстная чувствительность или поливариантность . Анализ указателей может квалифицировать информацию, указывающую на, с помощью сводки потока управления, ведущего к каждой точке программы.
  • Чувствительность потока : анализ может моделировать влияние внутрипроцедурного потока управления на факты, указывающие на него.
  • Моделирование кучи . Распределение во время выполнения может быть абстрагировано с помощью:
    • их сайты распределения (оператор или инструкция, выполняющая распределение, например, вызов malloc или конструктор объекта),
    • более сложная модель, основанная на анализе формы ,
    • тип распределения или
    • одно единственное распределение (это называется нечувствительностью к куче ).
  • Клонирование кучи . Анализ кучи и контекстно-зависимый анализ могут дополнительно квалифицировать каждый сайт распределения путем сводки потока управления, ведущего к инструкции или оператору, выполняющему распределение.
  • Ограничения подмножества или ограничения равенства : при распространении фактов, указывающих на, разные операторы программы могут налагать разные ограничения на наборы точек, принадлежащих переменной. Ограничения равенства (подобные тем, которые используются в алгоритме Стинсгаарда ) можно отслеживать с помощью структуры данных поиска по объединению , что приводит к высокой производительности за счет точности анализа, основанного на ограничениях подмножества (например, алгоритм Андерсена ).

потоконезависимые Контекстно- независимые и алгоритмы

Алгоритмы анализа указателей используются для преобразования собранных данных об использовании необработанных указателей (назначение одного указателя другому или присвоение указателя для указания на другой) в полезный график того, на что может указывать каждый указатель. [4]

Алгоритм Стинсгаарда и алгоритм Андерсена являются распространенными контекстно-независимыми и нечувствительными к потоку алгоритмами для анализа указателей. Они часто используются в компиляторах и имеют реализации в SVF. [5] и ЛЛВМ .

к потоку нечувствительные Подходы ,

Многие подходы к анализу указателей, не зависящих от потока, можно понимать как формы абстрактной интерпретации , где выделение кучи абстрагируется по месту их размещения (т. е. местоположению программы). [6]

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

Многие нечувствительные к потоку алгоритмы указаны в Datalog , в том числе в среде анализа сажи для Java. [7]

Контекстно-зависимые и чувствительные к потоку алгоритмы достигают более высокой точности, как правило, за счет некоторой производительности, анализируя каждую процедуру несколько раз, по одному разу для каждого контекста . [8] В большинстве анализов используется подход «контекстной строки», где контексты состоят из списка записей (обычные варианты записи контекста включают места вызова, места размещения и типы). [9] Чтобы гарантировать завершение (и, в более общем смысле, масштабируемость), в таких анализах обычно используется подход с ограничением k , при котором контекст имеет фиксированный максимальный размер, а элементы, добавленные последними, удаляются по мере необходимости. [10] Три распространенных варианта контекстно-зависимого и нечувствительного к потоку анализа: [11]

  • Чувствительность места вызова
  • Чувствительность объекта
  • Тип чувствительности

Чувствительность места вызова [ править ]

В чувствительности к месту вызова набор точек на каждую переменную (набор абстрактных выделений кучи, на которые может указывать каждая переменная) дополнительно уточняется контекстом, состоящим из списка мест вызова в программе. Эти контексты абстрагируют поток управления программой.

Следующая программа демонстрирует, как чувствительность к месту вызова может обеспечить более высокую точность, чем нечувствительный к потоку и контекстно-независимый анализ.

int *id(int* x) {
  return x;
}
int main() {
  int y;
  int z;
  int *y2 = id(&y); // call-site 1
  int *z2 = id(&z); // call-site 2
  return 0;
}

Для этой программы контекстно-независимый анализ (здравый, но неточный) заключит, что x может указывать либо на выделение, содержащее y, либо на выделение z , поэтому y2 и z2 могут быть псевдонимами, и оба могут указывать на любое распределение. Анализ, чувствительный к месту вызова, будет анализировать id дважды: один раз для сайта вызова 1 и один раз для сайта вызова 2, а факты, указывающие на x, будут определяться сайтом вызова, что позволит анализу сделать вывод об этом, когда main вернет , y2 может указывать только на выделение, содержащее y , а z2 может указывать только на выделение, содержащее z .

Чувствительность объекта [ править ]

В объектно-чувствительном анализе набор точек каждой переменной уточняется абстрактным выделением кучи объекта-получателя вызова метода. В отличие от чувствительности к месту вызова, чувствительность к объекту не является синтаксической или нелокальной : записи контекста извлекаются во время самого анализа точек. [12]

Тип чувствительности [ править ]

Чувствительность к типу — это вариант чувствительности к объекту, при котором место размещения объекта-получателя заменяется классом/типом, содержащим метод, содержащий место размещения объекта-получателя. [13] В результате используется строго меньше контекстов, чем при объектно-зависимом анализе, что обычно означает более высокую производительность.

Ссылки [ править ]

  1. ^ Репс, Томас (1 января 2000 г.). «Неразрешимость контекстно-зависимого анализа зависимости данных» . Транзакции ACM в языках и системах программирования . 22 (1): 162–186. дои : 10.1145/345099.345137 . ISSN   0164-0925 . S2CID   2956433 .
  2. ^ Барбара Г. Райдер (2003). «Размеры точности эталонного анализа объектно-ориентированных языков программирования». Compiler Construction, 12-я Международная конференция, CC 2003, проведенная в рамках совместных европейских конференций по теории и практике программного обеспечения, ETAPS 2003 Варшава, Польша, 7–11 апреля 2003 г. Материалы . стр. 126–137. дои : 10.1007/3-540-36579-6_10 .
  3. ^ ( Hind )
  4. ^ Зырянов, Влас; Ньюман, Кристиан Д.; Гуарнера, Дрю Т.; Коллард, Майкл Л.; Малетик, Джонатан И. (2019). «srcPtr: платформа для реализации подходов к статическому анализу указателей» (PDF) . ICPC '19: Материалы 27-й Международной конференции IEEE по пониманию программ . Монреаль, Канада: IEEE.
  5. ^ Суй, Юлей; Сюэ, Цзинлин (2016). «SVF: межпроцедурный статический анализ потока значений в LLVM» (PDF) . CC'16: Материалы 25-й международной конференции по построению компиляторов . АКМ.
  6. ^ Смарагдакис, Яннис; Бравенбур, Мартин; Лхотак, Ондрей (26 января 2011 г.). «Хорошо выбирайте контексты» . Материалы 38-го ежегодного симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . ПОПЛ '11. Остин, Техас, США: Ассоциация вычислительной техники. стр. 17–30. дои : 10.1145/1926385.1926390 . ISBN  978-1-4503-0490-0 . S2CID   6451826 .
  7. ^ Антониадис, Тони; Триантафиллу, Константинос; Смарагдакис, Яннис (18 июня 2017 г.). «Портирование дупа в суфле» . Материалы 6-го международного семинара ACM SIGPLAN по новейшим достижениям в программном анализе . SOAP 2017. Барселона, Испания: Ассоциация вычислительной техники. стр. 25–30. дои : 10.1145/3088515.3088522 . ISBN  978-1-4503-5072-3 . S2CID   3074689 .
  8. ^ ( Смарагдакис и Балацурас , стр. 29)
  9. ^ Тиссен, Рей; Лхотак, Ондржей (14 июня 2017 г.). «Преобразования контекста для анализа указателей» . Уведомления ACM SIGPLAN . 52 (6): 263–277. дои : 10.1145/3140587.3062359 . ISSN   0362-1340 .
  10. ^ ( Ли и др. , стр. 1:4)
  11. ^ ( Смарагдакис и Балацурас )
  12. ^ ( Смарагдакис и Балацурас , стр. 37)
  13. ^ ( Смарагдакис и Балацурас , стр. 39)

Библиография [ править ]


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: cb25e13d9d284b8495aa8cdbf2760d51__1717446180
URL1:https://arc.ask3.ru/arc/aa/cb/51/cb25e13d9d284b8495aa8cdbf2760d51.html
Заголовок, (Title) документа по адресу, URL1:
Pointer analysis - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)