Достигающие определения

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Достигающие определения (англ. Reaching definition) — одна из наиболее распространенных и полезных схем потока данных. Зная, где именно в программе может быть определена каждая переменная x при достижении потоком управления каждой точки p, можно получить много информации об этой переменной. В частности, компилятор может выяснить, является ли x константой в точке p, а отладчик может сообщить о возможном использовании в точке p не инициализированной переменной x[1].

Значение термина[править | править исходный текст]

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

Определением переменной x является инструкция, которая присваивает или может присваивать значение переменной x. Анализ программы должен быть консервативным: если мы не знаем, присваивает ли инструкция s значение переменной x, то мы должны считать, что она может сделать это, т.е. что переменная x после инструкции s может иметь либо исходное значение, бывшее у нее до инструкции s, либо новое значение, созданное s[1].

Пример[править | править исходный текст]

Для примера рассмотрим следующий код:

d1 : y := 3
d2 : x := y

где определение d1 достигает определение d2. Однако, в следующем примере:

d1 : y := 3
d2 : y := 4
d3 : x := y

определение d1 не достигает определения d3, потому что определение d2 уничтожает определение переменной y в d1.

Примечания[править | править исходный текст]

Литература[править | править исходный текст]