Pergunta

Quais são algumas boas ferramentas para obter um início rápido para analisar e análise de código C / C ++?

Em particular, eu estou procurando ferramentas de código aberto que lidam com o C / C ++ pré-processador e linguagem. De um modo preferido, estas ferramentas usaria lex / yacc (ou flex / bisontes) para a gramática, e não ser demasiado complicado. Eles devem lidar com as últimas definições de ANSI C / C ++.

Aqui está o que eu encontrei até agora, mas não olhou para eles em detalhe (pensamentos?):

  • cscope - analisador da velha escola C. Não parece fazer uma análise completa, no entanto. Descrito como um glorificado 'grep' para encontrar funções C.
  • GCC - compilador open source favorito de todos. Muito complicado, mas parece fazer tudo. Há um projeto relacionado para a criação de extensões GCC chamado GEM , mas não tem foi atualizado desde GCC 4.1 (2006).
  • PUMA - O manipulador puro. (A partir da página: "A intenção deste projeto é proporcionar uma biblioteca de classes para a análise e manipulação de fontes de C / C ++. Por esta finalidade PUMA fornece classes de varrimento, análise e manipulação de curso C / C ++ fontes. "). Isso parece promissor, mas não foi atualizado desde 2001. Aparentemente PUMA foi incorporada AspectC ++ , mas mesmo esse projeto não foi atualizado desde 2006.
  • Diversas C / gramáticas matérias-C ++. Você pode obter c-c ++ - gramáticas-1.2.tar.gz , mas este tem sido sem manutenção desde 1997. um pouco Google busca puxa outras gramáticas básicos lex / yacc que poderiam servir como um ponto de partida.
  • Qualquer outros?

Estou esperando para usar isso como um ponto de partida para traduzir fonte C / C ++ em uma nova linguagem de brinquedo.

Obrigado! -Matt

(Adicionado 2/9): Apenas um esclarecimento: eu quero extrair informações semânticas do pré-processador, além do código C / C ++ em si. Eu não quero "#define foo 42" desaparecer na integer "42", mas permanecer solidários com o nome "foo". Isto, infelizmente, exclui várias soluções que rodam o pré-processador primeira e única entregar a / C ++ árvore de análise C)

Foi útil?

Solução

Análise de C ++ é extremamente difícil porque a gramática é indecidível. Para citar Yossi Kreinin :

gramática Excepcionalmente complicado

"Excepcionalmente" deve ser interpretada literalmente, porque todas as linguagens populares Have livre de contexto (ou "quase" livre de contexto-) gramáticas, enquanto C ++ tem indecidible gramática. Se você gosta de compiladores e analisadores, você provavelmente sabe o que isso significa. Se você não estiver em esse tipo de coisa, há um exemplo simples mostrando o problema com a análise de C ++: é AA BB(CC); uma definição de objeto ou uma declaração de função? Acontece que a resposta depende muito do código antes a declaração - o "contexto". Isto mostra (sobre um nível intuitivo) que a gramática do C ++ é bastante sensível ao contexto.

Outras dicas

Você pode olhar para clang que usa LLVM para análise.

Suporte C ++ totalmente agora ligação

O rel ANTLR parser gerador tem um gramática para C / C ++, bem como o pré-processador. Eu nunca usei isso para que eu não posso dizer como completar a sua análise de C ++ vai ser. -se ANTLR tem sido uma ferramenta útil para mim em um par de ocasiões para analisar línguas muito mais simples.

Dependendo do seu problema GCCXML pode ser a sua resposta. Basicamente ele analisa a fonte usando GCC e, em seguida, dá-lhe XML facilmente digerível da árvore de análise. Com GCCXML você é feito uma vez por todas.

pycparser é um analisador completo para C (C99) escrito em Python. Tem um backend AST totalmente configurável, por isso ele está sendo usado como base para qualquer tipo de linguagem de processamento que você pode precisar.

Não suporta C ++, no entanto. Concedido, é muito mais difícil do que C.


Update (2012) : neste momento a resposta, sem dúvida, seria Clang - é modular, apoia a plena C ++ (com muitos C ++ - 11 recursos) e tem uma base de código relativamente amigável. Ele também tem uma API C para ligações para linguagens de alto nível (ou seja, para Python ).

Tenha um olhar em como doxygen obras, código fonte completo está disponível e é Flex-based.

Um candidato enganosa é OURO que é um conjunto de ferramentas analisador baseado em Windows livre explicitamente para a criação de tradutores . Sua lista de idiomas suportados refere-se às línguas em que se pode implementar analisadores, não a lista de gramáticas de análise suportados.

Eles só têm gramáticas para C e C #, não C ++.

Análise C ++ é um desafio muito complexo .

Há o impulso / framework Espírito, e um par de anos atrás, eles fizeram jogo com a idéia de implementar um C ++ analisador , mas de longe de ser completa .

completa e adequada análise ISO C ++ está longe de ser trivial, e havia de fato muitos esforços relacionados. Mas é uma tarefa inerentemente complexo que não é facilmente realizado, sem reescrever uma interface compilador completa compreensão de todos C ++ e o pré-processador. A implementação de pré-processador chamado de "onda" está disponível dos povos do espírito.

Dito isso, você pode querer ter um olhar para porco / oink (-elsa base), que é um C ++ Toolkit analisador especificamente destinado a ser utilizado para fins de transformação de código fonte, que está a ser usado pelo projecto Mozilla fazer análise de código fonte estática em grande escala e de código automatizado reescrever, a parte mais interessante é que ele não só apoia a maioria de C ++, mas também o próprio pré-processador!

Por outro lado, há certamente uma solução proprietária única disponível:. Frontend EDG, que pode ser usado para praticamente tudo o C ++ esforços relacionados

Pessoalmente, eu gostaria check-out a suíte de porco à base de Elsa / oink que é usado no Mozilla, para além de que, a FSF já trabalho em gcc plugins usando a licença da biblioteca de tempo de execução, assim que eu supor que as coisas vão mudar rapidamente, uma vez que as pessoas podem facilmente alavancar o analisador à base de gcc C ++ para tais fins usando binário plugins.

Assim, em poucas palavras: Se a grana: EDG, se você precisa de algo free / open source agora : mais / oink são bastante promissores, se você tiver algum tempo, você pode querer uso gcc para o seu projeto.

Outra opção apenas para o código C é cscout .

A gramática para C ++ é uma espécie de notoriamente cabeludo. Há um bom segmento em Lambda sobre isso, mas a essência é que a gramática C ++ pode exigir arbitrariamente muito lookahead.

Para o tipo de coisa que eu imagine que você poderia estar fazendo, eu pensaria sobre hacking quer Gnu CC, ou Splint . Gnu CC, em particular, faz separar a parte geração linguagem muito bem, então você pode ser melhor fora de construção de uma nova g ++ backend.

Na verdade, PUMA e AspectC ++ ainda são ambos ativamente mantido e atualizado. Eu estava olhando para usar AspectC ++ e queria saber sobre a falta de atualizações de mim mesmo. I e-mail o autor que disse que tanto AspectC ++ e PUMA ainda estão sendo desenvolvidos. Você pode obter o código fonte através SVN https://svn.aspectc.org/repos/ ou você pode obter binários regulares constrói em http://akut.aspectc.org . Tal como acontece com um monte de excelente c ++ projeta estes dias, o autor não tem tempo para acompanhar a manutenção da página web. Faz sentido se você tem um emprego a tempo inteiro e uma vida.

Elsa bate tudo o que eu sei as mãos para baixo para C ++ análise, embora isso não é 100% compatível. Eu sou um fã. Há um módulo que imprime C ++, de modo que pode ser um bom ponto de partida para o seu projeto brinquedo.

como sobre algo mais fácil de compreender como tiny-C ou pequeno C

Veja nossa C ++ Frente End para um analisador full-featured C ++: constrói ASTs, tabelas de símbolos, faz nome e digite resolução. Você mesmo pode analisar e manter o pré-processador directivas. extremidade dianteira do C ++ é construído em cima do nosso DMS Software Reengineering Toolkit, que permite que você use essa informação para realizar arbitrária código fonte muda usando transformações fonte-a-fonte.

DMS é o motor ideal para a implementação de tais tradutor a.

Dito isto, não vejo muito sentido em sua tarefa imaginado; Eu não ver muito valor na tentativa de substituir C ++, e você encontrará edifício um tradutor completo uma enorme quantidade de trabalho, especialmente se o seu -alvo é uma linguagem de "brinquedo". E não há ponto pouco provável em análise C ++ utilizando um analisador robusto, se o seu único objectivo é produzir uma versão isomórfica de C ++ que é mais fácil de analisar (espera, postulamos uma robusta C ++ já!).

EDIT maio de 2012: front-end C ++ da DMS agora lida com GCC3 / gcc4 / C ++ 11, Microsoft VisualC 2005/2010. Robustamente.

EDIT fevereiro 2015:. Agora trata C ++ 14 em CCG e MS dialetos

EDIT agosto 2015:. Parses e capturas Agora, tanto o código e as directivas de pré-processamento em uma árvore unificada

Um tempo atrás eu tentei escrever uma ferramenta que irá gerar automaticamente testes de unidade para arquivos c.

Para preprosessing eu colocar os arquivos através GCC. A saída é feio, mas você pode facilmente rastrear onde no código original do arquivo pré-processado. Mas para as suas necessidades você pode precisar somthing mais.

Medidor como a base para um C parser. É open source e usos lex e yacc. Isso tornou fácil de se levantar e correr em um curto espaço de tempo, sem lex totalmente compreensão & yacc.

Eu também escrevi um aplicativo C desde a solução lex & yacc não poderia me ajudar a traçar funcionalidade em todas as funções e analisar a estrutura de toda a função em uma passagem. Tornou-se insustentável em pouco tempo e foi abandonada.

Que tal usar uma ferramenta como o GNU de cflow , que pode analisar o código e produtos gráficos de call-gráficos, aqui está o que o href="http://www.opengroup.org/onlinepubs/000095399/utilities/cflow.html" rel="nofollow noreferrer"> OpenGroup (man page)

Espero que isso ajude, Cumprimentos, Tom.

scroll top