Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TMPA-2013 Vert Krikun: Finding Defects in C and C++ Pointers Using Static Analysis and Logical Inference

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

5206c19df417b8876825b5561344c1a0?s=128

Exactpro
PRO

October 12, 2013
Tweet

Transcript

  1. Обнаружение дефектов работы с указателями в программах на языках C/C++

    с использованием статического анализа и логического вывода Татьяна Верт, Татьяна Крикун (Санкт-Петербургский государственный политехнический университет) Михаил Глухих (Технический университет Клаусталя)
  2.  Программное обеспечение содержит ошибки  Функциональные ошибки o Программа

    не соответствует спецификации  Нефункциональные ошибки (программные дефекты) o Использование неинициализированных переменных o Некорректное использование указателей o Выходы за границы массивов 2
  3.  Полнота – доля истинных обнаруженных дефектов среди всех дефектов,

    имеющихся в программе  Точность – доля истинных обнаруженных дефектов среди всех обнаруженных дефектов 3 Два из Трех Высокая полнота Высокая точность Низкая ресурсоемкость
  4. 4

  5.  Анализ всех путей программы  Раздельный анализ путей (высокая

    точность и высокая ресурсоёмкость)  Совместный анализ путей (приемлемая ресурсоёмкость и низкая точность) 5
  6.  Зависимость – произвольная связь между значениями двух и более

    переменных программы  Математически, зависимость может быть представлена в виде предиката  Анализ зависимостей позволяет компенсировать погрешность, вызванную слиянием путей в ходе статического анализа 6
  7.  Использование средств логического вывода для доказательства различных утверждений в

    ходе статического анализа, в частности, утверждений о наличии либо отсутствии дефектов в отдельных операторах программы 7
  8. 8

  9. 9 Предикаты Точные значения (i=const, p=&obj+shift) Предикаты общего вида (type(obj1,

    obj2, ...) is true) Анализ точных значений Анализ зависимостей Хранение состояния анализируемой программы в виде множества предикатов логики первого порядка
  10. 10

  11.  Извлечение предикатов при интерпретации операторов  Типы предикатов: –

    арифметические (A=B+C, A=B*C, A=B%C, и т. д.) – логические (A=¬B, A=B∨D, A=B∧D, A→B) – сравнения (A>B, A<B, A≥B, A≤B, A≠B) – работа с указателями(A=&B+C, A=*B) – обращение к составному объекту(A=B[C], A=B.C) – размер объекта(A = sizeof B, A ≤ sizeof B) – …  Представление: (1 , 2 , … , ), где - функциональный символ, , = 1 … – предикатные переменные 11
  12.  Переменными предикатов являются другие предикаты  Примеры: – 1

    , 2 – истинен хотя бы один из двух предикатов 1 , 2 – () – предикат ложен – 1 , 2 – предикаты 1 и 2 одновременно истинны или одновременно ложны  Сложные предикаты также могут быть описаны в терминах логики первого порядка 12
  13.  Представление переменных на основе статического однократного присваивания (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 , 1 mult 1 , 1 , 1 s 2 , 1 , 1 13
  14.  Выявление зависимостей при интерпретации: – операторов определения переменной –

    операторов прямого присваивания lvar=… • Присваивания lvar=rvar • Присваивания lvar=binary(arg1, arg2) • Присваивания lvar=unary(rvar) • Присваивания адреса lvar=&rvar • Присваивания через косвенную адресацию lvar=*rvar – операторов косвенного присваивания *lvar=rvalue – операторов ветвления if (cond) – операторов выделения/освобождения памяти 14
  15.  Объединение состояний программы в точках слияния путей  Любое

    условие сохраняется на выходе фи-функции только в том случае, если оно имелось на всех её входах  Если некоторой переменной программы соответствуют разные предикатные переменные 1 и 2 во входных состояниях, то для неё создается новая предикатная переменная 3 , при этом в выходное состояние добавляется предикат ((3 , 1 ), (3 , 2 )) 15
  16.  Если объект имеет разные версии в разных ветвях условного

    оператора, предикат, описывающий его значение, следует привязать к условию оператора 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. 17  Обнаружение дефектов при анализе операции разадресации *ptr и

    операции обращения по индексу ptr[i] • Некорректное использование указателей: int* ptr = 0; if (array[0]>0) ptr=array; int val=*ptr; //разадресация нулевого указателя • Выход за границу объекта int a, i; int array[9]; i = 10; a = array[i]; //выход за границу массива
  18.  Корректность указателя p = (void*)(&t)+s; v = sizeof(t); ,

    , , , , _(, 0), (, ) _()  Разадресация указателя v = *p; 1) Указатель на простую переменную p = (void*)(&t); ,,0 ,(,) (,) 2) Указатель на элемент составного объекта p = (void*)(&a)+s; t = *(&a +s); , , , , , , (, ) (, ) 18
  19.  Сложение указателя с целочисленной константой p = (void*)(&a)+s; t=s+b;

    q = p+b; , , , , , , (, , ) (, , ) 19
  20.  Присутствие дефекта – доказательство разрешимости предикатов: – нулевой указатель:(,

    0) – некорректный указатель: (_())  Отсутствие дефекта – неразрешимость предикатов 20
  21. … Предикаты int x,b; sizeof(arr, 20), std::cin >> x; equals(arr[0]_0,

    0), int arr[5]={0,1,2,3,4}; equals(arr[1]_0, 1), if (x>0){ equals(arr[2]_0, 2), b = arr[x]; equals(arr[3]_0, 3), } equals(arr[4]_0, 4), … greater(x_0, 0), ptr(arr, tmp1_0, 0)), mult(tmp2_0, x_0, 4), sum(tmp3_0, tmp1_0,tmp2_0) ptr(arr, tmp3, tmp2), sizeof(arr, 20), or(less(tmp2, 0), greater_equals(tmp2, 20)) = > oppos(correct_ptr(tmp3)) 21
  22.  Доказатели теорем – HOL Theorem Prover  Языки логического

    программирования – Bprolog  SMT-решатели – Z3 22
  23.  Средство-прототип 23

  24. 24 Пример Истинных дефектов Разработанная система Aegis (Digitek Labs) FlexeLint

    (Gimpel Software) дефектов найдено ложных дефектов найдено дефектов найдено ложных дефектов найдено дефектов найдено ложных дефектов найдено 1 1 1 0 1 0 1 0 2 2 2 0 0 0 0 0 3 1 1 0 1 0 0 0 4 2 2 0 3 1 3 1 5 0 0 0 1 1 1 1 6 2 2 0 3 1 1 1 7 0 0 0 2 2 1 1 8 2 1 0 1 0 1 0 … Полнота 95% 75% 45% Точность 95% 68% 60% Среднее время 53 сек. 5 сек. 4 сек.
  25.  Применение алгоритмов сборки мусора  Применение алгоритмов упрощения состояния

    программы  Разработка механизма выделения инвариантов цикла  Обнаружение более широкого класса программных дефектов 25
  26.  Рассмотрен подход к статическому анализу с использованием средств логического

    вывода.  Приведены правила извлечения предикатов из различных операторов анализируемой программы.  Разработаны логические правила вывода для анализа указателей и обнаружения дефектов работы с указателями.  Приведённые алгоритмы анализа реализованы в исследовательском прототипе на базе анализатора Aegis и SMT-решателя Microsoft Z3.  Показано значительное повышение точности по сравнению с базовым анализатором. 26
  27. 27

  28.  Предикат – логическое утверждение, которое может быть как истинно,

    так и ложно, зависящее от ряда предикатных объектов.  Зависимость – связь между значениями двух и более программных объектов.  Фи-функция – точка слияния двух и более потоков выполнения программы.  Абстрактная интерпретация – общая теория, которая задает способ аппроксимации семантики динамических дискретных систем, в том числе - компьютерных программ. 28
  29.  Логика первого порядка (исчисление предикатов) – формальное исчисление, допускающее

    высказывания относительно переменных, фиксированных функций и предикатов.  Граф потока управления – модель программы, представляющая в виде ориентированного графа потоки управления программы. Дуги графа отображают возможный ход вычислительного процесса, вершины графа соответствуют инструкциям программы. 29