Domanda

Di recente ho provato a creare unit test per alcuni codici legacy.

Ho adottato l'approccio dell'utilizzo del linker per mostrarmi quali funzioni causano errori di link, greping l'origine per trovare la definizione e creare uno stub da quello.

C'è un modo più semplice? Esiste una sorta di parser C ++ che può darmi definizioni di classe, in qualche forma facile da usare, da cui posso generare stub?

È stato utile?

Soluzione

Potresti voler esaminare http: //os.inf.tu -dresden.de/vfiasco/related.html#parsing . Ma l'analisi del C ++ è difficile.

D'altra parte, forse i tag o qualcosa di simile possono estrarre le definizioni di classe ...

Puoi anche provare a scrivere il tuo parser semplice (?) per generare stub di classe dai file di intestazione ...

Ho provato a darti alcuni suggerimenti. Come vedi, il problema non è facile. Ma spero che tu possa automatizzare almeno una parte di esso.

Altri suggerimenti

Gcc XML viene utilizzato in alcuni progetti, come FFI automatico per Common Lisp. Si collega al compilatore G ++ per generare XML che rappresenta l'origine. Da lì, qualsiasi strumento di elaborazione XML potrebbe aiutarti a raggiungere il tuo obiettivo.

Lo strumento abi-compliance-checker può essere utilizzato come parser di C / File di intestazione C ++:

abi-compliance-checker -lib NAME -dump VER.xml -headers-only -xml -stdout > api.xml
Il file di input

VER.xml è il seguente:

<version>
  1.0
</version>

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

Il file di output api.xml contiene le firme delle funzioni e altre informazioni dai file di intestazione nella forma strutturata:

...
<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>
...

Vedi anche informazioni sullo api-sanity-checker , che può generare base casi di test unitari per ogni funzione nell'API attraverso l'analisi delle dichiarazioni nei file di intestazione.

http://clang.llvm.org/ sembra promettente ma è incompleto.

http://www.boost.org /doc/libs/1_36_0/libs/python/pyste/index.html utilizza GCCXML per generare wrapper per il codice C ++ per interfacciare Python. Ciò dimostra che GCCXML è stato utilizzato per un concetto simile.

Se utilizzi una piattaforma che utilizza il formato di debug DWARF (principalmente UNIX), puoi utilizzare libdwarf per analizzare le informazioni di debug ed estrarre informazioni su tutto (prototipi di funzioni, definizioni di classe, ecc.). Molto più strutturato e più facile da analizzare rispetto al C ++.

doxygen di solito può analizzare abbastanza C ++ per creare documentazione per il codice. Ha anche un'opzione di output XML.

Hai guardato Mockcpp , AMOP e mockpp ? Potresti vedere come analizzano il C ++, se nessuno di loro soddisfa le tue esigenze.

Il progetto CDT di Eclipse fornisce un parser C ++ avanzato. L'interfaccia è abbastanza semplice. Il seguente frammento di codice può dare abbastanza suggerimenti.

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

IStructure structure = (IStructure) element;
IMethodDeclaration [] method = structure.getMethods ();
IField [] field = structure.getFields ();

Se sei sulla piattaforma Windows, potresti dare un'occhiata al progetto Microsoft Phoenix . È un nuovo framework di compilazione che ti consente di collegarti a qualsiasi fase del processo di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top