Слайд 1 - kspt.icc.spbstu.rukspt.icc.spbstu.ru/media/files/2018/course/... ·...
TRANSCRIPT
2018
Ицыксон В.М. ВиАП © 2018
2
Статический анализ
Семейство методов анализа, не требующих исполнения программ
Артефакты, используемые при анализе:◦ Исходный код программного обеспечения
◦ Промежуточные представления кода (например, байт-код)
◦ Исполнимый код
◦ Аннотации программ
◦ Формальные спецификации
Ицыксон В.М. ВиАП © 2018
3
Статический анализ
Применяется в следующих задачах:◦ Форматирование программ
◦ Реинжиниринг программ Оптимизация
Распараллеливание
Обфускация
Деобфускация
Модификация программ
◦ Реверс-инжиниринг Восстановление моделей программ
Визуализация внутренней структуры программ
◦ Анализ качества программ
Вычисления программных метрик
Обнаружение дефектов
Обнаружение уязвимостей
Ицыксон В.М. ВиАП © 2018
4
Статический анализ для повышения качества ПО
Обычно разделяют статический анализ и формальную верификацию ПО
Формальная верификация◦ Статический метод◦ Используемые артефакты:
Исходный код Формальные спецификации
◦ Проверка соответствия программы формальной спецификации
Статический анализ◦ Статический метод◦ Обнаружение ошибок программы (необязательно
несоответствий спецификации)
В настоящее время все сложнее найти грань между статическим анализом и верификацией
Ицыксон В.М. ВиАП © 2018
5
Ошибки в программном обеспечении
Ошибки в спецификации
Ошибки в программе
Ошибки в документации
Ошибки в ПО
Несоответствие спецификации (функциональные дефекты)
Общие ошибки реализации (нефункциональные дефекты)
Ошибки в кодировании
Нарушения правил работы со
сложными данными
Ошибки использования
библиотек
…
Ицыксон В.М. ВиАП © 2018
6
Нефункциональные дефекты
Не являются нарушением явных спецификаций
Являются следствием ◦ сложности языков программирования
◦ сложности библиотек
◦ сложности алгоритмов
◦ сложности структур данных
◦ использования параллелизма
◦ …
Ицыксон В.М. ВиАП © 2018
7
Нефункциональные дефекты
Арифметические ошибки◦ Арифметическое переполнение◦ Деление на ноль
Ошибки работы с буферами◦ Выход за границу массива◦ Переполнение буфера
Неинициализированные объекты◦ Использование неинициализированных переменных◦ Разыменование неинициализированного указателя
Ошибки работы с указателями◦ «Висячие» указатели◦ Разыменование нулевого указателя◦ Работа с некорректным указателем◦ Двойное освобождение памяти
Несоблюдение протокола работы с библиотеками Утечка ресурсов Ошибки форматных строк …
Ицыксон В.М. ВиАП © 2018
8
Проявление дефектов
Без проявления
Зависания
Сбои
Падения
Нарушения целостности данных
Деградация производительности
Уязвимости
…
Ицыксон В.М. ВиАП © 2018
9
Опасные конструкции
Язык С◦ Макроопределения◦ Указатели◦ Массивы◦ Адресная арифметика◦ Указатели на функции◦ Приведения типов◦ Объединения (union)◦ Вычисляемые переходы
Язык С++◦ Полиморфизм◦ Исключения
…
Ицыксон В.М. ВиАП © 2018
10
Статический анализ для обнаружения ошибок
Использует ◦ Исходный код ПО для анализа
◦ Семантику конструкций языка программирования
Позволяет ◦ проанализировать все возможные трассы исполнения
программы
◦ проанализировать все наборы входных данных
Может быть полностью или почти полностью автоматизирован
Позволяет обнаружить нефункциональныедефекты
Ицыксон В.М. ВиАП © 2018
11
Характеристики анализа
Полнота – доля найденных дефектов среди всех дефектов программы
Точность – доля найденных истинных дефектов среди всех найденных
Ресурсоемкость – объем необходимых ресурсов: машинное время, память
Полнота Точность
Ресурсоёмкость
Ицыксон В.М. ВиАП © 2018
12
Методы статического анализа программ
Легковесные методы◦ Сигнатурный анализ
Тяжеловесные методы◦ Анализ потока (анализ состояний программы)
◦ Абстрактная интерпретация
◦ Системы типов и эффектов
◦ Ограниченная проверка модели (BMC)
Ицыксон В.М. ВиАП © 2018
13
Легковесные методы
Используют только структурные модели программ (обычно АСД)
Не анализируют динамику исполнения
Анализируются только синтаксические конструкции и статическая семантика
Пример – сигнатурный анализ
Программный код проверяется на соответствие множеству шаблонов ошибок/неудачных конструкций/опечаток
Ицыксон В.М. ВиАП © 2018
14
Сигнатурный анализ
Примеры шаблонов ошибок:◦ Одинаковые операнды у операций (==, &&, -)
◦ Ошибки приоритетов операций
◦ Возврат указателя на локальный объект
◦ Двойные присваивания
◦ Секции “then” и “else” эквивалентны
◦ Лишние символы “;”, “,” и т.п.
◦ Дублирующиеся аргументы функций
◦ Использование логических операций вместо битовых и наоборот (&/&&, |/||)
◦ Присваивание вместо сравнения (x=y) вместо (x==y)
◦ И т.п.
Пример анализатора – PVS-studio
Ицыксон В.М. ВиАП © 2018
15
Тяжеловесные методы
Используют поведенческие модели программ
Анализируют динамику исполнения
Анализируется и статическая и динамическая семантика
Ицыксон В.М. ВиАП © 2018
16
Анализ потока
Цель анализа – вычислить возможные состояния программы во всех точках
Состояние программы в конкретной точке –множество состояний всех объектов программы, доступных в этой точке
Обнаружение дефектов происходит после вычисления состояний на основе проверки корректности этих состояний
Ицыксон В.М. ВиАП © 2018
17
Анализ потока управления
Ицыксон В.М. ВиАП © 2018
18
Анализ потока управления
В качестве модели программы используется SSA или CFG
Точки программы – переходы графа потока управления (SSA)
В соответствии с семантикой конструкций языка программирования описывается связь состояний точек программы◦ F(Sin, Sout) = 0
◦ Sin – состояние на входе узла графа
◦ Sout – состояние на выходе узла графа
Ицыксон В.М. ВиАП © 2018
19
Анализ потока управления
Если исходное состояние задается в начальной точке функции, то анализ прямой, иначе –обратный
В случае прямого анализа: Sout =F(Sin)
Sin и Sout – множество состояний всех доступных в контексте объектов
F – функция пересчета состояния, зависящая от семантики конкретной конструкции языка
Ицыксон В.М. ВиАП © 2018
20
Конкретные алгоритмы статического анализа
Расчет значений переменных◦ интервальный анализ (interval analysis)
Определение состояния указателей◦ анализ указателей (pointer analysis, point-to analysis
и alias analysis)
Определение состояний объектов, имеющих свой жизненный цикл◦ Ресурсный анализ
…
Ицыксон В.М. ВиАП © 2018
21
Интервальный анализ
Оперирует не значениями, а интервалами
Состояние переменных представляются интервальными значениями◦ a = [10: 20]
◦ b = (-40: 20) (30: 100)
◦ c = [0: ∞)
Вычисление состояния после выполнения оператора языка производится на основе правил интервальной арифметики:◦ Сложение: [a: b] + [c: d] = [a + c: b + d]
◦ Вычитание: [a: b] − [c: d] = [a − d: b − c]
◦ Умножение: [a: b] × [c: d] = [min(ac, ad, bc, bd): max(ac, ad, bc, bd)]
◦ Деление: [a: b] / [c: d] = [min(a/c, a/d, b/c, b/d): max(a/c, a/d, b/c, b/d)]
Ицыксон В.М. ВиАП © 2018
22
Интервальный анализ
Элемент модели
int a;
a = С;
a = b;
a = b + c;
φ(…)
if (cond) Strue elseSfalse
Интервальное правило
Sout = Sin <a, uninit>
Sout = Sin \ Ui<a, i> <a, С>
Sout = Sin \ Ui<a, i> Uj<a, bj>
Sout = Sin \ Ui<a, i> Uj<a, bj + cj>
Sout = Ui Sin,i
Strue= Sin cond
Sfalse= Sin cond
Ицыксон В.М. ВиАП © 2018
23
Интервальный анализ. Пример
int a;
a=10;
int b = f(…);
if (b < 100){
…
a = a + b;
}
else{
…
a = b / 2;
}
<a, uninit>
<a, [10: 10]>
<a, [10: 10]>, <b, (-: )>
<a, [10: 10]>, <b, (-: 100)>
<a, [-: 110]>, <b, (-: 100)>
<a, [10: 10]>, <b, [100: )>
<a, [50: )>, <b, [100: )>
Ицыксон В.М. ВиАП © 2018
24
Анализ указателей
Отличие от интервального анализа: ◦ хранятся не интервалы значений, а списки связи
“может указывать на” (points-to)
◦ значения одних объектов могут влиять на другие
Ицыксон В.М. ВиАП © 2018
25
Анализ указателей. Пример 1
p, q1 и q2 – указатели на динамическую память
Пример для конструкции free(p);
Ицыксон В.М. ВиАП © 2018
26
Анализ указателей. Пример 2
p, q – указатели
Пример для конструкции *p = q
Ицыксон В.М. ВиАП © 2018
27
Анализ указателей. Пример 3
p, q – указатели
Пример для конструкции p = *q
Ицыксон В.М. ВиАП © 2018
28
Свёртка модели программ
Объединение базовых блоков◦ Последовательность операторов, не содержащая
ветвлений, – базовый блок
◦ Базовый блок сворачивается до одного узла
Свертка путей◦ совместный анализ альтернативных путей
◦ что делать при объединении ветвей?
◦ как строить состояние после объединения?
Ицыксон В.М. ВиАП © 2018
29
Консервативность анализа
Определяется правилами объединения ветвей
Консервативный (пессимистический) анализ◦ При объединении ветвей объединяет интервалы
◦ Сохраняет полноту (обнаруживаем все ошибки)
◦ Теряет точность (много ложных обнаружений)
Оптимистический анализ◦ При объединении ветвей пересекает интервалы
◦ Теряет полноту (может пропускать ошибки)
◦ Сохраняет точность (мало ложных обнаружений)
Ицыксон В.М. ВиАП © 2018
30
Консервативность анализа
int arr1[10];
int arr2[5];
if (…){
…
} // <i, [1..8]>
else {
…
} // <i, [6..15]>
a = arr1[i]; // возможно ошибка
b = arr2[i]; // ошибка
Консервативный анализ:
◦ <i, [1..15]>
◦ обнаружит обе ошибки (возможно первая –ложная)
Оптимистический анализ
◦ <i, [6..8]>
◦ обнаружит вторую ошибку (пропустив первую)
Ицыксон В.М. ВиАП © 2018
31
Ресурсный анализ
Ресурсы – объекты программы, имеющие свой жизненный цикл
Примеры ресурсов:◦ Выделенная динамическая память в куче◦ Файлы◦ Семафоры◦ Мьютексы◦ Сокеты◦ Потоки◦ Нити◦ …
Обычно ресурсы характеризуются состоянием и атрибутами
Каждый тип ресурса изменяет свое состояние по определенным правилам
Ицыксон В.М. ВиАП © 2018
32
Ресурсный анализ. Объект в куче
Правила использования:◦ Создание ресурса: p = malloc(…)
◦ Использование ресурса: *p
◦ Освобождение ресурса: free(p)
Примеры дефектов◦ Использование не созданного объекта
◦ Повторное освобождение
◦ Утечка
Ицыксон В.М. ВиАП © 2018
33
Ресурсный анализ. Файл
Правила использования◦ Создание ресурса: f = fopen(“…”, “r” )◦ Использование ресурса: fprintf(f, …) ◦ Уничтожение ресурса: close(f)
Примеры дефектов◦ Чтение из не открытого файла◦ Попытка писать в файл открытый на чтение◦ Не закрытие файла◦ …
Ицыксон В.М. ВиАП © 2018
34
Ресурсный анализ
Отличие ресурсов от других объектов программы:◦ Управляются операционной системой◦ Управление сменой состояний и атрибутов
происходит через функции API
Необходимо анализировать не конструкции ЯП, а библиотечные вызовы
Необходима информация о семантике библиотечных вызовов. Где ее взять?◦ Семантика зашивается в анализатор◦ Семантика описывается путем аннотирования
библиотек
Ицыксон В.М. ВиАП © 2018
35
Масштаб анализа
Внутрипроцедурный анализ◦ Каждая функция анализируется отдельно
◦ Информация не передается между функциями
◦ Ресурсоемкость относительно низкая
◦ Точность и/или полнота – снижаются
◦ Реализуется большинством анализаторов
Ицыксон В.М. ВиАП © 2018
36
Масштаб анализа
Межпроцедурный анализ◦ Все функция анализируется совместно
◦ Информация передается между функциями
◦ Точность и полнота не страдают
◦ Ресурсоемкость очень высокая
◦ Реализовано в небольшом числе анализаторов
Ицыксон В.М. ВиАП © 2018
37
Решение уравнений
В результате применения алгоритмов в явном или неявном виде строится система уравнений
Решение системы◦ С использованием теории решеток
Завершаемость процесса решения обуславливается◦ Монотонностью уравнений
◦ Конечностью системы уравнений
Ицыксон В.М. ВиАП © 2018
38
Обнаружение дефектов
Обнаружение дефектов – на основе анализа допустимости состояний в узлов модели
Использование неинициализированной переменной:◦ Конструкция: a = b
◦ Условие: <b, uninit> Sin
Повторное освобождение объекта◦ Конструкция: free(p)
◦ Условие: <p, invalid> Sin
Ицыксон В.М. ВиАП © 2018
39
Обнаружение дефектов
Разыменование некорректного указателя◦ Конструкция: a = *p
◦ Условие: <p, invalid> Sin
Арифметические операции над указателями на разные объекты◦ Конструкция: a = p – q;
◦ Условие: <p, o1>,<q, o2> Sin, o1≠o2
Выход за границы объекта◦ Конструкция: a = *p;
◦ Условие: <p, o, k> Sin, k≥osize
Ицыксон В.М. ВиАП © 2018
40
Аннотирование
Что делать если часть исходных кодов отсутствует?
Что делать если проект использует библиотечные вызовы?
Что делать если вы знаете о коде нечто такое, что не способен выявить анализатор?
Как замаскировать ложные обнаружения?
Ответ: использовать механизмы внесения внешней семантики в процесс анализа -аннотирование
Ицыксон В.М. ВиАП © 2018
41
Аннотирование
Способы аннотирования:◦ расширение целевого языка с помощью
аннотирующих комментариев
◦ расширение целевого языка с использованием его внутренних средств (аннотации, asserts и т.п.)
◦ внешние средства для описания поведения компонентов
Ицыксон В.М. ВиАП © 2018
42
Языки аннотаций
На основе комментариев С◦ ACSL (ANSI/ISO C Specification Language)
◦ Аннотации в SPlint
На основе внутренних средств С◦ SAL (Source Annotation Language)
◦ PREfast Annotations
Оригинальный язык◦ Metal
◦ SLIC
◦ PanLang
Ицыксон В.М. ВиАП © 2018
43
Языки аннотаций: цели
Описание поведения функций
Описание глобальных объектов
Описание ресурсов
Описание предусловий, инвариантов, …
Обнаружение новых типов дефектов (чекеры)
Маскирование ложных дефектов
Исключение из анализа участков кода
…
Ицыксон В.М. ВиАП © 2018
44
Примеры. Язык Metal. Описание ошибок работы с ресурсами
state decl any_pointer v;
start: { kfree(v) } ==> v.freed;
v.freed: { *v } ==> v.stop,
{ err("Использование %s после освобождения!",
mc_identifier(v)); }
| { kfree(v) } ==> v.stop,
{ err("Двойное освобождение %s!",
mc_identifier(v)); };
Ицыксон В.М. ВиАП © 2018
45
Язык ACSL. Пример предусловия
/*@
requires 0 <= n;
requires \valid_range(a, 0, n-1);
*/
void example(value_type* a, size_type n);
Ицыксон В.М. ВиАП © 2018
46
Язык PanLang. Пример аннотации функции realloc
void* realloc(void* ptr, unsigned size) {
if (size <= 0) {
delete(Heap) ptr;
return 0;
}
else {
void* res = new Heap(Allocated, size, none, true);
if (ptr->size <= size) {
size = ptr->size;
}
copy(res, ptr, size);
delete(Heap) ptr;
return res;
}
}
Ицыксон В.М. ВиАП © 2018
47
Язык PanLang. Пример аннотации функции recv
long recv ( int s ,void* buf ,unsigned len ,int flags) {
if ( buf == 0 ) {
defect (INI-03, "Второй аргумент функции - NULL");
}
if ( flags < 0 ) {
defect (INI-01, "Некорректное значение аргумента функции");
}
if ( state(s) != Established) {
defect (RES-06, "Получение данных из несоединенного сокета");
}
set ( buf, [-inf:+inf], len );
return [0:len];
}
Проблемы статического анализа
Анализ циклов
Анализ рекурсии и глубокой вложенности вызовов
Анализ сложных типов данных
Анализ программ с исключениями
Анализ программ с полиморфизмом и указателями на функции
…
Ицыксон В.М. ВиАП © 2018
55
Ицыксон В.М. ВиАП © 2018
56
Инструменты статического анализа
C/C++◦ Lint (1977 год!)◦ Astrée (Inria)◦ Coverity Static Code Analysis (Synopsis)◦ CodeSonar (GrammaTech )◦ Klocwork Static Code Analysis ◦ IBM® Rational® Software Analyzer◦ PC-lint/FlexeLint (Gimpel Software)◦ SVace (Security Vulnerabilities and Critical Errors Detector, ИСП РАН)◦ Fortify (HP)◦ Frama-C◦ Static Analysis for C and C++ (Parasoft)◦ Polyspace (Mathworks )◦ SPLint (Secure Programming Lint)◦ CPPCheck◦ Aegis (Политех, КСПТ)
Java◦ FindBugs◦ JTest (Parasoft)