Разбор С++ для создания unit test заглушек

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Инструмент abi-compliance-checker может использоваться как синтаксический анализатор файлов заголовков 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 инструмент, который может генерировать основные unit test случаи для каждой функции в API через анализ объявления в файлах заголовков.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

ITranslationUnit tu = CoreModelUtil.findTranslationUnit(файл);
ICElement [] elements = tu.getChildren();

Структура структуры структуры = (IStructure),
IMethodDeclaration [] methods = struct.getMethods();
IField [] field = structure.getFields();

Ответ 9

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