Вы находитесь на странице: 1из 18

Анализ указателей и синонимов для

многопоточных программ

Владимир Парфиненко
Научный руководитель: м. н. с. ИСИ СО РАН, Павлов П. Е.

Новосибирский Государственный Университет

Новосибирск, 2011

Владимир Парфиненко Анализ указателей и синонимов 1 / 13


Статический анализ

Оптимизирующие компиляторы
GCC, MSVC, ICC, Borland C++, MinGW, . . .
Инструменты статического анализа
SourceAnalyzer, ReSharper, Static Security Analyzer, . . .

Владимир Парфиненко Анализ указателей и синонимов 2 / 13


Вынесение инварианта из цикла

Исходный код Преобразованный код


for i = 0 to n do temp = y .f
x.f = i for i = 0 to n do
a[i] = y .f x.f = i
end for a[i] = temp
end for

Владимир Парфиненко Анализ указателей и синонимов 3 / 13


Вынесение инварианта из цикла

А что если x и y указывают на один объект?

Исходный код Преобразованный код


for i = 0 to n do temp = y .f
x.f = i for i = 0 to n do
a[i] = y .f x.f = i
end for a[i] = temp
end for

Владимир Парфиненко Анализ указателей и синонимов 3 / 13


Оптимизаторы и анализаторы

Optimization 1 Optimization 2 Optimization 3

Владимир Парфиненко Анализ указателей и синонимов 4 / 13


Оптимизаторы и анализаторы

Optimization 1 Optimization 2 Optimization 3

Analysis 1 Alias Analysis Analysis 2

Владимир Парфиненко Анализ указателей и синонимов 4 / 13


Анализ синонимов и указателей

Анализ синонимов (англ. Alias Analysis)


Могут ли два разных выражения ссылочного типа указывать на
одно и то же место в памяти?

Анализ указателей (англ. Points-To Analysis)


На какие объекты в памяти могут указывать выражения
ссылочного типа?

Владимир Парфиненко Анализ указателей и синонимов 5 / 13


Многопоточность

Алгоритму анализа указателей необходимо знать, какие


значения могут быть прочитаны из полей объектов
Проблемы с получением значений поля в многопоточных
программах:
поле может изменяться другими потоками
изменение поля может быть не видно другим потокам

Владимир Парфиненко Анализ указателей и синонимов 6 / 13


Многопоточность

Алгоритму анализа указателей необходимо знать, какие


значения могут быть прочитаны из полей объектов
Проблемы с получением значений поля в многопоточных
программах:
поле может изменяться другими потоками
изменение поля может быть не видно другим потокам

Владимир Парфиненко Анализ указателей и синонимов 6 / 13


Многопоточность

Алгоритму анализа указателей необходимо знать, какие


значения могут быть прочитаны из полей объектов
Проблемы с получением значений поля в многопоточных
программах:
поле может изменяться другими потоками
изменение поля может быть не видно другим потокам

Владимир Парфиненко Анализ указателей и синонимов 6 / 13


Цель и задачи

Цель: разработка внутрипроцедурного алгоритма анализа


указателей и внутреннего представления для
использования в статическом оптимизирующем Java
компиляторе Excelsior RVM
Основные задачи:
изучить существующие алгоритмы и выбрать подходящий
адаптировать для анализа Java программ
адаптировать для анализа многопоточных программ
реализовать алгоритм в компиляторе Excelsior RVM

Владимир Парфиненко Анализ указателей и синонимов 7 / 13


Существующие алгоритмы

Алгоритм Андерсена
сложность O(N 3 ), более точный
Алгоритм Стинсгарда
сложность O(Nα(N, N)), менее точный
(α(N, N) — обратная функция Аккермана)

Владимир Парфиненко Анализ указателей и синонимов 8 / 13


C 6= Java

Язык C Язык Java


int ∗ x = (int ∗)37 + 5; Object x = new Object();
есть адресная нет адресной
арифметика арифметики
указатели на примитивы, указатели только на
объекты, . . . объекты
объекты на стеке, в куче объекты только в куче
нестрогая типизация строгая типизация

Владимир Парфиненко Анализ указателей и синонимов 9 / 13


Java Memory Model

Чтение из volatile поля Чтение из обычного поля


a.x = 42 a.x = 42
... ...
t = b.volatile_field t = b.normal_field
... ...
x = a.x x = a.x

Владимир Парфиненко Анализ указателей и синонимов 10 / 13


Java Memory Model

Чтение из volatile поля Чтение из обычного поля


a.x = 42 a.x = 42
... ...
t = b.volatile_field t = b.normal_field
... ...
x = a.x x = a.x ⇒ x = 42

Владимир Парфиненко Анализ указателей и синонимов 10 / 13


Практические результаты

Алгоритм реализован в статическом Java компиляторе и будет


проведено сравнение следующих его модификаций:
алгоритм анализа не адаптированный для многопоточных
программ
алгоритм анализа адаптированный для многопоточных
программ
алгоритм анализа адаптированный для многопоточных
программ с учетом семантики final полей

Владимир Парфиненко Анализ указателей и синонимов 11 / 13


Заключение

Сделано следующее:
анализ существующих алгоритмов анализа указателей
изучены особенности языка Java
изучена спецификация модели памяти языка Java
разработан алгоритм анализа указателей и внутреннее
представление, адаптированные для анализа
многопоточных Java программ
реализован алгоритм анализа в рамках статического
оптимизирующего Java компилятор Excelsior RVM

Владимир Парфиненко Анализ указателей и синонимов 12 / 13


Спасибо!
Вопросы?

Владимир Парфиненко Анализ указателей и синонимов 13 / 13