АВТОМАТИЗАЦИЯ ТЕСТИРОВАНИЯ СИНТАКСИЧЕСКИХ АНАЛИЗАТОРОВ И АНАЛИЗАТОРОВ КОНТЕКСТНЫХ УСЛОВИЙ - Студенческий научный форум

VI Международная студенческая научная конференция Студенческий научный форум - 2014

АВТОМАТИЗАЦИЯ ТЕСТИРОВАНИЯ СИНТАКСИЧЕСКИХ АНАЛИЗАТОРОВ И АНАЛИЗАТОРОВ КОНТЕКСТНЫХ УСЛОВИЙ

Бессонов В.А. 1
1Пермский государственный национальный исследовательский университет, кафедра математического обеспечения вычислительных систем
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение

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

Ошибки в компиляторах приводят к тому, что поведение исполняемых модулей, являющихся результатом работы компиляторов, отличается от поведения, определяемого семантикой̆ исходной̆ программы. Ошибки такого рода очень сложно выявлять и исправлять, а их наличие ставит под сомнение качество компонент, для генерации которых использовался компилятор. Очевидно, что корректность работы компилятора с языка программирования является необходимым условием надежной̆ работы любого программного обеспечения, реализованного с его помощью, а задача верификации, которая согласно [CMMI for Systems Engineering/Software Engineering, Version 1.02 (CMMI-SE/SW, V1.02) CMU/SEI-2000-TR-018 ESC-TR-2000-018. 2000. P. 598.] описывается как обеспечение соответствия набора результатов работы заданным требования, является важнейшим средством обеспечения надежности программного обеспечения [Зеленов С.В., Пакулин Н.В. Верификация компиляторов - систематический подход // Труды Института системного программирования РАН. 2007.].

Целью данной работы аналитической обзор различных подходов к верификации современных компиляторов и их компонентов:

  1. синтаксического анализатора;

  2. анализатора контекстной семантики.

Обзор методов проведения верификации современных компиляторов

Все виды методов проведения верификации программного обеспечения можно разделить на две большие группы [Кулямин В.В., "Интеграция методов верификации программных систем," Программирование, 2009.]:

  1. статические методы верификации, включающие в себя формальные методы, методы статического анализа и экспертизу и рассчитанные на то, что проверка программных систем выполняется «статически», т.е. без их исполнения в вычислительной системе;

  2. динамические методы, которые используются для проверки поведения программы во время выполнения.

Однако компилятор любого языка, имеющего практическое значение, представляет собой настолько сложную систему, что методы статической верификации можно использовать только для отдельных небольших подсистем компилятора. И обычно на практике для тестирования компиляторов используются именно методы динамической верификации [Зеленов С.В., Пакулин Н.В. Верификация компиляторов - систематический подход // Труды Института системного программирования РАН. 2007.], которые предполагают решение следующих задач [Посыпкин М.А. Применение формальных методов для тестирования компиляторов // Труды Института системного программирования РАН. 2004.]:

  1. генерация (написание) тестов;

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

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

Для решения этих задач в настоящий момент широко применяются два подхода к тестированию: метод «белого ящика», призванный выявить все ошибочные фрагменты конкретной реализации, и метод «черного ящика», предназначенный для определения степени соответствия формальной спецификации.

В качестве компромисса между этими двумя методами можно использовать тестирование на основе моделей, которая объединяет их преимущества и нивелирует недостатки [Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.]. Модель может быть описана формально, что позволяет использовать ее в качестве исходных данных для генерации тестов и оценки тестового покрытия. В то же время модель задает требования к реализации и поэтому ее можно использовать для тестирования корректности конкретной реализации.

Однако очевидным является тот факт, что ручное построение и сопровождение тестового набора является чрезвычайно сложной задачей. Для упрощения этой задачи можно использовать одно из основных преимуществ метода тестирования на основе моделей – возможность систематической и автоматической генерации тестов [Архипова М.В., "Генерация тестов для семантических анализаторов," Вычислительные методы и программирование, Т. 7, 2006. С. 55-70.]. Существование формального описания позволяет автоматизировать процесс построения тестов, что существенно снижает трудозатраты, а систематичность тестирования повышает доверие к его результатам.

Таким образом, можно свести выше описанные задачи динамической верификации компиляторов к следующим [Зеленов С.В., Пакулин Н.В. Верификация компиляторов - систематический подход // Труды Института системного программирования РАН. 2007.]:

  1. автоматизация построения тестов:

    1. автоматизация генерации тестовых данных;

    2. автоматизация проверки корректности обработки тестовых данных (проблема построения оракула);

  2. определение критерия завершения верификации.

Для решения данных задач в работе [Зеленов С.В., Пакулин Н.В. Верификация компиляторов - систематический подход // Труды Института системного программирования РАН. 2007.] предлагается схема верификации, схематично изображенная на рис. .

Рисунок . Общая схема метода верификации

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

Как уже упоминалось выше, компиляторы реальных языков программирования представляют собой чрезвычайно сложные программные системы. Кроме того, дополнительным источником трудностей при верификации компилятора является то, что входные данные имеют очень сложную структуру с большим количеством внутренних связей. Поэтому для снижения сложности задачи верификации компиляторов в работе [Зеленов С.В., Пакулин Н.В. Верификация компиляторов - систематический подход // Труды Института системного программирования РАН. 2007.] предлагается выполнять ее функциональную декомпозицию на отдельные подзадачи, которые в совокупности должны покрывать всю функциональность компилятора. Дополнительным стимулом для этого является то, что компилятор обычно представляется в виде нескольких функциональных модулей, виды взаимодействия и последовательность которого строго определены. Пример такого представления, приведенный в соответствии с [Ахо А.В., Лам М.С., Сети Р., Ульман Д.Д. Компиляторы. Принципы, технологии и инструментарий. Москва: ООО "И.Д. Вильямс", 2008.], изображен на рис. .

Рисунок . Схема взаимодействия функциональных модулей компилятора

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

Таким образом, в соответствии с выше сказанным задача верификации компилятора может быть разделена на следующие подзадачи:

  1. верификация синтаксического анализатора;

  2. верификация анализатора контекстных условий.

Учитывая выше сказанное, эти задачи сведутся к следующим:

  1. автоматизированное тестирование синтаксического анализатора;

  2. автоматизированное тестирование анализатора контекстных условий.

Обзор методов автоматизированного тестирования синтаксических анализаторов

Синтаксический анализатор является одним из основных модулей любого компилятора и в случае его некорректности теряет смысл тестирования всего остального функционала компилятора. Поэтому верификация синтаксического анализатора является одной из важнейших задач верификации компилятора [Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.].

Спецификации многих современных языков программирования включают в себя формальное описание их синтаксиса, представляющее собой описание грамматики языка в форме некоторой разновидности БНФ. Для оставшихся языков делаются активные попытки их построения [Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.], [Lämmel R. Grammar Testing // Fundamental Approaches to Software Engineering. 2001. pp. 201-216.], [Lämmel R., Verhoef C., "Cracking the 500-Language Problem," IEEE Software, Vol. 18, No. 6, 2001. pp. 78-88.]. Таким образом, формальное описание синтаксиса языка программирования на БНФ, являющегося помимо всего прочего и спецификацией функциональности синтаксического анализа, может выступать в качестве формальной модели, использующейся в качестве исходных данных для автоматической генерации тестов [Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.].

Генерация позитивных тестов

Начиная с конца 60-х годов XX века многие авторы занимались вопросами генерации тестов по грамматике.

Одной из первой работ в области является работа Ханфорда [Hanford K.V., "Automatic generation of test cases," IBM Systems Journal, Vol. 9, No. 4, 1970. pp. 242 - 257.], содержащей описание так называемой «синтаксической машины», представляющей собой стохастический генератор тестовых данных для компилятора PL/1 на основе контекстно-свободной грамматики языка. Основным недостатком подобного подхода является его стохастическая природа, что приводит к генерации большого числа тестов, не имеющих практической значимости, и отсутствие каких-либо критериев остановки и/или полноты сгенерированных тестов. Однако стохастическая природа генератора в то же время является и его преимуществом, т.к. во-первых обеспечивает неисчерпаемый источник тестового материала, а во-вторых позволяет генерировать тестовые тексты, форма и содержание, которых вряд ли могли представиться возможными человеку, занимающемуся разработкой тестов вручную.

Работа Пардома [Purdom P., "A sentence generator for testing parsers," BIT Numerical Mathematics, 1972. pp. 366-375.] считается основополагающей. В ней был сформулирован один из первых критериев покрытия для множества позитивных тестов: для каждого правила в данной̆ грамматике во множестве тестов должно присутствовать предложение языка, в выводе которого используется это правило. Помимо этого, в этой же работе ее автор предложил алгоритм для построения минимального тестового набора, который бы удовлетворял этому критерию.

Ламмель в работе [Lämmel R. Grammar Testing // Fundamental Approaches to Software Engineering. 2001. pp. 201-216.] показал, что критерий, предложенный Пардомом, оказался недостаточным: с помощью тестов, построенных с помощью данного алгоритма, не удается обнаружить даже простейшие ошибки. Более сильный критерий, предложенный Ламмелем, позволял избежать данного недостатка и состоял в том, что тест должен покрывать каждую пару правил, одно из которых можно применить непосредственно после другого.

Многие авторы ([Maurer P.M., "Generating test data with enhanced context-free grammars," Software, IEEE, Vol. 7, No. 4, 1990. pp. 50 - 55.], [Maurer P.M., "The design and implementation of a grammar-based data generator," Software: Practice and Experience, Vol. 22, No. 3, 1992. pp. 223–244.] [McKeeman W., "Differential testing for software," Digital Technical Journal, Vol. 10, No. 1, 1998. pp. 101-107.], [Yang X., Chen Y., Eide E., and Regehr J. Finding and understanding bugs in C compilers // Proceeding PLDI '11 Proceedings of the 32nd ACM SIGPLAN conference on Programming language design and implementation. 2011. pp. 283-294.]) предлагали вероятностные методы генерации тестов. Основных недостатком таких работ отсутствие критериев покрытия, что в свою очередь приводит к вопросу о критерии остановки процесса генерации. Основным способом решения подобного вопроса является также использование вероятностного подхода. Однако в любом случае это означает отсутствие гарантии того, что алгоритм закончит свою работу за конечное время и тем самым нарушает один из главных принципов, которым мы стремились следовать, – систематичность.

Генерация негативных тестов

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

В работе [16] в качестве метода для генерации негативных тестов предлагается так называемый метод мутационного тестирования. Основой данного метода является предположение о том, что после внесения в исходную грамматику языка ряда изменений (мутаций) ее можно использовать для получения потенциально негативных тестов. Однако при использовании подобного подхода можно столкнуться со следующими проблемами:

  • грамматика, полученная с помощью мутаций, может оказаться эквивалентной исходной грамматике;

  • тесты, сгенерированные на основе грамматики-мутанта, не являющейся эквивалентной исходной, могут оказаться корректными.

В работе [Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.] описаны методы генерации позитивных и гарантированно негативных тестов, а также разработанные для них критерия покрытия. Практическую применимость описанных в работе методов подтвердили проведенные испытания по тестированию промышленных компиляторов.

Сравнение различных методов

В табл. приведено сравнение выше описанных методов по нескольким критериям. Методом, который наиболее полно удовлетворяет всем поставленным критериям, является метод, предложенный в работе [Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.].

Таблица . Сравнение различных методов генерации тестов для синтаксических анализаторов

Автор(ы)

Алгоритм генерации позитивных тестов

Критерии покрытия для множества позитивных тестов

Алгоритм генерации негативных тестов

Критерии покрытия для множества негативных тестов

К.В. Ханфорд

+

-

-

-

П. Пардом

+

+

-

-

Р. Ламмель

+

+

-

-

В. МакКиман

+

-

-

-

С.В. Зеленов, С.А. Зеленова

+

+

+

+

Обзор методов автоматизированного тестирования анализаторов контекстных условий

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

Генерация позитивных тестов

В работе Ханфорда [Hanford K.V., "Automatic generation of test cases," IBM Systems Journal, Vol. 9, No. 4, 1970. pp. 242 - 257.] был предложен один из первых методов, позволяющих учитывать контекстные условия в процессе генерации тестовых наборов. Данный метод основан на использовании так называемой «динамической грамматики», которая является своеобразным расширением обычной контекстно-свободной грамматики , с продукциями которой связаны специальные генераторы, позволяющие модифицировать грамматику (например, путем добавления новых продукционных правил) во время процесса генерации. К недостаткам данного подхода, помимо уже описанных выше недостатков метода генерации тестов для синтаксического анализатора, можно отнести сложность создания динамической грамматики и ее громоздкость. Создание динамической грамматики для современных языков программирования потребовало значительных усилий, сравнимых с усилиями, которые было бы необходимо приложить для разработки анализатора контекстных условий для данного языка.

В работе Пардома [Purdom P., "A sentence generator for testing parsers," BIT Numerical Mathematics, 1972. pp. 366-375.] описан метод, предназначенный для генерации позитивных тестов без учета контекстных условий для синтаксических анализаторов компиляторов процедурных языков.

Челентано и др. в работе [Celentano A., Reghezzi C.S., Della V.P., Granata G., and Savoretti F., "Compiler Testing using a Sentence Generator," Software - Practice and Experience, Vol. 10, No. 11, 1980. pp. 897-913.] описали два расширения алгоритма Пардома. Первое их них позволяет генерировать позитивные тесты, представляющие собой терминальные цепочки максимальной длины, которые удовлетворяют критерию покрытия. Второе расширение предназначено для генерации корректных текстов программ, корректных с точки зрения статической семантики. Оно представляет собой специализированный модуль, на вход которому подается грамматика исходного языка, дополненная кодом, осуществляющим преобразование синтаксически корректных программ в семантически корректные. Авторы использовали описанные расширения для автоматизации тестирования компилятора языка Pascal и отметили, что описание подобным образом контекстных условий требует значительных усилий, что означает нежизнеспособность подхода в случае его использования для полноценного тестирования анализаторов современных языков программирования.

В работе [Wichmann B.A., Jones B., "Testing ALGOL 60 compilers," Software - Practice and experience, Vol. 6, No. 2, 1976. pp. 261-270.] Уичман и Джонс предложили метод построения тестовых наборов, который бы учитывал некоторые контекстные условия такие как, правильность обработки ограничений на глубину вложенности блоков, процедур, блоков, циклов и т.п. Однако при этом данный метод не позволял учитывать другие простейшие правила статической семантики, например, касающиеся использования имен переменных.

В работе [Duncan A.G., Hutchinson J.S. Using Attributed Grammars to Test Designs and Implementation // In Proceedings of the 5th international conference on Software engineering. Piscataway, NJ, USA. 1981. pp. 170-178.] в качестве формализма для описания контекстных условий предлагается использовать атрибутные грамматики. Результирующий тестовый набор, сгенерированный в соответствии с методом, предложенным Данкэном и Хатчисоном, должен содержать только синтаксически корректные тесты, удовлетворяющие контекстным условиям. Это достигается за счет последовательного перебора всех продукционных правил грамматики, которые выполняются только в случае, если это позволяют контекстные ограничения. В конечном итоге тесты, сгенерированные с помощью данного метода, должны покрывать все продукционные правила грамматики и все описанные с помощью атрибутных грамматик контекстные условия. Однако такой̆ подход ведет к большому количеству пустых прогонов генератора, когда из-за невыполненных контекстных условий приходится прерывать процесс генерации, и к построению большого числа тестов, не интересных с практической точки зрения [Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.].

Сирер и Бершэд в работе [Sirer E., Bershad B.N. Using production grammars in software testing // In Proceedings 2nd conference on Domain-specific languages. New York, NY, USA. 1999. pp. 1-13.] предложили использовать спецификационный язык lava в качестве формального языка для описания синтаксиса и статической семантики языков программирования. Заданная с помощью lava грамматика представляет собой РБНФ-грамматику, дополненную Java-кодом, описывающим контекстные условия. Разработанный авторами подход был использован для тестирования устойчивости JVM. К сожалению, в авторы не привели оценки достигнутого покрытия тестируемой̆ системы.

В работе Архиповой [Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.] предлагается способ конструктивного описания правил статической семантики языков программирования, а также метод целенаправленной генерации как корректных, так и некорректных с точки зрения статической семантики наборов тестов. Кроме того, автором были предложены критерии покрытия для набора как позитивных, так и негативных тестов. Практическая применимость описанных методов была доказана в ходе практических испытаний по тестированию промышленных компиляторов.

Генерация негативных тестов

Все выше описанные методы, за исключением работы, не позволяют выполнять целенаправленную генерацию тестов, некорректных с точки зрения статической семантики. Единственным исключением является [Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.], в которой помимо метода генерации негативных тестов описан также и критерий покрытия для множества негативных тестов.

Сравнение различных методов

В табл. приведено сравнение выше описанных методов. Методом, который наиболее полно удовлетворяет всем поставленным критериям, является метод, предложенный в работе [Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.].

Заключение

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

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

Автор(ы)

Алгоритм генерации позитивных тестов

Критерии покрытия для множества позитивных тестов

Алгоритм генерации негативных тестов

Критерии покрытия для множества негативных тестов

К.В. Ханфорд

+

-

-

-

П. Пардом

-

-

-

-

Р. Ламмель

+

+

-

-

А. Челентано и др.

+

-

-

-

Б.А. Уичман, Б. Джонс

+

-

-

-

А.Г. Данкэн, Дж.С. Хатчисон

+

-

-

-

Э. Сирер, Б.Н. Бершэд

+

-

-

-

М.В. Архипова

+

+

+

+

Помимо этого в работе были рассмотрены различные подходы к верификации (автоматизированному тестированию) основных модулей современных компиляторов: синтаксического анализатора и анализатора контекстных условий. Рассмотренные методы были сравнены с точки зрения ряда формальных характеристик (например, существование критериев покрытия), отражающих их возможность применения на практике. Методами, наиболее полно удовлетворяющими всем критериям, являются методы, описанные в работах [Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.] и [Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.].

Библиографический список

  1. Архипова М.В., "Генерация тестов для семантических анализаторов," Вычислительные методы и программирование, Т. 7, 2006. С. 55-70.

  2. Архипова М.В. Диссертационная работа на соискание степени кандидата физико-математических наук. Москва. 2006. ИСП РАН.

  3. Ахо А.В., Лам М.С., Сети Р., Ульман Д.Д. Компиляторы. Принципы, технологии и инструментарий. Москва: ООО "И.Д. Вильямс", 2008.

  4. Зеленов С.В., Зеленова С.А. Автоматическая генерация позитивных и негативных тестов для тестирования фазы синтаксического анализа // Труды Института системного программирования РАН. 2004. Т. 8.

  5. Зеленов С.В., Пакулин Н.В. Верификация компиляторов - систематический подход // Труды Института системного программирования РАН. 2007.

  6. Кулямин В.В., "Интеграция методов верификации программных систем," Программирование, 2009.

  7. Посыпкин М.А. Применение формальных методов для тестирования компиляторов // Труды Института системного программирования РАН. 2004.

  8. Celentano A., Reghezzi C.S., Della V.P., Granata G., and Savoretti F., "Compiler Testing using a Sentence Generator," Software - Practice and Experience, Vol. 10, No. 11, 1980. pp. 897-913.

  9. Duncan A.G., Hutchinson J.S. Using Attributed Grammars to Test Designs and Implementation // In Proceedings of the 5th international conference on Software engineering. Piscataway, NJ, USA. 1981. pp. 170-178.

  10. Hanford K.V., "Automatic generation of test cases," IBM Systems Journal, Vol. 9, No. 4, 1970. pp. 242 - 257.

  11. Harm J., Lammel R., "Two-dimensional Approximation Coverage," Informatica Journal, Vol. 2029, 2000. pp. 201-216.

  12. Knuth D.E., "Semantics of context-Free languages," Mathematical systems theory, Vol. 2, No. 2, 1968. pp. 127-145.

  13. Lämmel R. Grammar Testing // Fundamental Approaches to Software Engineering. 2001. pp. 201-216.

  14. Lämmel R., Verhoef C., "Cracking the 500-Language Problem," IEEE Software, Vol. 18, No. 6, 2001. pp. 78-88.

  15. Maurer P.M., "Generating test data with enhanced context-free grammars," Software, IEEE, Vol. 7, No. 4, 1990. pp. 50 - 55.

  16. Maurer P.M., "The design and implementation of a grammar-based data generator," Software: Practice and Experience, Vol. 22, No. 3, 1992. pp. 223–244.

  17. McKeeman W., "Differential testing for software," Digital Technical Journal, Vol. 10, No. 1, 1998. pp. 101-107.

  18. Offut A.J., Lee S.D., "An Empirical Evaluation of Weak Mutation," IEEE Transactions on Software Engineering, Vol. 20, No. 5, 1994. pp. 337-344.

  19. Purdom P., "A sentence generator for testing parsers," BIT Numerical Mathematics, 1972. pp. 366-375.

  20. Sirer E., Bershad B.N. Using production grammars in software testing // In Proceedings 2nd conference on Domain-specific languages. New York, NY, USA. 1999. pp. 1-13.

  21. Wichmann B.A., Jones B., "Testing ALGOL 60 compilers," Software - Practice and experience, Vol. 6, No. 2, 1976. pp. 261-270.

  22. Yang X., Chen Y., Eide E., and Regehr J. Finding and understanding bugs in C compilers // Proceeding PLDI '11 Proceedings of the 32nd ACM SIGPLAN conference on Programming language design and implementation. 2011. pp. 283-294.

  23. CMMI for Systems Engineering/Software Engineering, Version 1.02 (CMMI-SE/SW, V1.02) CMU/SEI-2000-TR-018 ESC-TR-2000-018. 2000. P. 598.

Просмотров работы: 1801