Разбор C ++ для создания заглушек модульного теста
-
04-07-2019 - |
Вопрос
Недавно я пытался создать модульные тесты для некоторого устаревшего кода.
Я использовал подход с использованием компоновщика, чтобы показать мне, какие функции вызывают ошибки ссылок, найти источник определения для определения и создать заглушку из этого. Р>
Есть ли более простой способ? Есть ли какой-то синтаксический анализатор C ++, который может дать мне определения классов в некоторой простой в использовании форме, из которых я могу генерировать заглушки?
Решение
Возможно, вы захотите изучить http: //os.inf.tu. -dresden.de/vfiasco/related.html#parsing . Но анализ C ++ сложен.
С другой стороны, возможно, ctags или что-то подобное может извлечь определения классов ...
Вы также можете попробовать написать свой собственный простой (?) парсер для генерации заглушек классов из файлов заголовков ...
Я пытался дать вам несколько советов. Как видите, проблема не из легких. Но, надеюсь, вы сможете автоматизировать хотя бы часть этого.
Другие советы
Gcc XML используется в некоторых проектах, таких как автоматическая FFI для Common Lisp. Он связывается с компилятором G ++ для генерации XML, представляющего источник. Оттуда любой инструмент обработки XML может помочь вам достичь вашей цели.
Инструмент 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 с помощью анализа объявлений в заголовочных файлах.
http://clang.llvm.org/ выглядит многообещающе, но не полностью.
http://www.boost.org /doc/libs/1_36_0/libs/python/pyste/index.html использует GCCXML для генерации оболочек для кода C ++ для взаимодействия с Python. Это доказывает, что GCCXML использовался для аналогичной концепции.
Если вы используете платформу, использующую формат отладки DWARF (в основном UNIX), вы можете использовать libdwarf для анализа отладочной информации и извлечения информации обо всем (прототипы функций, определения классов и т. д.). Гораздо более структурированный и легче разбираемый, чем C ++.
doxygen обычно может анализировать достаточно C ++ для создания документации для кода. У этого также есть опция вывода XML.
Проект Eclipse CDT предоставляет расширенный синтаксический анализатор C ++. Интерфейс довольно прост. Следующий фрагмент кода может дать достаточно подсказки.
ITranslationUnit tu = CoreModelUtil.findTranslationUnit (file);
ICElement [] elements = tu.getChildren (); Р>
Элемент структуры
IStructure = (IStructure);
IMethodDeclaration [] method = structure.getMethods ();
IField [] field = structure.getFields (); Р>
Если вы работаете на платформе Windows, возможно, вы захотите взглянуть на проект Microsoft Phoenix а>. Это новая структура компилятора, которая позволяет вам подключаться к любой стадии процесса компиляции.