Аннотация:
Язык программирования Java обладает встроенными средствами поддержки многопоточного выполнения программ. Из-за ошибок при создании подобных программ в процессе выполнения могут возникать ошибки синхронизации, одной из которых является возникновение состояния гонки между потоками, которые осуществляют доступ к разделяемому ресурсу (как минимум один поток модифицирует ресурс) и порядок работы потоков с ресурсом не фиксирован. В статье рассматривается подход к поиску состояний гонки при помощи динамического анализа. Преимущества динамического анализа по сравнению со статическим заключаются в отсутствии ложных срабатываний при определённых ограничениях, накладываемых на анализируемую программу. Для проведения динамического анализа предлагается использовать статическую инструментацию байт-кода программы, которая позволяет в ходе выполнения программы извлекать информацию о выполнении инструкций и методов, осуществляющих работу по синхронизации потоков. Построенная трасса представляет собой модель конкретного выполнения программы. На её основе с помощью отношений предшествования и механизма отслеживания блокировок определяется, возможна ли ситуация, при которой возникает состояние гонки. Для инструментации с целью сбора трассы используется инструмент динамического анализа Coffee Machine. Статическая инструментация, используемая в инструменте, позволяет проводить анализ программ на виртуальных машинах, не предоставляющих интерфейс для динамической инструментации. Анализ построенной модели и поиск потенциальных состояний гонки осуществляется при помощи инструмента ThreadSanitizer Offline. Благодаря использованию инструментации байт-кода наличие связи с исходным кодом для проведения анализа не является необходимым, однако это позволяет более точно определить причины возникновения ошибки. Реализация была проверена на ряде проектов с открытым исходным кодом и продемонстрировала свою эффективность для поиска состояний гонки.
Ключевые слова:динамический анализ, состояния гонки, ошибки синхронизации.