Разбор C++ для создания заглушек модульных тестов

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

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

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


person Dave Hillier    schedule 25.10.2008    source источник


Ответы (9)


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

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

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

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

person Paweł Hajdan    schedule 25.10.2008
comment
Хороший ответ, но кажется довольно старым. Кто-нибудь знает более свежие источники? - person Dave Hillier; 25.10.2008

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

person Dwight Holman    schedule 25.10.2008

Инструмент 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 посредством анализа объявлений в заголовочных файлах.

person linuxbuild    schedule 22.09.2012

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

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

person Dave Hillier    schedule 25.10.2008
comment
Ответ может быть устаревшим с 2008 года. См. eli .thegreenplace.net/2011/07/03/parsing-c-in-python-with-clan для более современного обзора этой возможности clang. - person anatoly techtonik; 27.01.2015

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

person zvrba    schedule 25.10.2008

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

person CesarB    schedule 25.10.2008

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

person philant    schedule 08.12.2008

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

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

Структура IStructure = элемент (IStructure);
IMethodDeclaration[] методы = структура.getMethods();
IField[] поле = структура.getFields();

person Community    schedule 13.12.2008

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

person Ferruccio    schedule 25.10.2008