Разбор C ++ для создания заглушек модульного теста - PullRequest
10 голосов
/ 25 октября 2008

Я недавно пытался создать модульные тесты для некоторого устаревшего кода.

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

Есть ли более простой способ? Есть ли какой-нибудь синтаксический анализатор C ++, который может дать мне определения классов в какой-то простой форме, из которой я могу генерировать заглушки?

Ответы [ 9 ]

5 голосов
/ 25 октября 2008

Вы можете захотеть исследовать http://os.inf.tu -dresden.de / vfiasco / related.html # parsing . Но синтаксический анализ C ++ труден.

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

Вы также можете попробовать написать свой собственный простой (?) Парсер для генерации заглушек классов из заголовочных файлов ...

Я пытался дать вам несколько советов. Как видите, проблема не из легких. Но, надеюсь, вы сможете автоматизировать хотя бы часть этого.

4 голосов
/ 25 октября 2008

Gcc XML используется в некоторых проектах, таких как автоматическая FFI для Common Lisp. Он связывается с компилятором G ++ для генерации XML, представляющего источник. Оттуда любой инструмент обработки XML может помочь вам достичь вашей цели.

3 голосов
/ 22 сентября 2012

Инструмент abi-Compliance-Checker можно использовать в качестве анализатора заголовочных файлов C / C ++:

abi-compliance-checker -lib NAME -dump VER.xml -headers-only -xml -stdout > api.xml

VER.xml входной файл следующий:

<version>
  1.0
</version>

<headers>
  /path1/to/header(s)/
  /path2/to/header(s)/
   ...
</headers>

Выходной файл api.xml содержит сигнатуры функций и другую информацию из заголовочных файлов в структурированной форме:

...
<symbol>
    <id>37348</id>
    <mangled>_ZN7MWidget11qt_metacallEN11QMetaObject4CallEiPPv</mangled>
    <short>qt_metacall</short>
    <class>13749</class>
    <header>mwidget.h</header>
    <line>45</line>
    <return>44</return>
    <spec>virtual</spec>
    <parameters>
        <param>
            <name>p1</name>
            <type>4078</type>
            <algn>4</algn>
            <pos>0</pos>
        </param>
        <param>
            <name>p2</name>
            <type>44</type>
            <algn>4</algn>
            <pos>1</pos>
        </param>
        <param>
            <name>p3</name>
            <type>3905</type>
            <algn>8</algn>
            <pos>2</pos>
        </param>
    </parameters>
</symbol>
...

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

2 голосов
/ 25 октября 2008

Если вы используете платформу, которая использует формат отладки DWARF (в основном UNIX), вы можете использовать libdwarf для анализа отладочной информации и извлечения информации обо всем (прототипы функций, определения классов и т. Д.). Гораздо более структурированный и легче разбираемый, чем C ++.

2 голосов
/ 25 октября 2008

http://clang.llvm.org/ выглядит многообещающе, но не завершено.

http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.html использует GCCXML для генерации оболочек для кода C ++ для взаимодействия с Python. Это доказывает, что GCCXML использовался для аналогичной концепции.

1 голос
/ 13 декабря 2008

Проект Eclipse CDT предоставляет расширенный синтаксический анализатор C ++. Интерфейс довольно прост. Следующий фрагмент кода может дать достаточно подсказки.

ITranslationUnit tu = CoreModelUtil.findTranslationUnit (file);
ICElement [] elements = tu.getChildren ();

Структура IStructure = (элемент IStructure);
IMethodDeclaration [] Methods = Structure.getMethods ();
IField [] field = structure.getFields ();

1 голос
/ 08 декабря 2008

Вы смотрели на Mockcpp , AMOP и mockpp ? Вы могли видеть, как они анализируют C ++ - если ни один из них не соответствует вашим потребностям.

1 голос
/ 25 октября 2008

doxygen обычно может анализировать достаточно C ++ для создания документации для кода. У него также есть опция вывода XML.

0 голосов
/ 25 октября 2008

Если вы работаете на платформе Windows, возможно, вы захотите взглянуть на проект Microsoft Phoenix . Это новый каркас компилятора, который позволяет вам подключиться к любой стадии процесса компиляции.

...