Разбор С++ для создания 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 через анализ объявления в файлах заголовков.
Ответ 4
http://clang.llvm.org/ выглядит многообещающим, но неполным.
http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.html использует GCCXML для создания оболочек для кода С++ для интерфейса python. Это доказывает, что GCCXML использовался для аналогичного понятия.
Ответ 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. Это новая структура компилятора, которая позволяет вам подключиться к любой стадии процесса компиляции.