автореферат диссертации по информатике, вычислительной технике и управлению, 05.13.11, диссертация на тему:Статический анализ кода для автоматизированного обнаружения ошибок при переносе программ на 64-битные платформы

кандидата технических наук
Рыжков, Евгений Александрович
город
Тула
год
2009
специальность ВАК РФ
05.13.11
Диссертация по информатике, вычислительной технике и управлению на тему «Статический анализ кода для автоматизированного обнаружения ошибок при переносе программ на 64-битные платформы»

Автореферат диссертации по теме "Статический анализ кода для автоматизированного обнаружения ошибок при переносе программ на 64-битные платформы"

На правах рукописи

РЫЖКОВ ЕВГЕНИИ АЛЕКСАНДРОВИЧ

СТАТИЧЕСКИИ АНАЛИЗ КОДА ДЛЯ АВТОМАТИЗИРОВАННОГО ОБНАРУЖЕНИЯ ОШИБОК ПРИ ПЕРЕНОСЕ ПРОГРАММ НА 64-БИТНЫЕ ПЛАТФОРМЫ

05.13.11 - Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей

Автореферат диссертации иа соискание ученой степени кандидата технических наук

о з т 2003

Тула 2009

003472016

Работа выполнена в ГОУ ВПО «Тульский государст венный университет»

Научный руководитель: Кандидат физико-математических наук, доцент

СЕРЕДИН Олег Сергеевич Официальные оппоненты: Доктор технических наук, профессор

ЕСРИКОВ Олег Витальевич Кандидат физико-математических наук, ХбРОШИЛОВ Алексей Владимирович Ведущая организация: Учреждение Российской академии наук

Вычислительный центр им. А. А. Дородницына РАН (ВЦ РАН), г. Москва

Защита состоится » що/гД 2009 г. в Ю часов на заседании диссертационного сонета Д 212.271.07 при ГОУ ВПО «Тульский государственный университет» (300600, Тула, проспект им. Ленина, 92, 9101).

С диссертацией можно ознакомиться в библиотеке ГОУ ВПО «Тульский государственный университет» (300600, Тула, проспект им. Ленина, 92).

Автореферат разослан ¿1^2009 г.

Ученый секретарь Ф А. Данилкин

диссертационного совета

Общая характеристика работы

Актуальность темы. Персональные компьютеры с 64-битными процессорами появились па массовом рынке, в начале 2006 года. Практически сразу же начался процесс модификации программ для работы на новой архитектуре. Но неожиданно для разработчиков выяснилось, что после запуска на новой платформе приложения могут вести себя некорректно. Стандартные средства диагностики не позволяют выявить новый класс ошибок в приложениях, но оставлять эти ошибки неисправленными нельзя.

Столкнувшись с необходимостью переноса существующих приложений на новую 64-битную систему, разработчики программного обеспечения оказываются в необычном для себя положении. Программы, работавшие стабильно много лет, начинают вести себя непредсказуемым образом. Программам стало доступно больше оперативной памяти. Однако при попытке обработки больших, чем ранее, объемов данных, приложение может зависнуть, аварийно завершиться или, что еще хуже, вместо файлов с результатами работы выдать пользователю файлы с мусором.

Казалось бы, раз более или менее известны проблемы, возникающие в коде при миграции приложений на 64-битные платформы, го надо просто писать программы без ошибок. Однако это возможно только для новых программных продуктов, которые сразу же разрабатываются для 64-битной архитектуры. Большинство же существующих программ приходится переносить на новую архитектуру. Очевидно, что поиск ошибок в миллионах строк кода уже существующих приложений, которые безошибочно функционировали на 32-битных системах, без средств автоматизации не возможен.

Одним из возможных решений для поиска ошибок при переносе кода является использование программ специального класса - статических анализаторов кода.

Вопросами повышения качества программного обеспечения занимаются С. Макконнел, М. Фаулер, С. Майерс, в России - В.В. Липаев. Проблемами 64-битного кода - М. Питрек, А.Зейчик, М. Уолл, К.С. Гэтлин, А. МакНаутон. Разработкой статических анализаторов занимаются С. Гутз, А. Колава. Недостатком работ данных авторов является тот факт, что они не уделяли внимание автоматизированному обнаружению ошибок в 64-битных приложениях. Они обращали свое внимание либо на различные методики обучения программистов написанию качественного кода, либо на другие способы повышения качества. При этом автоматизированное обнаружение ошибок рассматривалось лишь для наиболее традиционных ошибок программистов - 64-битный код оставался в стороне.

Объектом исследования является процедура миграции (переноса) программного обеспечения с 32-разрядной на 64-разрядную платформу.

Предметом исследования являются правила диагностики потенциально опасных синтаксических конструкций в коде программ на языках Си и Си++.

Цель диссертации. Целью работы является повышение качества программных продуктов и сокращение количества программных ошибок во время процедуры миграции программного обеспечения на 64-битные платформы. Для достижения этой цели разработаны правила диагностики потенциально опасных синтаксических конструкций и реализован программный продукт в виде статического анализатора кода для проверки корректности процесса переноса программ на языках Си и Си++ на 64-битную платформу.

Основные задачи исследования.

1. Исследование потенциально опасных синтаксических конструкций и выражений в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных на 64-битные платформы.

2. Разработка правил диагностики выявленных потенциально опасных синтаксических конструкций в виде, доступном для автоматизированного обнаружения ошибок в программах; разработка методики создания новых правил диагностики ошибок миграции.

3. Реализация на основе разработанных правил статического анализатора кода, выявляющего соответствующие ошибки в исходном коде программ.

4. Сравнительный анализ разработанного статического анализатора кода с альтернативными инструментами.

5. Исследование применимости разработанного статического анализатора кода на примере диагностики ошибок в реальном программном продукте.

Методы исследования - методы теории множеств, теории формальных языков, теории графов, методы программирования на языках высокого уровня.

Научная новизна работы. Научная новизна работы заключается в следующем:

1. Проведено исследование и выполнена систематизация потенциально опасных синтаксических конструкций и выражений в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных на 64-битные платформы.

2. Впервые предложены классы для систематизации ошибок: приведения тепшге-типов, функции с параметрами теггшге-типов, синтаксические конструкции с тептаге-типами, использование «магических» чисел.

3. Разработаны формальные правила диагностики ошибок, возникающих при переносе кода на 64-бигные архитектуры, отличающиеся от эвристических, не описанных строго методов диагностики существующих программных продуктов.

4. Разработана методика создания новых правил диагностики ошибок в программах при переносе их кода с 32-битных на 64-битные платформы.

Положения, выносимые на защиту. На защиту выносятся следующие положения:

1. Систематизация потенциально опасных синтаксических конструкций в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных и на 64-битные платформы.

2. Классы ошибок, возникающих в приложениях при миграции на 64-битную платформу.

3. Формальные правила диагностики ошибок, возникающих при переносе кода на 64-битныс архитектуры.

4. Методика создания новых правил диагностики ошибок в программах при переносе их кода с 32-битных на 64-битные платформы. Практическая значимость. На основе сформулированных правил

реализован программный комплекс Viva64, подтверждающий применимость данных правил. С помощью него возможно автоматизировать процесс поиска ошибок в программах при разработке 64-битных версий приложений. Это позволяет выпускать новые 64-битные программы, во-первых, значительно быстрее, а, во-вторых, со значительно более высоким уровнем качества. На разработанный программный продукт получено свидетельство об официальной регистрации программы для ЭВМ.

Апробация работы. Основные результаты работы докладывались на конференциях: 1. Software Engineering Conference (Russia), 1-2 ноября 2007 г., Москва. 2. Технологии Microsoft в теории и практике программирования, 1-2 апреля 2008 г., Москва. 3. Ломоносов - 2008: Международная конференция студентов, аспирантов и молодых ученых, 7-11 апреля 2008 г., Москва. 4. Международная молодежная научная конференция «XXXIV Гагаринские чтения», 2008 г, Москва. 5. Всероссийская студенческая олимпиада «Конкурс компьютерных программ», 22-23 мая 2008 г., Вологда. 6. Математические методы в технике и технологиях - ММТТ-21, 27-31 мая 2008 г., Саратов. Работа обсуждалась на плановых семинарах: в Тульском государственном университете, кафедра автоматики и телемеханики, Тула, 29 марта 2007 г., 27 февраля 2009 г.; в Вычислительном центре Российской академии наук, отдел систем математического обеспечения, Москва, 15 мая 2008 г.; в Институте системного программирования Российской академии наук, отдел «Технологий программирования», Москва, 7 июня 2008 г., в

Научно-исследовательском вычислительном центре Московского государственного университета, Москва, 23 марта 2009 г.

Структура и объем работы. Диссертационная работа состоит из введения, четырех глаз, заключения и списка литературы. Объем работы составляет 135 страниц. Работа содержит 6 таблиц, 25 рисунков. Список литературы состоит из 102 наименований.

Основное содержание работы

Во введении говорится об актуальности задачи миграции приложений на 64-битные платформы и о необходимости иметь инструмент, позволяющий упростить этот процесс. Приведено состояние дел в индустрии разработки 64-битных приложений.

Первая глава посвящена различным способам решения задачи переноса приложений на 64-битные платформы, содержит их достоинства и недостатки.

Показано текущее положение в сфере создания программные продуктов. Крупные производители средств разработки пытаются в определенной степени облегчить труд программистов за счет нахождения компилятором некоторых ошибок, связанных с использованием 64 бит. Основная часть доступной документации, выпускаемой этими производителями, утверждает, что, за редким исключением, перекомпиляции и исправления найденных средством разработки ошибок будет достаточно для правильной работы приложения под 64-битной системой. Однако практика показывает, что такие ошибки - это только надводная часть айсберга, и, в действительности, проблем при переносе возникает- намного больше.

Приведены различные подходы к обеспечению корректности кода приложений, как поддающиеся автоматизации, так и нет. Среди неподдающихся автоматизации методов выделяют просмотр кода вручную, тестирование методом белого ящика и ручное тестирование. К автоматизируемым методам относятся статические анализаторы кода и тестирование методом черного ящика. С точки зрения исследования программ на предмет соответствия требованиям 64-битной архитектуры технология статического анализа наиболее целесообразна. Обоснован выбор в качестве основного инструмента статического анализа.

Во второй главе рассматривается статический анализ кода. Статический анализ - это способ проверки исходного кода программы на корректность. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языков Си и Си++ с точки зрения переноса программного кода на 64-битные системы. В данной главе акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода.

Отмечается, что в России понятие «статический анализ» вводится руководящим документом Гостехкомиссии России «Защита от несанкционированного доступа к информации. Часть 1. Программное обеспечение средств защиты информации. Классификация по уровню контроля отсутствия недекларированных возможностей» от 1999 г.

На основе потенциально-опасных конструкций, диагностирование которых необходимо, сформулированы следующие требования к анализатору кода:

1. Анализатор должен позволять осуществлять лексический разбор кода программы. Это необходимо для анализа использования потенциально опасных числовых констант.

2. Анализатор должен позволять осуществлять синтаксический разбор кода программы. Только на уровне лексического анализа невозможно выполнить все необходимые проверки. Стоит отметить сложность синтаксиса языков Си и, особенно, Си++. Из этого следует необходимость именно полноценного синтаксического анализа, а не, например, поиска на основе регулярных выражений.

3. Важной составляющей частью анализатора является анализ типов. Сложность типов в целевых языках такова, что подсистема вычисления типов является достаточно трудоемкой.

Показано, что конкретная архитектура реализации перечисленного функционала роли не играет.

На рисунке 1 приведены фазы работы традиционного компилятора:

Лексический анализа гор Синтаксический анализатор -> Семантический 1 . анализатор Г^ Генератор промежуточного кода Оптимизатор кода -*|генератор кода

Рисунок 1 - Фазы работы традиционного компилятора При этом для анализатора кода ни генерация кода, ни его оптимизация не требуются. То есть необходимо использовать часть компилятора, которая отвечает за лексический, синтаксический и семантический анализ.

На основе рассмотренных требований к разрабатываемой системе, предлагается следующая структура анализатора кода:

1. Модуль лексического анализа. Математическим аппаратом данного модуля являются конечные автоматы. В качестве результата лексического анализа получается набор лексем.

2. Модуль синтаксического анализа. Математический аппарат -грамматики; в результате работы получается дерево разбора кода.

3. Модуль семантического (контекстного) анализа. Математическим аппаратом также являются грамматики, но особого вида: либо специальным образом «расширенные» грамматики, либо так называемые атрибутные грамматики. Результатом является дерево разбора кода с проставленной дополнительной информацией о типах (либо атрибутированное дерево разбора кода).

4. Система диагностики ошибок. Это та часть анализатора кода, которая непосредственно отвечает за обнаружение потенциально опасных конструкций с тачки зрения переноса кода, на 64-битные системы. Именно разработке этой подсистемы и посвящена практическая часть данной работы.

Перечисленные модули являются стандартными для традиционных компиляторов (рисунок 2), точнее для той части компилятора, которая называется компилятор переднего плана (front-end compiler).

Ili'Oi'P ЭММЫ или ------

шщт

} Компилятор переднего плана г

Лексический анализ

Синтаксический анализ

Семантический анализ

Рисунок 2 - Схема компилятора переднего плана

Другая же часть традиционного компилятора (back-end compiler) отвечает за оптимизацию и кодогенерацию и в данной работе не рассматривается.

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

Реализация анализатора кода состоит из реализации двух частей (рисунок 3):

• компилятора переднего плана (front end compiler);

• подсистемы диагностики потенциально опасных конструкций.

Компилятор переднего плана

Исходный код

_Синтаксический

анализатор

Семитический анализатор

Подсистема диагностики скцибок 64-битной миграции

Список ошибок а коде

Рисунок 3 - Структура анализатора кода Для реализации компилятора переднего плана используется существующая открытая библиотека анализа Си++ кода ОрепС++, точнее ее модификация УтСоге. Это рукописный синтаксический анализатор кода, в котором осуществляется анализ методом рекурсивного спуска (рекурсивный нисходящий анализ) с возвратом. Выбор рукописного анализатора обусловлен сложностью языка Си++ и отсутствием готовых описанных

грамматик этого языка для использопания средств автоматического создания анализаторов кода типа YACC и Bison.

Третья глава посвящена обнаружению ошибок при переносе программ на 64-битные платформы. В главе рассмотрены программные ошибки, проявляющие себя при переносе Си++-кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.

Сформулированы правила диагностики потенциально опасных конструкций с точки зрения 64-бигных приложений, которые могут быть реализованы в любом статическом анализаторе кода.

Введено понятие iimemsize-тип», под которым будем понимать любой простой целочисленный тип, способный хранить в себе указатель и меняющий свою размерность при изменении разрядности платформы с 32-бит на 64-бита. Примеры memsize-типов: size_t, ptrdiff_t, все указатели, intptrj, INTPTR, DWORD_PTR.

Приведены примеры ошибок, возникающих при переносе кода с 32-битной на 64-битную систему.

Операции сдвига при невнимательном использовании могут служить источником ошибок во время перехода от 32-битной к 64-битной системе. Приведен пример функции, выставляющей в переменной типа memsize, указанный бит в 1:

ptrdiff_t SetBifcN(ptrdiff_t value, unsigned bitNura) { ptr<iiff_t mask = 1 « bitHum; return value I mask;

)

Приведенный код работоспособен на 32-битной архитектуре и позволяет выставлять биты с номерами от 0 до 31. После переноса программы на 64-битную платформу возникнет необходимость выставлять биты от 0 до 63. Следующий вызов функции SctBit\'(0, 32) вернет значение 1. Значение "1" имеет тип int и при сдвиге на 32 позиции произойдет переполнение.

Для исправления кода необходимо объявить константу "1" того же типа, что и переменная mask.

ptrdiff_t mask =- ptrdiff_t(l) « bitNum;

или

ptrdiff_t mask «= CONST3264(l) « bitNum;

Результат вызова неисправленной функции SetBitN(0, 31) будет OxffffiffiBOOOOOOO. Результатом выражения 1 « 31 является отрицательное число -2147483648. Это число представляется в 64-битной целой переменной как OxfffffffffiOOOOOOO. Следует помнить и учитывать эффекты сдвига значений различных типов.

Показана ошибка ei коде для работы с массивом, содержащим всего 5 элементов. Пример работоспособен в 32-битиом варианте и не работоспособен в 64-битном: int л - -2; unsigned В » 1;

int arrayt5J - { 1, 2, 3, 4, 5 ) ; int *ptr = array + 3;

ptr «» ptr + (А + В); // некорректное значение указателя

// на 64-битной платформе printf ("%i\nn, *;ptr) ; // ошибка доступа

// на 64-битной системе Вычисление выражения "ptr + (А + В)" происходит следующим образом:

• Согласно правилам языка Си++ переменная А типа int приводится к типу unsigned.

• В результате сложения А и В получается значение OxfFiTfffi" типа unsigned.

Затем осуществляется вычисление выражения "ptr + Oxfffffffiu". Результат зависит от размера указателя на данной архитектуре. Если сложение будет происходить в 32-битной программе, то данное выражение эквивалентно "ptr - 1" и успешно распечатается число 3.

В 64-битной программе к указателю прибавится значение OxiffiffiTfu, в результате чего указатель окажется далеко за пределами массива. При доступе к элементу по данному указателю ожидает ошибка.

Для предотвращения показанной ситуации, как и в первом случае, необходимо использовать, в арифметике с указателями только memsize-типы: 1 ptr - ptr + (ptrdiff_t(A) + ptrdiff_t (В)) ; ptrdiff_t A = -2; aize_t В =■ 1;

ptr я ptr + (A + B) ;

Одной из целей работы является формулирование правил диагностики потенциально опасных синтаксических конструкций при переносе программ на 64-битную платформу.

В работе приведено описание правил диагностики ошибок. Отмечается, что для анализа кода наиболее важна такая составляющая архитектуры, как модель данных. Модель данных - это соотношение размеров основных типов данных на конкретной архитектуре. Так, в версии Windows для 64-битной архитектуры используется модель данных LLP64, для 64-битной архитектуры Linux применяется модель LP64. В дальнейшем все правила приводятся для архитектуры LLP64, однако они абсолютно также применимы и к архитектуре LP64 после: замены определений основных базовых типов.

Введено множество Т- множество всех целочисленных базовых и производных от них типов языка Си++, в том числе указателей. Примеры int, bool, short int, size_t, void*, указатели на классы.

Введено множество S - множество размеров этих типов (и байтах), такое что V/ е Т 3 .v е S. Примеры: 1,2,4, 8, 16, 32,64.

Количество элементов в множествах 'Гя S различно, элементов п Г больше чем в S.

Введена операция соответствия при которой тип языка Си++ отображается в рамках 32-битной архитектуры в размер этого типа: tti32S = seS,

а также операция ftM, при которой тип языка отображается в рамках 64-битой архитектуры в размер этого типа: 11*iM S = а' е .S'. Формально операции выглядят так: it ,2: Т —> S и ftM: Т -> S.

Введено множество 7"- множество всех memsize-типов (типов переменной размерности) языка Си++, Т С.Т. Примеры size_t, ptrdifft, int*, void*.

Элементы множества 7" обладают тем свойством, что [( (|ы S -s eS

Другими словами, mcmsize-типы - это

{ГсГ,У/'еГ:/%2 5}.

Введено множество Тп с Т - это все типы данных, являющиеся 32-битными в рамках как 32-битной, так и 64-битной архитектуры, т.е. {Г„ с ТУ<„ е Гп- -Л Jin 5 = tn iL Л'}. Пример: int.

По аналогии введено множество Ты сТ- это все типы данных, являющиеся 64-битными в рамках как 32-битной, так и 64-битной архитектуры. Пример: long long.

Размеры всех memsize-типов на 32-битной архитектуре равны одному числу д=4 (4 байта):

V/' е 7" Эр е S, верно что t' flM S = q. Размеры всех memsize-типов на 64-битной архитектуре равны числу </'=8 (8 байт).

Введено множество Р - типы данных «указатели» в языке Си++, РсТ'.

Введено операция разыменования типа ——> следующим образом:

—^-»:Р->7\

Данная операция предназначена для получения типа данных, па который указывает указатель: р—'-—>1. Пример: int*—»int.

Введено множество D, состоящее из всех типов, производных от типа double. Пример: double, long double.

Все правила составлены по результатам изучения и обработки ошибок переноса кода на 64-битные платформы и представлены в виде функций, которые принимают некоторые аргументы (разные для разных правил), и возвращают true в случае некорректного кода и false, в случае корректного.

Приведение 32-битных целых типов к memsize-тнпам. Следует считать опасными конструкции явного и неявного приведения целых типов размерностью 32 бита к memsize-типам.

Примеры: unsigned а, с; size_t b = а; arraytc] = 1; Правило:

(true, если t, eTnvt1 е Т',

[false, иначе.

Приведение memsize-типов к целым 32-битным типам. Следует считать опасными конструкции явного и неявного приведения memsize-типов к целым типам размерностью 32 бита.

Пример: size_t а; unsigned b = а; Правило:

¡true, если f, 6 Т v t2 еТп, , иначе.

[false,

Memsize-тииы в виртуальных функциях. Опасными следует считать виртуальную функцию, удовлетворяющую ряду условий.

а). Функция объявлена в базовом классе и в классе-потомке.

б). „Типы аргументов функций не совпадают, но эквивалентны на 32-битной системе (например: unsigned, size_t) и не эквивалентны на 64-битной.

Пример:

class Base {

virtual void foo (size_t) ;

1 ;

class Derive : public Base (

virtual void foo(unsigned);

} ;

Кортежи Mt и Мг представляют собой наборы элементов из множества Т. Ошибочной следует считать ситуацию, при которой в 32-битном режиме кортежи М, и М2 совпадают, а в 64-битном - различны.

Правило:

F1(M„M1) =

'truc,если [((/«, )( ft,2 S ~(т2): itj2 s)v((/h,), iïm iï64 Л')]л

[(('", ), M'* Wi К S)v ((m, ),. Û64 5 = (m2), ft„ S)] i = l..n, false, иначе.

Mcmsize-типы в перегруженных функциях. Опасными следует считать вызов перегруженных функций с аргументом типа memsize. При этом функции должны быть перегружены для целых 32-х и 64-битных типов данных.

Пример:

void WriteValue(_int32);

void WriteValue(_int64);

ptrdiff_t value;

WriteValue(value);

Приведен вызов функции с п фактическими аргументами. Если существует 2 или более перегруженных функции с таким же количеством аргументов, то необходимо выполнить следующую проверку.

А - кортеж типов фактических параметров функции;

А, - кортеж типов формальных параметров первой перегруженной функции;

А2 - кортеж типов формальных параметров второй перегруженной функции;

Правило:

Гtrue, если {[(а, ), е Т„ v (а2 ),е7и]л \(а2 ), е- Т}2 v (а, ). eîjv F<(AVA2,A) = \ {(л)( 6 7"},I' =

[false, иначе.

Приведение типов указателей на memsize-типы. Опасным следует считать явное приведение одного типа указателя к другому, если один из них ссылается на 32-/64-битный тип, а другой на memsize-тип.

Пример:

int *array;

size_t *aizatPtr = (size_t *)(array);

Правило:

true, если {¡\ —/, e 7" v p2 ——> t2 e {'/')2 иГм))л

P's (Л.А) = | (p2 t, e Г v Pl e fa и Ты ft

false, иначе.

Приведение memsize-тнпов к double. Опасным следует считать явные и неявные приведения memsize-типа к double и наоборот.

Пример:

size_t a; double Ь = a; Правило:

[true,если(/, e üví.e 7")л(/2 e D vt{ e T'), [false, иначе.

Meinsize-типы в функции с переменным количеством аргументов.

Опасным следует считать передачу mcmsize-типа (кроме указателей) в функцию с переменным количеством аргументов.

Пример: siza_t а; printf ("tu" , а) ;

К - кортеж всех фактических типов, которые являются параметрами функции с переменным количеством аргументов. Пусть функция вызывается с т аргументами. Правило:

frite, если

kt е {Т'1 Р],i = 1 .Mí,

[false, иначе.

Опасные константы. Опасным следует считать использование констант определенного вида. Введено множество N целых чисел, которые можно записать средствами языка Си++. Введено также множество «опасных» констант C<zN. Примеры «опасных» констант: 4,32, Oxffffffff и т.д.

Правило:

„ , ч (true, если се С, [false, иначе.

Memsize-типы в объединениях. Опасным следует считать наличие в объединениях (union) членов memsize-типов.

Пример:

union PtrNumUnion { char *m_p; unsigned ш_а;

} u;

Все типы данных, входящие в union образуют кортеж U.

Правило:

{true,еслиUnT' * 0, F,(U) = i

[false,

иначе.

Исключения и inemsize-типы. Опасным следует считать бросание (throw) и обработку (catch) исключений с использованием memsize-типов.

Пример: char *pl, *р2;

try {

throw (pi - p2) ;

}

catch (int) { >

Правило:

[true, если t e T\ [Jalse, иначе.

Приведенные правила диагностики ошибок, хотя и реализованы в виде программного комплекса только для 64-битной Windows платформы, на практике могут использоваться для самого широкого круга платформ. Так, например, модификация определения типов переменной размерности позволяет практически без изменений применять данные правила для 64-битных Unix-систем.

Представленные правила диагностики сгруппированы в классы:

1. Операции приведения memsize-типов: приведение 32-битных целых типов к memsize-типам, приведение memsize-типов к целым 32-битным типам, приведение типов указателей на memsize-типы, приведение memsize-типов к double.

2. Функции с параметрами memsize-типов: memsize-типы в виртуальных функциях: memsize-типы в перегруженных функциях, memsize-типы в функции с переменным количеством аргументов.

3. Синтаксические конструкции с memsize-типами: memsize-типы в объединениях, исключения и memsize-тины.

4. Использование «магических» чисел: опасные константы. Приведенные в работе правила диагностики (и соответственно классы)

покрывают большинство ключевых слов языка программирования.

Разработана методика создания новых правил диагностики ошибок в программах при переносе их кода с 32-битных на 64-битные платформы, которая позволяет разрабатывать правила диагностики для ошибок, не представленных в работе. Методика включает следующие этапы:

1. Выделение фрагмента кода содержащего стабильно повторяющуюся ошибку, возникающую при переносе кода на 64-битные платформы, в виде отдельной программы.

2. Идентификация используемых в ошибочном коде синтаксических конструкций и, при необходимости, множеств типов данных, характерных для 64-битных систем.

3. Классификация ошибки на основе идентифицированных конструкций.

4. Формулировка нового правила обнаружения ошибок в виде логической функции но аналогии с другими правилами данного класса.

Рисунок 4 - Архитектура анализатора кода Viva64 Правила диагностики потенциально опасных конструкций с точки зрения 64-битных приложений реализованы в анализаторе кода Viva64, который обеспечивает поиск ошибок, специфичных для 64-битных Windows-приложений. Viva64 представляет собой lint-подобный статический анализатор Си/Син кода. Инструмент Viva64 интегрируется в среду разработки Visual Studio 2005/2008 и предоставляет удобный пользовательский интерфейс для проверки программных проектов.

Рассмотрено также применение анализатора Viva64 для проверки CAD-системы Leios Studio. Итальянская компания E.G.S. S.r.l. занимается разработкой решений в области моделирования трехмерных объектов на

Препроцесси-рованный кода

Дерево разбора

External Preprocessor

Интерфейс: VivaCore

Библиотека VivaCore

5. Реализация правило диагностики в статическом анализаторе в виде подпрограммы, которая будет вызываться при обходе построенного дерева кода.

В четвертой главе содержится описание программного комплекса для статического анализа 64-битных приложений, реализующего предложенные правила анализа, под названием \%а64. Архитектура анализатора кода приведена на рисунке 4.

базе триангулированных сеток. Для этой цели она использует собственную библиотеку компонентов Leios Components. Общий объем исходного кода Leios Studio составляет 13 мегабайт (440 ООО строк кода). Перенос такого объема кода на 64-битную систему вручную представляется затруднительным, особенно учитывая сложность математических алгоритмов. В связи с ростом обрабатываемых объемов данных, разумеется, ограничения на оперативную память 32-битной версии (не более 3 гигабайт) оказались недостаточными для современных проектов. Вручную просмотреть указанный объем кода практически невозможно. Поэтому целесообразно было использовать для миграции кода на 64-битную платформу анализатор кода Viva64.

Проведенный эксперимент показал, что программный продукт Viva64 позволяет сэкономить время, которое бы пришлось затратить на ручной просмотр кода, и главное не допустить новых программных ошибок, которые возможны в процессе миграции на новую платформу.

WINDOWS xS4

Модепь Qamm: ИРв4

UNIX x64

Kiùdàrib LP64

PC-Lint

PC4Jut

С-н-TesC

Viva64

Ш6Ш

3. Совместное использование типов double и memsize___

частично

äSS&ESäS частично

10. Индексация больших массивов

частично частично-

частично

частично

частично

18. Смещения в структурах

19. Использование типа long

20. Макросы

21. Переполнение массивов с явно заданными размерами____

Простота иастройки

fipocro проста

прост | СЛОЖНО;

7. Изменение типа массива

Критерий оценки

2. Магические константы

4. Операции сдвига

5. Упаковка указателей

11. Смешенное использование простых и тегг^ге типов____

12. Вызовы функций

13. Возврат значения из функции

14. Обработка исключений

15. Явное приведение типов

16. Перегруженные функции

7. Битовые поля

1. Функции с переменным количеством аргументов______

6. Memsize-типы в union

8. Виртуальные функции

9. Арифметика с указателями

Рисунок 5 - Сравнение статических анализаторов с точки зрения поиска специфических для 64-битного кода ошибок

Проведено исследование и сравнение анализатора Viva64 и других продуктов, обладающими схожими функциональными возможностями (рисунок 5). Выполнено сравнение трех наиболее распространенных анализаторов, реализующих проверки 64-битного кода: Viva64, Parasoft C++Test, Gimpel Software PC-Lint.

Указанные в таблице критерии оценок - это способность анализатора обнаруживать потенцигшьные ошибки миграции кода на 64-битные системы. Напротив каждого типа ошибки укачано «Да», если тот или иной анализатор обнаруживает ее в коде и «Нет», если не обнаруживает. Из рисунка видно, что разработанный программный продукт Viva64 превосходит аналоги по количеству диагностируемых ошибок.

Разработанный программный комплекс Viva64 внедрен в ООО «СиПроВер». Теоретические результаты работы используются в учебном процессе ТулГУ. Акты внедрения и полученные свидетельства о регистрации программы для ЭВМ приведены в приложении. В заключении приведены основные результаты работы.

Основные результаты работы

1. Проведено исследование и выполнена систематизация потенциально

' опасных синтаксических конструкций и выражений в коде программ

на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных на 64-битные платформы.

2. Впервые предложены классы для систематизации ошибок: приведения memsize-типов, функции с парамеграми memsize-типов, синтаксические конструкции с memsize-типами, использование «магических» чисел.

3. Разработаны правила диагностики выявленных потенциально опасных синтаксических конструкций в виде, доступном для автоматизированного обнаружения ошибок в программах.

4. Разработана методика создания новых прави л диагностики ошибок в программах • при переносе их кода с 32-битных на 64-битные платформы.

5. На основе разработанных правил реализован программный продукт статический анализатор кода Viva64, выявляющий ошибки миграции в исходном коде программ. Выполнено сравнение разработанного статического анализатора кода с альтернативными инструментами. Экспериментальная проверка показала, что основанный на представленных в работе правилах диагностике программный комплекс Viva64 обнаруживает большое количество ошибок миграции. Практические результаты работы внедрены в ООО «СиПроВер».

6. Теоретические результаты работы используются в учебном процессе на кафедре автоматики и телемеханики Тульского государственного университета в рамках дисциплины «Объектно-ориентированное программирование».

Публикации автора по теме диссертации

По теме диссертации опубликованы следующие печатные работы:

1. Рыжков, Е.А. 20 ловушек переноса С++-кода на 64-битную платформу / А.Н. Карпов, Е.А. Рыжков // RSDN Magazine. - 2007. - №1. - С.65-75.

2. Колосов, А.П. 32 подводных камня ОрепМР при программировании на С++ / А.П. Колосов, Е.А. Рыжков, А.Н. Карпов // RSDN Magazine. -2008. -№2. -С.3-17.

3. Рыжков, Е.А. VIVA64, система выявления ошибок в исходном коде программ при переносе ПО на 64-битные платформы / А.П.. Колосов, Е.А. Рыжков // Ломоносов - 2008: Материалы XV Международной конференции студентов, аспирантов и молодых ученых: секция "Вычислительная математика и кибернетика"; 7-11 апреля; Москва, МГУ имени М.В. Ломоносова, факультет ВМиК: Сборник тезисов . -М.: Издательский отдел факультета ВМиК МГУ, 2008. - С.43-44.

4. Рыжков, Е.А. Viva64, система выявления ошибок в исходном коде программ при переносе ПО на 64-битные платформы / А.П. Колосов, Е.А. Рыжков // XXXIV Гагаринские чтения. Научные труды Международной молодежной научной конференции в 8 томах. Москва, 1-5 апреля 2008 г. / отв. редактор Н.И. Сердюк. - М: МА'ГИ, 2008.-Т.4.- С. 37-38.

5. Рыжков, Е.А. Применение статического анализа при разработке программ / А.П. Колосов, Е.А. Рыжков // Известия ТулГУ. Технические науки. - 2008. - Вып. 3. -С. 185-190.

6. Рыжков, Е.А. Подходы к верификации и тестированию 64-битных приложений / Е.А. Рыжков, А.Н. Карпов // Информационные технологии. - 2008. - №7. - С.41-45.

7. Рыжков, Е.А. Применение технологии статического анализа кода в современном процессе разработки программ / Е.А. Рыжков, А.Н. Карпов // Сборник трудов конференции "Software Engineering Conference (Russia) 2007 - SEC(R)-2007". - 2007. - C.240-245.

8. Рыжков, Е.А. Применение технологии статического анализа кода при разработке параллельных программ / Е.А Рыжков, О.С. Середин // Известия ТулГУ. Технические науки. - 2008. - Вып. 3. -С. 191-196.

9. Рыжков, Е.А. Система автоматического обнаружения ошибок в исходном коде программ при создании 64-битного ПО (Viva64) / Е.А. Рыжков, А.П. Колосов // Технологии Microsoft в теории и практике программирования. Труды V Всероссийской конференции студентов,

аспирантов и молодых ученых. Центральный регион. - М.: Вузовская книга, 2008,-С.57-58. Ю.Рыжков, Е.А. Сущность библиотеки анализа кода VivaCore / Е.А. Рыжков, А.Н. Карпов // RSDN Magazine. - 2008. - №1. - С.56-63. Получены свидетельства об официальной регистрации программы для

ЭВМ:

1. Авторы и правообладатели: Карпов Андрей Николаевич, Рыжков Евгений Александрович. Свидетельство об официальной регистрации программ для ЭВМ N2007614164, «Вива64». Зарегистрировано в Реестре программ! для ЭВМ 28 сентября 2007 г.

2. Авторы и правообладатели: Карпов Андрей Николаевич, Рыжков Евгений Александрович. Свидетельство об официальной регистрации программ для ЭВМ N2008610480, «Библиотека анализа кода VivaCore». Зарегистрировано в Реестре программ для ЭВМ 25 января 2008 г.

3. Авторы: Карпов Андрей Николаевич, Рыжков Евгений Александрович. Правообладатель: Общество с ограниченной ответственностью «Системы программной верификации». Свидетельство об официальной регистрации программ для ЭВМ N2008612845, «Вива64 2.0». Зарегистрировано в Реестре программ для ЭВМ 29 мая 2008 г.

Изд. лиц. ЛР № 020300 от 12.02.97. Подписано в печать/Д С?Х 09 Формат бумаги 60x84 '/и- Бумага офсетная. Усл. печ. л /, Х- . Уч.-изд. л. Р • Тираж /СО экз. Заказ О/О Тульский государственный университет 300600, г. Гула, просп. Ленина, 92 Отпечатано » Издательстве ТулГУ 300600, г. Т;;ла, ул. Болдина, 151

Оглавление автор диссертации — кандидата технических наук Рыжков, Евгений Александрович

Введение.

Глава 1. Постановка задачи переноса приложений на 64-битные платформы

1.1 Проблема переноса приложений на 64-битные платформы.

1.2 Способы тестирования приложений для подтверждения корректности переноса кода.

1.2.1 Просмотр кода.

1.2.2 Статический анализ кода.

1.2.3 Динамический анализ кода.

1.2.4 Метод белого ящика.

1.2.5 Метод черного ящика.

1.2.6 Ручное тестирование.

1.3 Основные задачи исследования.

Глава 2. Статический анализ кода как наиболее удобное решение для проверки корректности 64-битных программ.

2.1 Применение статического анализа кода при разработке программ.

2.1.1 Процесс анализа.

2.1.2 Дерево кода.

2.1.3 Методы статического анализа.

2.2 Разработка статического анализатора: требования, архитектура, реализация.

2.2.1 Требования к анализатору кода.

2.2.2 Архитектура анализатора кода.

2.2.3 Реализация анализатора кода.

Глава 3. Обнаружение ошибок при переносе программ на 64-битные платформы.

3.1 Примеры потенциально-опасных конструкций в коде программ на языке Си++.

3.1.1 Использование функций с переменным количеством аргументов.

3.1.2 Магические константы.

3.1.3 Хранение в double целочисленных значений.

3.1.4 Операции сдвига.

3.1.5 Упаковка указателей.

3.1.6 Memsize-типы в объединениях.

3.1.7 Изменение типа массива.

3.1.8 Виртуальные функции с аргументами типа memsize.

3.1.9 Сериализация и обмен данными.

3.1.10 Битовые поля.

3.1.11 Адресная арифметика с указателями.

3.1.12 Индексация массивов.

3.1.13 Смешанное использование простых целочисленных типов и memsize-типов.

3.1.14 Неявные приведения типов при использовании функций.

3.1.15 Перегруженные функции.

3.1.16 Выравнивание данных.

3.1.17 Исключения.

3.1.18 Использование устаревших функций и предопределенных констант

3.1.19 Явные приведения типов.

3.2 Правила статического анализа кода для диагностики потенциально-опасных конструкций.

3.2.1 Приведение 32-битных целых типов к memsize-типам.

3.2.2 Приведение memsize-типов к целым 32-битным типам.

3.2.3 Memsize-типы в виртуальных функциях.

3.2.4 Memsize-типы в перегруженных функциях.

3.2.5 Приведение типов указателей на memsize-типы.

3.2.6 Приведение memsize-типов к double.

3.2.7 Memsize-типы в функции с переменным количеством аргументов

3.2.8 Опасные константы.

3.2.9 Memsize-типы в объединениях.

3.2.10 Исключения и memsize-типы.

3.3 Методика создания новых правил диагностики ошибок.

Глава 4. Программный комплекс для статического анализа 64-битных приложений Viva64.

4.1 Обзор программы Viva64.

4.2 Сравнение диагностических возможностей современных анализаторов при проверке 64-битного кода.

4.3 Применение Viva64 для проверки CAD-системы Leios Studio.

4.3.1 Библиотека компонентов Leios Components.

4.3.2 Программный интерфейс для работы с облаками точек и триангулированными сетками.

4.3.3 Библиотека подгонки деталей.

4.3.4 Библиотека обработки граней и ребер.

4.3.5 Необходимость миграции библиотеки компонентов на 64-битную платформу.

4.3.6. Участие компании ООО «СиПроВер» в миграции библиотеки компонентов.

Введение 2009 год, диссертация по информатике, вычислительной технике и управлению, Рыжков, Евгений Александрович

В 2003-2004 годах в мире персональных компьютеров началась очередная революция. Она захватила все без исключения компьютеры, операционные системы, прикладные программы. Стремительно начавшись, она должна была поднять вычислительную технику на очередной уровень уже к 2005-2006 годам. Однако на момент написания этих строк (заканчивается 2008 год) революция так и не достигла своего пика. Речь идет о переходе на 64-битные технологии. Давайте посмотрим, с чего начался этот переход, как продолжался и каково состояние дел сейчас.

Вообще 64-битные технологии в мире не являлись новинкой даже в 2003 году. На платформах альтернативных современным персональным компьютерам 64-битные решения существуют достаточно давно. Однако только в 2003 появились первые 64-битные процессоры для персональных компьютеров. Эти процессоры представляли собой реализацию технологий AMD64 компании AMD и ЕМ64Т компании Intel. Причина появления новых 64-битных процессоров банальна. У старых 32-битных процессоров существует принципиальное ограничение - они могут работать только с четырьмя гигабайтами оперативной памяти, при этом каждому отдельному пользовательскому приложению доступно не более двух гигабайт. Пока подобные ограничения мешали лишь в профессиональной среде (дизайнерам, инженерам и т.п.), то вопрос решался просто. Специалисты обычно использовали нестандартную вычислительную технику, и это снимало проблемы. Однако когда обыкновенные игры для персональных компьютеров подобрались к пределу в два гигабайта оперативной памяти уже и «домашним» пользователям понадобились новые процессоры.

Естественно рынок прекрасно подготовился к новым потребностям пользователей. В 2003 году только появились первые образцы 64-битных процессоров, а в 2005 году уже нельзя было купить в магазине не 64-битный процессор. Казалось бы, проблема решена? К сожалению, для того чтобы преимущества 64-битных систем стали доступны пользователям, надо иметь в компьютере четыре гигабайта оперативной памяти (или более). А на 2005 год наиболее распространенной конфигурацией были машины с одним, максимум двумя гигабайтами.

К концу 2006 года оперативная память в обыкновенных персональных компьютерах уже стала приближаться к трем-четырем гигабайтам. Казалось бы, уж теперь самое время оценить преимущества 64-битных компьютеров. Но для того, чтобы это сделать, нужно иметь еще и 64-битную операционную систему. К счастью, Microsoft выпустила 64-битные версии Windows ХР и Windows Server 2003 задолго до этого. Но на компьютерах пользователей эти операционные системы не спешили появляться. И эта ситуация сохраняется в настоящем времени. Практически на всех пользовательских компьютерах установлены 32-битные операционные системы семейства Windows ХР и Windows Vista. Это объясняется отсутствием (как тогда, так и сейчас) 64-битных драйверов и что более важно недостаточным количеством 64-битных программ. Ведь хотя 32-битные программы и работают на 64-битных операционных системах почти без проблем, но больший объем оперативной памяти могут использовать только 64-битные программы.

Именно в 64-битных программах и кроется объяснение того факта, что до сих пор большинство пользователей не могут сказать, что используют 64-битную инфраструктуру при работе на компьютере, несмотря на все ее преимущества. Как оказалось, процесс переноса программ с 32-битных систем на 64-битные на практике не так уж и прост. И именно разработчики программ оказались «виноваты» в отсутствии 64-битных программ. Разберемся, в чем же дело.

Для того чтобы выпустить 64-битную версию программы ее нужно перекомпилировать специальным компилятором, который сгенерирует 64-битный код. Какие-то компании (как например Microsoft, Intel) выпустили 64-битные компиляторы довольно оперативно. Это значит, что уже в 2005 году эти компиляторы были доступны разработчикам. Другие же (как например Borland) до сих пор не выпустили 64-битных версий своих средств разработки. Это приводит к тому, что программы, разработанные в среде Borland С++, никак не могут быть скомпилированы для работы в 64-битном окружении.

Но поскольку многие программы разрабатываются с использованием средств от Microsoft и Intel, то, казалось бы, 64-битных программ должно быть все-таки довольно много? Увы, опыт многих компаний, занимающихся разработкой программного обеспечения, показал, что недостаточно просто перекомпилировать программу новым 64-битным компилятором.

Дело в том, что в программах, скомпилированных для 64-битных платформ, могут проявляться неожиданные (даже для разработчиков программ) ошибки. Приведем несколько примеров.

Будучи перекомпилированной под 64 бита обычная пользовательская программа делала вид, что прекрасно работает. До тех пор, пока пользователь не нажал клавишу F1. Вместо ожидаемого открытия справочной системы на экране появилось окошко с короткой фразой про невозможность загрузить справку. Казалось бы, какое отношение имеет справочная система к разрядности процессора? Но дело оказалось действительно в некорректной работе программы на новой системе. Поведение функций, отвечающих за справочную систему, изменилось и справка просто «сломалась».

Другой пример. Приложение для визуализации данных, в котором используемый объем оперативной памяти приближался к двум гигабайтам, было естественным кандидатом на 64-битную версию. Новая 64-битная версия работала прекрасно, пользователи не видели никаких проблем. До тех пор, пока кто-то не захотел построить изображение по данным, превышающим несколько гигабайт. Картинка была построена, но на экране показалось. только половина изображения. Почему? Некорректная работа в программе с большими объемами данных.

Незнакомый с индустрией разработки программных систем человек может задаться вопросом: «Почему подобные ошибки в программах не выявляются на этапе тестирования?» Ответ на этот вопрос не совсем очевиден. Дело в том, что существующие системы внутренних и внешних тестов программного обеспечения не позволяют выявить ошибки, характерные именно для 64-битных систем. Ведь по своей сути часто тесты должны выполняться очень быстро, поэтому, скажем, тестировать обработку нескольких гигабайт данных в таких тестах не будут. Инструменты для разработчиков долгое время также оставались в стороне от проблемы 64-битного программного обеспечения. Специализированные инструменты начали появляться относительно недавно, в 2007 году. В разработке одного из таких инструментов и принимает участие автор данной работы.

О каких инструментах идет речь? Есть специальный класс программ, называемый статические анализаторы кода. Этот анализатор кода разбирает» исходный код программы и выдает программисту список потенциальных проблем в коде. После чего программист их исправляет, и программа уже получается готовой к выходу в 64-битный мир.

Настоящая работа посвящена как раз исследованию и реализации такого инструмента под названием У-1Уа64, разрабатываемому в компании ООО «СиПроВер».

Анализатор кода У1уа64 предназначен для диагностики ошибок в исходном коде программ, проявляющихся при миграции приложений на 64-битные платформы. При переносе программ на 64-битные платформы, в программах проявляются ошибки. Эти ошибки были допущены при разработке программ, намного раньше процесса миграции на 64-битные системы. Однако в рамках 32-битной платформы они не проявлялись и стали проявляться только на 64-битной платформе. Анализатор УЬ/а64 предназначен для выявления подобных ошибок в программах. Основное содержание данной работы - это формулировка правил диагностики ошибок и реализация системы автоматической диагностики.

Анализатор У1уа64 разработан для анализа программ на языках программирования Си и Си++. Выбор этих языков обусловлен тем, что с одной стороны, много коммерческих программных продуктов реализованы на этих языках. С другой стороны, данные языки наиболее сильно подвержены возможности программисту написать код с ошибками, так как они являются достаточно низкоуровневыми языками.

Вопросами повышения качества программного обеспечения занимаются С. Макконнел, М. Фаулер, С. Майерс, в России - В.В. Липаев. Проблемами 64-битного кода - М. Питрек, А.Зейчик, М. Уолл, К.С. Гэтлин,

А. МакНаутон. Разработкой статических анализаторов занимаются С. Гутз, А. Колава. Недостатком работ данных авторов является тот факт, что они не уделяли внимание автоматизированному обнаружению ошибок в 64-битных приложениях. Они обращали свое внимание либо на различные методики обучения программистов написанию качественного кода, либо на другие способы повышения качества. При этом автоматизированное обнаружение ошибок рассматривалось лишь для наиболее традиционных ошибок программистов - 64-битный код оставался в стороне.

Объектом исследования является процедура миграции (переноса) программного обеспечения с 32-разрядной на 64-разрядную платформу.

Предметом исследования являются правила диагностики потенциально опасных синтаксических конструкций в коде программ на языках Си и Си++.

Цель диссертации. Целью работы является повышение качества программных продуктов и сокращение количества программных ошибок во время процедуры миграции программного обеспечения на 64-битные платформы. Для достижения этой цели разработаны правила диагностики потенциально опасных синтаксических конструкций и реализован программный продукт в виде статического анализатора кода для проверки корректности процесса переноса программ на языках Си и Си++ на 64-битную платформу.

Основные задачи исследования.

1. Исследование потенциально опасных синтаксических конструкций и выражений в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных на 64-битные платформы.

2. Разработка правил диагностики выявленных потенциально опасных синтаксических конструкций в виде, доступном для автоматизированного обнаружения ошибок в программах; разработка методики создания новых правил диагностики ошибок миграции.

3. Реализация на основе разработанных правил статического анализатора кода, выявляющего соответствующие ошибки в исходном коде программ.

4. Сравнительный анализ разработанного статического анализатора кода с альтернативными инструментами.

5. Исследование применимости разработанного статического анализатора кода на примере диагностики ошибок в реальном программном продукте.

Методы исследования - методы теории множеств, теории формальных языков, теории графов, методы программирования на языках высокого уровня.

Научная новизна работы. Научная новизна работы заключается в следующем:

1. Проведено исследование и выполнена систематизация потенциально опасных синтаксических конструкций и выражений в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных на 64-битные платформы.

2. Впервые предложены классы для систематизации ошибок: приведения тепшге-типов, функции с параметрами тепшге-типов, синтаксические конструкции с тепшге-типами, использование «магических» чисел.

3. Разработаны формальные правила диагностики ошибок, возникающих при переносе кода на 64-битные архитектуры, отличающиеся от эвристических, не описанных строго методов диагностики существующих программных продуктов.

4. Разработана методика создания новых правил диагностики ошибок в программах при переносе их кода с 32-битных на 64-битные платформы.

Положения, выносимые на защиту. На защиту выносятся следующие положения:

1. Систематизация потенциально опасных синтаксических конструкций в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных и на 64-битные платформы.

2. Классы ошибок, возникающих в приложениях при миграции на 64-битную платформу.

3. Формальные правила диагностики ошибок, возникающих при переносе кода на 64-битные архитектуры.

4. Методика создания новых правил диагностики ошибок в программах при переносе их кода с 32-битных на 64-битные платформы.

Практическая значимость. На основе сформулированных правил реализован программный комплекс У1уа64, подтверждающий применимость

13 данных правил. С помощью него возможно автоматизировать процесс поиска ошибок в программах при разработке 64-битных версий приложений. Это позволяет выпускать новые 64-битные программы, во-первых, значительно быстрее, а, во-вторых, со значительно более высоким уровнем качества. На разработанный программный продукт получено свидетельство об официальной регистрации программы для ЭВМ.

Апробация работы. Основные результаты работы докладывались на конференциях: 1. Software Engineering Conference (Russia), 1-2 ноября 2007 г., Москва. 2. Технологии Microsoft в теории и практике программирования, 1-2 апреля 2008 г., Москва. 3. Ломоносов - 2008: Международная конференция студентов, аспирантов и молодых ученых, 7-11 апреля 2008 г., Москва. 4. Международная молодежная научная конференция «XXXIV Гагаринские чтения», 2008 г, Москва. 5. Всероссийская студенческая олимпиада «Конкурс компьютерных программ», 22-23 мая 2008 г., Вологда. 6. Математические методы в технике и технологиях - ММТТ-21, 27-31 мая 2008 г., Саратов. Работа обсуждалась на плановых семинарах: в Тульском государственном университете, кафедра автоматики и телемеханики, Тула, 29 марта 2007 г., 27 февраля 2009 г.; в Вычислительном центре Российской академии наук, отдел систем математического обеспечения, Москва, 15 мая 2008 г.; в Институте системного программирования Российской академии наук, отдел «Технологий программирования», Москва, 7 июня 2008 г., в Научно-исследовательском вычислительном центре Московского государственного университета, Москва, 23 марта 2009 г.

Публикации. По теме диссертации опубликовано 10 печатных работ.

Структура и объем работы. Диссертационная работа состоит из введения, четырех глав, заключения и списка литературы. Объем работы

Заключение диссертация на тему "Статический анализ кода для автоматизированного обнаружения ошибок при переносе программ на 64-битные платформы"

Основные результаты работы:

1. Проведено исследование и выполнена систематизация потенциально опасных синтаксических конструкций и выражений в коде программ на языках программирования Си и Си++, которые могут привести к ошибкам в программах при переносе их кода с 32-битных на 64-битные платформы.

2. Впервые предложены классы для систематизации ошибок: приведения тепшге-типов, функции с параметрами тепшге-типов, синтаксические конструкции с тепшге-типами, использование «магических» чисел.

3. Разработаны правила диагностики выявленных потенциально опасных синтаксических конструкций в виде, доступном для автоматизированного обнаружения ошибок в программах.

4. Разработана методика создания новых правил диагностики ошибок в программах при переносе их кода с 32-битных на 64-битные платформы.

5. На основе разработанных правил реализован программный продукт статический анализатор кода У1уа64, выявляющий ошибки миграции в исходном коде программ. Выполнено сравнение разработанного статического анализатора кода с альтернативными инструментами. Экспериментальная проверка показала, что основанный на представленных в работе правилах диагностике программный комплекс У1уа64 обнаруживает большое количество ошибок миграции. Практические результаты работы внедрены в ООО «СиПроВер».

6. Теоретические результаты работы используются в учебном процессе на кафедре автоматики и телемеханики Тульского государственного университета в рамках дисциплины «Объектно-ориентированное программирование».

Заключение

Библиография Рыжков, Евгений Александрович, диссертация по теме Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей

1. Ахо, А. Компиляторы: принципы, технологии и инструменты / А. Ахо, Р. Сети, Д. Ульман; пер. с англ. М.: Издательский дом «Вильяме», 2003.-768 с.

2. Бек, J1. Введение в системное программирование / JI. Бек. -М.:Мир, 1988.-448 с.

3. Бен-Ари, М. Языки программирования. Практический сравнительный анализ / М. Бен-Ари. М.:Мир, 2000. - 366 с.

4. Вайнгаартен, Ф. Трансляция языков программирования / Ф. Вайнгаартен. М.: Мир, 1977. - 190 с.

5. Волкова, И.А. Формальные грамматики и языки. Элементы теории трансляции / И.А. Волкова, Т.В. Руденко. М.: Диалог-МГУ, 1999. -62 с.

6. Гетц, Б. Избавьтесь от ошибок Электронный ресурс. / Б. Гетц. -Электрон, текстовые дан. 2007. - Режим доступа: http://www.ibm.com/developerworks/ru/library/i-itp06294/index.html, свободный.

7. Гордеев, A.B. Системное программное обеспечение / A.B. Гордеев, А.Ю. Молчанов. СПб.: Питер, 2001. - 736 с.

8. Грис, Д. Конструирование компиляторов для цифровыхвычислительных машин / Д. Грис. М.: Издательство «Мир», 1975. -544 с.

9. Ю.Донован, Д. Системное программирование / Д. Донован. -М.:Мир, 1975.-500 с.

10. П.Зуев, Е.А. Принципы и методы создания компилятора переднего плана Стандарта Си++: дис. . канд. техн. наук : 05.13.11 / Е.А. Зуев. М., 1999.- 174 с.

11. Зуев, П. О компьютерной безопасности Электронный ресурс. / П. Зуев. Электрон, текстовые дан. - 2003. - Режим доступа: http://www.imm.uran.ru/RUS/WIN/PUBLIC/MISC/zuev, свободный.

12. Карпов, А.Н. 20 ловушек переноса С++-кода на 64-битную платформу / А.Н. Карпов, Е.А. Рыжков // RSDN Magazine. 2007. - №1. - С.65-75.

13. Касьянов, В.Н. Методы построения трансляторов / В.Н. Касянов, И.В. Поттосин. Новосибирск: Наука, 1986. - 330 с.

14. Кован, К. Безопасность систем с открытым кодом Электронный ресурс. / К. Кован. Электрон, текстовые дан. - 2003. - Режим доступа: http://www.osp.ru/os/2003/07-08/183264, открытый.

15. Колосов, А.П. 32 подводных камня ОрепМР при программировании на С++ / А.П. Колосов, Е.А. Рыжков, А.Н. Карпов // RSDN Magazine. -2008. №2. - С.3-17.

16. Колосов, А.П. Применение статического анализа при разработке программ / А.П. Колосов, Е.А. Рыжков // Известия ТулГУ. Технические науки. 2008. - Вып. 3. -С. 185-190.

17. Колосов, А.П. Система автоматического обнаружения ошибок в исходном коде программ при создании 64-битного ПО (Viva64) / А.П. Колосов, Е.А. Рыжков // Сборник тезисов X Всероссийской студенческой олимпиады «Конкурс компьютерных программ». 2008.

18. Костельцов, А. В. Построение интерпретаторов и компиляторов: Использование программ Bison, Вуасс, Zubr / А. В. Костельцов. М.: Наука и техника, 2001. - 224 с.

19. Креншоу, Д. Пишем Компилятор Электронный ресурс. / Д. Креншоу.- Электрон, текстовые дан. 2000. Режим доступа: http://www.kulichki.net/kit/crenshaw/tutorl.html, свободный.

20. Кротов, А.Н. Принципы реализации семантики языка Си++ в системе ЗС++: дис. . канд. техн. наук : 05.13.11 / А.Н. Кротов. М., 2002. -154 с.

21. Лавров, С.С. Программирование. Математические основы, средства, теория / С.С. Лавров. СПб.: БХВ-Петербург, 2002. - 320 с.

22. Льюис, Ф. Теоретические основы проектирования компиляторов / Ф. Льюис, Д. Розенкранц, Р. Стирнз. М.:Мир, 1979. - 654 с.

23. Макконнелл, С. Совершенный код / С. Макконнелл. СПб.: Питер, 2007. -896 с.

24. Пратт, Т. Языки программирования: разработка и реализация / Т. Пратт, М. Зелковиц. СПб.: Питер, 2002. - 688 с.

25. Рейуорд-Смит, В.Дж. Теория формальных языков. Вводный курс / В. Дж. Рейуорд-Смит. -М.: Радио и связь, 1988. 128 с.

26. Роббинс, Д. Отладка \¥тс1ол¥8-приложений / Д. Роббинс. -М.: ДМК Пресс, 2001.- 448 с.

27. Рыжков, Е.А. Применение технологии статического анализа кода в современном процессе разработки программ / Е.А. Рыжков, А.Н.

28. Карпов // Сборник трудов конференции "Software Engineering Conference (Russia) 2007 SEC(R)-2007". - 2007. - C.240-245.

29. Рыжков, E.A. Применение технологии статического анализа кода при разработке параллельных программ / Е.А Рыжков, О.С. Середин // Известия ТулГУ. Технические науки. 2008. - Вып. 3. -С. 191-196.

30. Рыжков, Е.А. Сущность библиотеки анализа кода VivaCore / Е.А. Рыжков, А.Н. Карпов // RSDN Magazine. 2008. - №1. - С.56-63.

31. Самофалов, В.В. Технология отладки программ для машин с массовым параллелизмом / В.В. Самофалов, A.B. Коновалов // Вопросы атомной науки и техники. Сер. Математическое моделирование физических процессов. 1996. - Вып.4. - С.52-56.

32. Себеста, Р. Основные концепции языков программирования / Р. Себеста. М.: Издательский дом «Вильяме», 2001. - 672 с.

33. Серебряков, В.А. Основы конструирования компиляторов / В.А. Серебряков, М.П. Галочкин М.: Едиториал УРСС, 2001. - 224 с.

34. Хантер, Р. Основные концепции компиляторов / Р. Хантер. М.: Издательский дом «Вильяме», 2002. - 256 с.

35. Adiga, H.S. Porting Linux applications to 64-bit systems Электронный ресурс. / H.S. Adiga. Электрон, текстовые дан. - 2006. - Режим доступа: http://www.ibm.com/developerworks/library/l-port64.html, свободный.

36. Artho, С. Applying Static Analysis to Large-scale, Multi-threaded Java Programs Электронный ресурс. / С. Artho, A. Biere. Электрон, текстовые дан. - 2001. — Режим доступа: http://staff.aist.go.ip/c.artho/papers/ArthoBiere-ASWEC2001.pdf, свободный.

37. Bagge, O.S. CodeBoost: A Framework for Transforming С++ Programs Электронный ресурс. / О. S. Bagge. Электрон, текстовые дан. - 2003. - Режим доступа: http://www.codeboost.org/papers/codeboost-thesis-bagge.ps.gz, свободный.

38. Bailey, A. AMD64 and the New Math Электронный ресурс. / A. Bailey. -Электрон, текстовые дан. 2006. - Режим доступа: http://developer.amd.com/documentation/articles/Pages/62720069.aspx, свободный.

39. Bailey, A. Tools and Techniques for Developing 64-Bit Linux Software. Электронный ресурс. / A. Bailey. Электрон, текстовые дан. - 2006. -Режим доступа:http://developer.amd.com/documentation/articles/Pages/91420064Q.aspx, свободный.

40. Binstock, A. Porting to 64-Bit Intel® Architecture Электронный ресурс. / A. Binstock. Электрон, текстовые дан. - 2008. - Режим доступа:http://softwareintelxom/en-us/articles/porting-to-64-bit-intel-architecture/,свободный.

41. Bruner, R. x86-64 Architecture & Software Porting. Электронный ресурс. / R. Bruner. Электрон, текстовые дан. - 2002. - Режим доступа: http://www.amd.com/usen/assets/content type/DownloadableAssets/dwamd Software Porting -RichBrunner.pdf, свободный.

42. Carter, С. C/C++ Compiler Switches for Fast, Portable 64-Bit Code . Электронный ресурс. / С. Carter. Электрон, текстовые дан. - 2005. -Режим доступа:http://developer.amd.eom/documentation/articles/pages/372005120.aspx, свободный.

43. Christopher, C.N. Evaluating Static Analysis Frameworks Электронный ресурс. / C.N. Christopher. Электрон, текстовые дан. - 2006. - Режим доступа: http://www.cs.cmu.edu/~aldrich/courses/654/tools/christopher-analysis-frameworks-06.pdf, свободный.

44. Farrell, J.A. Compiler Basics Электронный ресурс. / J. A. Farrell. -Электрон. текстовые дан. 1995. - Режим доступа: http://www.cs.man.ac.uk/~pii/farrell/compmain.html, свободный.

45. Gatlin, К. Windows Data Alignment on IPF, x86, and x64 Электронный ресурс. / К. S. Gatlin. Электрон, текстовые дан. - 2006. - Режим доступа: http://msdn.microsoft.com/en-us/library/aa290049.aspx, свободный.

46. Ganssle, J. The value proposition unfulfilled Электронный ресурс. / J. Ganssle. - Электрон, текстовые дан. - 2004. - Режим доступа: http://www.embedded.com/columns/breakpoint/47101904? requestid^ 101 94, свободный.

47. Giesen D. Philosophy and practical implementation of static analyzer tools Электронный ресурс. / D. Giesen. Электрон, текстовые дан. - 1998. -Режим доступа: http://www.dse.nlMhelosen/artikelen/static analysis.pdf, свободный.

48. Gimpel Software PC-Lint: 64-bit Test Электронный ресурс. / Gimpel Software. Электрон, текстовые дан. - 2008. - Режим доступа: http://www.gimpel.com, свободный.

49. Gordon, J. Writing 64-bit programs Электронный ресурс. / J. Gordon. -Электрон, текстовые дан. 2006. - Режим доступа:http://www, j or gon. free serve. со .uk/GoasmHelp/64bits .htm, свободный.

50. Graegert, S. 64-bit Data Models Explained Электронный ресурс. / S. Graegert. Электрон, текстовые дан. - 2006. - Режим доступа: http://digitalether.de/index.php?option=com content&task^iew&id^l&It emid^46, свободный.

51. Jones, J. Abstract syntax tree implementation idioms Электронный ресурс. / J. Jones. Электрон, текстовые дан. - 2003. - Режим доступа: http://www.hillside.net/plop/plop2003/Papers/Jones-ImplementingASTs.pdf, свободный.

52. Josey, A. Data Size Neutrality and 64-bit Support Электронный ресурс. / A. Josey. Электрон, текстовые дан. - 1997. - Режим доступа: http://www.unix.org/whitepapers/64bit.html, свободный.

53. Jetley, R. Using static analysis to evaluate software in medical devices Электронный ресурс. / R. Jetley, P. Anderson. Электрон, текстовые дан. - 2008. - Режим доступа:http://www.embedded.com/design/20700Q574, свободный.

54. Mangan, Т. Porting С++ Applications to х64 Электронный ресурс. / Т. Mangan. Электрон, текстовые дан. - 2006. - Режим доступа:http://www.tmurgent.com/WhitePapers/WP Portx64.pdf, свободный.

55. Martin, В. Multiplatform Porting to 64 Bits Электронный ресурс. / В. Martin, A. Rettinger, J. Singh. Электрон, текстовые дан. - 2006. -Режим доступа: http://www.ddi.com/hpc-high-performance-computing/184406427, свободный.

56. Mashey, J.R. 64 bit processors: history and rationale Электронный ресурс. / J.R.Mashey. Электрон, текстовые дан. - 1995. - Режим доступа: http://yarchive.net/comp/64bit.html, свободный.

57. Mashey, J.R. The 64-bit integer type "long long": arguments and history Электронный ресурс. / J.R.Mashey. Электрон, текстовые дан. - 1995. - Режим доступа: http://yarchive.net/comp/longlong.html, свободный.

58. Mashey, J.R. The Long Road to 64 Bits Электронный ресурс. / J.R.Mashey. Электрон, текстовые дан. - 1995. - Режим доступа: http://queue.acm.org/detail.cfm?id=l 165766, свободный.

59. McNaughton, The One-Stop Shop for 64-bit Development Электронный ресурс. / A. McNaughton Электрон, текстовые дан. - 2006. - Режим доступа:http://developer.amd.com/documentation/articles/pages/3242006109.aspx, свободный.

60. Meyers, S. A First Look at С++ Program Analyzer / S. Meyers, M. Klaus // Dr. Dobb's Journal. 1997, Feb. Issue.

61. Microsoft. Migrating 32-bit Managed Code to 64-bit Электронный ресурс. / Microsoft Электрон, текстовые дан. - 2005. - Режим доступа: http://msdn.microsoft.com/en-us/library/ms973190.aspx, свободный.

62. Moonen, L. A Generic Architecture for Data Flow Analysis to Support Reverse Engineering Электронный ресурс. / L. Moonen. Электрон, текстовые дан. - 1997. - Режим доступа: http://homepages.cwi.nl/~leon/papers/dhal97/dhal97.pdf, свободный.

63. Mueller, J.P. 24 Considerations for Moving Your Application to a 64-bit Platform Электронный ресурс. / J.P. Mueller. Электрон, текстовые дан. - 2006. - Режим доступа:http://developer.amd.com/documentation/articles/pages/63 020063 8 .aspx, свободный.

64. Murawski, S. Beyond Windows XP: Get Ready Now for the Upcoming 64Bit Version of Windows Электронный ресурс. / S. Murawsku. -Электрон, текстовые дан. 2006. - Режим доступа: http://msdn.microsoft.com/en-us/magazine/cc30220Q.aspx, свободный.

65. Parasoft C++Test: C++Test User's Guide Электронный ресурс. / Parasoft.- Электрон, текстовые дан. 2008. - Режим доступа: http://www.parasoft.com, свободный.

66. Patrizio, A. How and Why Microsoft Migrated to AMD64: Case Study Электронный ресурс. / A. Patrizio. Электрон, текстовые дан. - 2006. -Режим доступа:http://developer.amd.com/documentation/articles/pages/628200633.aspx, свободный.

67. Pietrek, М. Everything You Need То Know То Start Programming 64-Bit Windows Systems Электронный ресурс. / M. Pietrek. Электрон, текстовые дан. - 2006. - Режим доступа: http://msdn.microsoft.com/en-us/magazine/ссЗ 00794.aspx, свободный.

68. Pistelli, D. Moving to Windows Vista x64 Электронный ресурс. / D. Pistelli. Электрон, текстовые дан. - 2007. - Режим доступа: http://www.codeproiect.com/KB/vista/vista x64.aspx, свободный.

69. Ruiz, J. Don't blow your stack: Static stack analysis for high-integrity systems Электронный ресурс. / J.F. Ruiz. Электрон, текстовые дан. -2008. - Режим доступа: http://www.embedded-computing.com/articles/id/?3270, свободный.

70. Sangoi, S. The 64 bit OS Architecture Электронный ресурс. / S.R. Sangoi. Электрон, текстовые дан. - 2007. - Режим доступа: http://www.codeproject.com/tGB/system/64BitOSAndPortingIssues.aspx, свободный.

71. Shekar, С. Extend your application's reach from 32-bit to 64-bit environments. Электронный ресурс. / С. Shekar. Электрон, текстовые дан. - 2006. - Режим доступа:http://www.s7solutions.com/pdfs/Migrating32bitapplicationto 64bit arti cle3.pdf, свободный.

72. Sokolov, S. Bulletproofing С++ Code Электронный ресурс. / S. Sokolov. Электрон, текстовые дан. - 2007. - Режим доступа: http://www.ddj.com/cpp/196802351, свободный.

73. Tarsy, G. Floating-Point Computing: A Comedy of Errors? Электронный ресурс. / G. Tarsy, N. Toda. — Электрон, текстовые дан. 2004. - Режим доступа: http://developers.sun.com/solaris/articles/fp errors.html, свободный.

74. Terklay, В. 64-Bit Programming with Visual С++? Электронный ресурс. / В. Terklay. Электрон, текстовые дан. - 2009. - Режим доступа: http://blogs.msdn.eom/brunoterkaly/archive/2009/01/12/64-bit-programming-with-visual-c.aspx, свободный.

75. The Open Group. 64-Bit Programming Models: Why LP64? Электронный ресурс. / The Open Group. Электрон, текстовые дан. - 1998. - Режим доступа: http://www.unix.org/version2/whatsnew/lp64wp.html, свободный.

76. Tyrlik, M. Making the transition to 64 bits Электронный ресурс. / M. Tyrlik. Электрон, текстовые дан. - 2004. - Режим доступа: http://www.ibm.com/developerworks/library/pa-intro64.html?ca=dgr-lnxw07To64Bits, свободный.

77. Viva64 Online Help Электронный ресурс. / Viva64. Электрон, текстовые дан. - 2008. - Режим доступа: http://www.viva64.com, свободный.

78. Wienholt, N. Get to Know the VSTS Native C/C++ Code Analyzer Электронный ресурс. / N. Wienholt. Электрон, текстовые дан. - 2006.- Режим доступа:http://www.codeguru.com/columns/kate/article.php/cl 1511/, свободный.

79. Ьиилион ка ан«1.1и:ш кода \ ivHt on

80. Карим ЛнОрги Николш-гшч ¡К! /'ы » кпн ¡имении .1,1 ем ин>Ь*иин ч (Ш')> .и карпов Андреи Нинч. тгнич. /'ы ** А«« ¿Гм/ГНММ Л.Н'КГШ/ф^.МЧ (Ш •)•<& иш