Анализ псевдонимов — это способ статического анализа, в ходе которого определяется, могут ли две или более ссылки (указатели, имена переменных, элементы массивов) обращаться к одному и тому же участку памяти (объекту).
Знание этого факта позволяет статическому анализатору обнаруживать сложные ошибки, такие как небезопасный параллельный доступ к общим данным (условия гонки), некорректные операции приведения типов или модификация объекта по одной ссылке при его одновременном использовании по другой.
Подход к анализу кардинально меняется в зависимости от языка программирования и его модели памяти.
Например, в C/C++ и unsafe-коде на C# программист работает напрямую с указателями, в то время как в Java или C# (без unsafe) используются ссылки, управляемые средой выполнения.
Одна из ключевых сложностей анализа при работе с указателями напрямую заключается в том, что псевдонимы могут быть представлены указателями различных типов и ссылаться на один участок памяти. Это требует от анализатора отслеживания операций приведения типов.
В данном примере на C++ создаётся целочисленная переменная x. Указатель p типа int* хранит её адрес. Затем этот адрес приводится к типу float* и присваивается указателю q. Теперь p и q являются псевдонимами для одного участка памяти, но интерпретируют его содержимое по-разному.
int x = 10;
int* p = &x;
float* q = reinterpret_cast<float*>(p);
В Java модель памяти отличается, однако концепция псевдонимов тоже присутствует. В этом примере массив x создаётся в памяти, а переменные p и q становятся ссылками на него, то есть являются псевдонимами в том смысле, что модификация массива через одну переменную будет видна и через другую.
int[] x = { 1, 2, 3 };
int[] p = x;
p[0] = 4;
Это является ещё одной ключевой сложностью при работе с псевдонимами: для отслеживания изменений требуется иметь модель памяти, позволяющую учитывать доступы к элементам массивов и объектов.
ГОСТ Р 71207-2024 — Статический анализ программного обеспечения. В разделе терминов дано следующее определение анализа помеченных данных:
Статический анализ, позволяющий установить наличие в программе доступа к одной и той же переменной или функции с помощью различных ссылок (указателей).
Также стоит отметить, что согласно ГОСТ Р 71207-2024 (п. 7.4.) анализ псевдонимов является не обязательным, но рекомендуемым вспомогательным видом анализа (технологией анализа).
0