Обнаружение дефектов работы с указателями в программах на языках C/C++ с использованием статического анализа и логического вывода Татьяна Верт, Татьяна Крикун (Санкт-Петербургский государственный политехнический университет) Михаил Глухих (Технический университет Клаусталя)
29
Embed
TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Analysis and Logical Inference
Vert, Т., Krikun, Т. и Glukhih, М., St. Petersburg State Polytechnic University, Clausthal Technical University Finding Defects in C and C++ Pointers Using Static Analysis and Logical Inference
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Обнаружение дефектов работы с указателями в программах на языках C/C++ с использованием статического
анализа и логического вывода
Татьяна Верт, Татьяна Крикун (Санкт-Петербургскийгосударственный политехнический университет)
Михаил Глухих (Технический университет Клаусталя)
Программное обеспечение содержит ошибки
Функциональные ошибки
o Программа не соответствует спецификации
Нефункциональные ошибки (программные дефекты)
o Использование неинициализированных переменных
o Некорректное использование указателей
o Выходы за границы массивов
2
Полнота – доля истинных обнаруженных дефектовсреди всех дефектов, имеющихся в программе
Точность – доля истинных обнаруженных дефектовсреди всех обнаруженных дефектов
3
Два из Трех
Высокая полнота
Высокая точность
Низкая ресурсоемкость
4
Анализ всех путей программы
Раздельный анализ путей (высокая точность и высокая ресурсоёмкость)
Совместный анализ путей (приемлемая ресурсоёмкость и низкая точность)
5
Зависимость – произвольная связь междузначениями двух и более переменныхпрограммы
Математически, зависимость может бытьпредставлена в виде предиката
Анализ зависимостей позволяеткомпенсировать погрешность, вызваннуюслиянием путей в ходе статического анализа
6
Использование средств логического выводадля доказательства различных утвержденийв ходе статического анализа, в частности,утверждений о наличии либо отсутствиидефектов в отдельных операторахпрограммы
7
8
9
Предикаты
Точные значения (i=const, p=&obj+shift)
Предикаты общего вида(type(obj1, obj2, ...) is
true)
Анализ точных значений
Анализ зависимостей
Хранение состояния анализируемой программы ввиде множества предикатов логики первого порядка
10
Извлечение предикатов при интерпретации операторов
– 𝑜𝑛𝑒𝑜𝑓 𝑝1, 𝑝2 – истинен хотя бы один из двух предикатов 𝑝1, 𝑝2
– 𝑜𝑝𝑝𝑜𝑠(𝑝) – предикат 𝑝 ложен
– 𝑒𝑞𝑢𝑖𝑣 𝑝1, 𝑝2 – предикаты 𝑝1 и 𝑝2 одновременно истинны или одновременно ложны
Сложные предикаты также могут быть описаны в
терминах логики первого порядка
12
Представление переменных на основе статическогооднократного присваивания (SSA):
– Каждой переменной значение присваиваетсятолько один раз;
– В случае присвоения нескольких значенийиспользуется версионирование переменных.
x = a + b; x.1 = a.1 + b.1;
y = x * x; y.1 = x.1 * x.1;
x = c + d; x.2 = c.1 + d.1;
𝑠𝑢𝑚 𝑥1, 𝑎1, 𝑏1mult 𝑦1, 𝑥1, 𝑥1s𝑢𝑚 𝑥2, 𝑐1, 𝑑1
13
Выявление зависимостей при интерпретации:
– операторов определения переменной
– операторов прямого присваивания lvar=…
• Присваивания lvar=rvar
• Присваивания lvar=binary(arg1, arg2)
• Присваивания lvar=unary(rvar)
• Присваивания адреса lvar=&rvar
• Присваивания через косвенную адресациюlvar=*rvar
– операторов косвенного присваивания *lvar=rvalue
– операторов ветвления if (cond)
– операторов выделения/освобождения памяти
14
Объединение состояний программы в точках слиянияпутей
Любое условие сохраняется на выходе фи-функциитолько в том случае, если оно имелось на всех еёвходах
Если некоторой переменной программы𝑣 соответствуют разные предикатные переменные𝑣1 и 𝑣2 во входных состояниях, то для неё создаетсяновая предикатная переменная 𝑣3, при этом ввыходное состояние добавляется предикат𝑜𝑛𝑒𝑜𝑓(𝑒𝑞𝑢𝑎𝑙𝑠(𝑣3, 𝑣1), 𝑒𝑞𝑢𝑎𝑙𝑠(𝑣3, 𝑣2))
15
Если объект имеет разные версии в разных ветвях условного оператора, предикат, описывающий его значение, следует привязать к условию оператора if
Пример: Предикатное состояние
if (size > 0)
q = malloc(size);
else
q = 0;
16
Истинная ветвь Ложная ветвь
𝑔𝑟𝑒𝑎𝑡𝑒𝑟 𝑠𝑖𝑧𝑒1, 0 𝑙𝑒𝑠𝑠_𝑒𝑞𝑢𝑎𝑙𝑠 𝑠𝑖𝑧𝑒1, 0
𝑠𝑖𝑧𝑒𝑜𝑓 𝑑𝑦𝑛, 𝑠𝑖𝑧𝑒1 𝑒𝑞𝑢𝑎𝑙𝑠 𝑞2, 0
𝑝𝑡𝑟 𝑑𝑦𝑛, 𝑞1, 0
Выходное состояние
𝑜𝑛𝑒𝑜𝑓(𝑒𝑞𝑢𝑎𝑙𝑠(𝑞3, 𝑞1), 𝑒𝑞𝑢𝑎𝑙𝑠(𝑞3, 𝑞2))
𝑒𝑞𝑢𝑖𝑣(𝑙𝑒𝑠𝑠_𝑒𝑞𝑢𝑎𝑙𝑠 𝑠𝑖𝑧𝑒1, 0 , 𝑒𝑞𝑢𝑎𝑙𝑠 𝑞3, 0 )
17
Обнаружение дефектов при анализе операцииразадресации *ptr и операции обращения по индексуptr[i]
• Некорректное использование указателей:int* ptr = 0;
Применение алгоритмов упрощениясостояния программы
Разработка механизма выделенияинвариантов цикла
Обнаружение более широкого классапрограммных дефектов
25
Рассмотрен подход к статическому анализу сиспользованием средств логического вывода.
Приведены правила извлечения предикатов изразличных операторов анализируемой программы.
Разработаны логические правила вывода для анализауказателей и обнаружения дефектов работы суказателями.
Приведённые алгоритмы анализа реализованы висследовательском прототипе на базе анализатораAegis и SMT-решателя Microsoft Z3.
Показано значительное повышение точности посравнению с базовым анализатором.
26
27
Предикат – логическое утверждение, котороеможет быть как истинно, так и ложно, зависящее отряда предикатных объектов.
Зависимость – связь между значениями двух иболее программных объектов.
Фи-функция – точка слияния двух и более потоковвыполнения программы.
Абстрактная интерпретация – общая теория,которая задает способ аппроксимации семантикидинамических дискретных систем, в том числе -компьютерных программ.
28
Логика первого порядка (исчисление предикатов) –формальное исчисление, допускающее высказыванияотносительно переменных, фиксированных функций ипредикатов.
Граф потока управления – модель программы,представляющая в виде ориентированного графапотоки управления программы. Дуги графаотображают возможный ход вычислительногопроцесса, вершины графа соответствуют инструкциямпрограммы.