Domanda

Quali sono alcuni buoni strumenti per ottenere un rapido avvio per l'analisi e l'analisi di codice C/C++?

In particolare, sto cercando di strumenti open source per gestire il C/C++ per il preprocessore e lingua.Preferibilmente, tali strumenti sarebbe di utilizzare lex/yacc (o flex/bison) per la grammatica, e non essere troppo complicato.Essi dovrebbero gestire i più recenti ANSI C/C++ definizioni.

Ecco quello che ho trovato finora, ma non ho guardato nel dettaglio (pensiero?):

  • CScope - Vecchia-scuola C analyzer.Non mi sembra di fare un pieno di analizzare, però.Descritto come una sorta di 'grep' di C funzioni.
  • GCC - Preferito di tutti compilatore open source.Molto complicato, ma sembra fare di tutto.C'è un progetto che riguarda la creazione di estensioni del GCC chiamato GEMMA, ma non viene aggiornato dal GCC 4.1 (2006).
  • PUMA - Il Puro Manipolatore.(dalla pagina:"L'intento di questo progetto è quello di fornire una libreria di classi per l'analisi e la manipolazione di C/C++ fonti.Per questo scopo PUMA fornisce classi per l'acquisizione, l'analisi e, naturalmente, la manipolazione di C/C++ fonti.").Questo sembra promettente, ma non è stato più aggiornato dal 2001.A quanto pare PUMA è stata incorporata in AspectC++, ma anche questo progetto non è stato più aggiornato dal 2006.
  • Vari C/C++ raw grammatiche.È possibile ottenere c-c++-grammars-1.2.tar.gz, ma questo è stato dismesso dal 1997.Un po ' di ricerche su Google tira su altri lex/yacc grammatiche che potrebbe servire come un punto di partenza.
  • Ce ne sono altri?

Spero di utilizzare questo come un punto di partenza per la traduzione del sorgente C/C++ in un nuovo giocattolo lingua.

Grazie!-Matt

(Aggiunto 2/9):Solo un chiarimento:Voglio estrarre informazioni semantiche dal preprocessore, oltre al codice C/C++ stessa.Non voglio "#define pippo 42" scomparire nell'intero "42", ma rimangono attaccati al nome "pippo".Questo, purtroppo, non esclude diverse soluzioni che esegue il preprocessore primo e consegnare solo il C/C++ parse tree)

È stato utile?

Soluzione

durante l'analisi di C ++ è estremamente difficile perché la grammatica è indecidibile. Per citare Yossi Kreinin :

  

grammatica Incredibilmente complicato

     

"Incredibilmente" dovrebbe essere interpretata alla lettera, perché tutte le lingue popolari libera dal contesto (o "quasi" context-free) grammatiche, mentre C ++ ha indecidibile grammatica. Se vi piacciono i compilatori e parser, probabilmente sapete che cosa questo significa. Se non siete in questo genere di cose, c'è un semplice esempio che mostra il problema con l'analisi C ++: è AA BB(CC); definizione di un oggetto o di una dichiarazione di funzione? Si scopre che la risposta dipende in larga misura il codice prima la nota - il "contesto". Questo mostra (a livello intuitivo) che l'++ C grammatica è abbastanza sensibile al contesto.

Altri suggerimenti

Potete guardare clang che utilizza LLVM per l'analisi.

Supporto C ++ completamente ora link

Il ANTLR generatore di parser ha un grammatica per C / C ++, così come il preprocessore. Non ho mai usato quindi non posso dire quanto completa la sua analisi del C ++ sta per essere. ANTLR stesso è stato uno strumento utile per me su un paio di occasioni per l'analisi di lingue molto più semplici.

A seconda del problema GCCXML potrebbe essere la vostra risposta. In sostanza si analizza la fonte utilizzando GCC e poi ti dà XML facilmente digeribile di albero sintattico. Con GCCXML si è fatto una volta per tutte.

pycparser è un parser completo per C (C99) scritto in Python. Ha un backend AST completamente configurabile, quindi è utilizzato come base per qualsiasi tipo di elaborazione del linguaggio potrebbe essere necessario.

Non supporta C ++, però. Certo, è molto più difficile di quanto C.


Aggiorna (2012) : in questo momento la risposta, senza alcun dubbio, sarebbe Clang - è modulare, supporta la completa C ++ (con molti ++ C - 11 caratteristiche) e ha una base di codice relativamente amichevole. Essa ha anche un'API C per gli attacchi a linguaggi di alto livello (ad esempio per Python ).

Date un'occhiata a come doxygen opere, il codice sorgente completo è disponibile ed è flex-based.

Un candidato fuorviante è ORO che è un parser toolkit gratuito basato su Windows in modo esplicito per la creazione di traduttori . Il loro elenco di Le lingue supportate si riferisce alle lingue in cui si può implementare parser, non la lista delle grammatiche di parsing supportate.

Hanno solo grammatiche per C e C #, C ++ non.

di analisi C ++ è una sfida molto complessa .

Ecco il quadro Boost / Spirit, e un paio di anni fa hanno fatto giocare con l'idea di attuare un parser C ++, ma è lungi dall'essere completa .

pienamente e correttamente il parsing ISO C ++ è tutt'altro che banale, e c'erano infatti molti sforzi correlati. Ma è un lavoro di per sé complessa che non è facilmente realizzabile, senza dover riscrivere un frontend compilatore piena comprensione di tutti C ++ e il preprocessore. Un'implementazione pre-processore chiamato "onda" è disponibile dalla gente Spirit.

Detto questo, si potrebbe desiderare di avere uno sguardo a maiale / oink (elsa-based), che è un C ++ toolkit parser specificamente destinati ad essere utilizzati per scopi codice sorgente di trasformazione, è utilizzato dal progetto Mozilla di fare su larga scala l'analisi statica del codice sorgente e il codice automatizzato riscrittura, la parte più interessante è che non solo supporta la maggior parte di C ++, ma anche il preprocessore stesso!

D'altra parte c'è infatti una soluzione proprietaria singola disposizione:. Frontend EDG, che può essere utilizzato per praticamente tutti gli sforzi relativi C ++

Personalmente, vorrei controllare la suite di maiale / oink elsa-based che viene utilizzato in Mozilla, a parte questo, la FSF ha ora approvato lavoro su gcc plugin utilizzando la licenza libreria di runtime, quindi mi piacerebbe pensare che le cose stanno per cambiare rapidamente, una volta che le persone possono facilmente sfruttare la C gcc-based ++ parser per tali scopi utilizzando binario plugins.

Quindi, in poche parole: se si Bucks: EDG, se avete bisogno di qualcosa di libero / open source Ora : altro / oink sono abbastanza promettenti, se avete un po 'di tempo, si potrebbe desiderare di usare gcc per il vostro progetto.

Un'altra opzione solo per il codice C è cscout .

La grammatica per C ++ è una sorta di notoriamente peloso. C'è una buona discussione al Lambda su di esso, ma il succo è che C ++ grammatica può richiedere arbitrariamente molto lookahead.

Per il tipo di cosa che immagino si potrebbe fare, io pensavo di hacking GNU CC, o Splint . Gnu CC in particolare fa separare la parte generazione lingua abbastanza bene, per cui si potrebbe essere migliore fuori la costruzione di una nuova g ++ backend.

In realtà, PUMA e AspectC ++ sono ancora attivamente sia mantenuto e aggiornato. Stavo guardando nel usando AspectC ++ e si chiedeva per la mancanza di aggiornamenti me stesso. IO e-mail l'autore che ha detto che sia AspectC ++ e PUMA sono ancora in fase di sviluppo. Si può arrivare a codice sorgente attraverso SVN https://svn.aspectc.org/repos/ o è possibile ottenere binari regolare costruisce a http://akut.aspectc.org . Come con un sacco di eccellente C ++ in questi giorni, l'autore non ha il tempo di tenere il passo con la pagina web di manutenzione. Ha senso se hai un lavoro a tempo pieno e una vita.

Elsa batte tutto il resto che so a mani basse per C ++ parsing, anche se non è al 100% compatibile. Sono un fan. C'è un modulo che stampa C ++, in modo che possa essere un buon punto di partenza per il vostro progetto giocattolo.

come su qualcosa di più facile da comprendere come tiny-C o Piccolo C

Vedere il nostro Front End C++ per un completo parser C++:costruisce ASTs, le tabelle di simboli, non il nome e tipo di risoluzione.Si può anche analizzare e conservare il preprocessore direttive.Il front end C++ è costruito sulla cima della nostra DMS Software Reengineering Toolkit, che consente di utilizzare le informazioni per effettuare arbitrario modifiche del codice sorgente utilizzando sorgente a sorgente trasformazioni.

DMS è il motore ideale per l'implementazione di un traduttore.

Detto questo, non vedo molto senso nel tuo immaginato attività;Io non vedere molto valore nel tentativo di sostituire il C++, e troverete edificio un traduttore completo di una quantità enorme di lavoro, soprattutto se il vostro target è un "giocattolo" della lingua.E c'è probabilmente un piccolo punto nell' l'analisi di C++ utilizzando un robusto parser, se il suo unico scopo è quello di produrre un isomorfi versione di C++ che è più facile da analizzare (attendere, abbiamo postulato un robusto C++ già!).

EDIT Maggio 2012:DMS del front end C++ ora gestisce il GCC3/GCC4/C++11,Microsoft VisualC 2005/2010.Robustamente.

EDIT Febbraio 2015:Ora gestisce il C++14 GCC e MS dialetti.

EDIT agosto 2015:Ora analizza e coglie sia il codice e le direttive del preprocessore in un unico albero.

Qualche tempo fa ho tentato di scrivere un tool che genera automaticamente i test di unità per i file C.

Per preprosessing ho messo i file attraverso GCC. L'uscita è brutto ma si può facilmente rintracciare dove nel codice originale dal file pre-elaborato. Ma per le vostre esigenze potrebbe essere necessario somthing altro.

Ho usato Meter come base per un C parser. E 'open source e utilizza lex e yacc. Ciò ha reso facile ottenere installato e funzionante in poco tempo, senza comprendere pienamente lex & yacc.

Ho anche scritto un'applicazione C in quanto la soluzione lex & yacc non poteva aiutarmi a tracciare funzionalità tra le varie funzioni e analizzare la struttura di tutta la funzione di in un solo passaggio. E 'diventato impossibile da mantenere in breve tempo ed è stato abbandonato.

Cosa succede ad usare uno strumento come GNU CFLOW , in grado di analizzare il codice e produrre classifiche dei call-grafici, ecco cosa il href="http://www.opengroup.org/onlinepubs/000095399/utilities/cflow.html" rel="nofollow noreferrer"> OpenGroup (man page)

Spero che questo aiuti, I migliori saluti, Tom.

scroll top