BDD. The Outer Limits. Iosif Itkin at Youcon (in Russian)
Lightweight Static Analysis for Data Race Detection in Operating System Kernels
1. Легковесный статический
анализ для поиска
состояний гонок в ядре
операционной системы
Павел Андрианов
andrianov@ispras.ru
http://linuxtesting.org/project/ldv/
Institute for System Programming of the Russian Academy of Sciences
2. 2
Состояние гонки
int global;
Thread 1
{
...
global = 1;
...
}
Thread 2
{
...
global = 2;
...
}
3. 3
Мотивация
● Ошибки, связанные с параллельным
выполнением, составляют 20% от всех
ошибок в файловых системах ОС Linux
(A Study of Linux File System Evolution,
FAST'13)
● Состояния гонок составляют 17% от всех
ошибок в драйверах ОС Linux (Анализ
типовых ошибок в драйверах ОС Linux,
Труды ИСП РАН)
4. 4
Основные алгоритмы для поиска
гонок
● Happens-Before – строит зависимости
между операциями
● Lockset – потенциальным состоянием
гонки называется ситуация, в которой
доступ к одним и тем же разделяемым
данным происходит с
непересекающимся множеством
блокировок, при этом одно из
обращений является записью.
5. 5
Особенности ядра
операционной системы
● Неявное создание потоков
● Активное использование арифметики
указателей
● Использование специальных примитивов
синхронизации
6. 6
Модель потоков
● Функция main содержит вызовы
обработчиков событий,
системные вызовы и другие
функции ядра
● Считается, что все функции,
вызываемые из main, могут
выполняться параллельно
int main() {
switch (undef_int())
{
case 0:
func1();
break;
case 1:
func2();
break;
...
}
}
7. 7
Модель памяти
Переменные
Поля структур
Глобальные
переменные
Локальные
переменные
A->x = B->x
A->x ≠ A->y
f::a ≠ g::a f::a->x = g::a->x
A ≠ B
struct mystruct {
int *x;
int *y;
} *A, *B;
int f() {
struct mystruct *a;
...
}
int g() {
struct mystruct *a;
...
}
8. 8
Реализация
Анализ
разделяемых
данных
Исходный код
Список разделяемых
переменных
Анализ
примитивов
синхронизации
Отчет
Список функций,
предоставляющих
локальные данные
(malloc и др.)
Описание
примитивов
синхронизации