2012-07-30 12 views
5

il nostro progetto è davvero grande. la dimensione dei codici sorgente è di circa 620KLOC in un modulo. Quindi voglio verificare quale funzione è la più grande in una directory/modulo? C'è qualche strumento in grado di supportarlo?Quale strumento può mostrare le dichiarazioni massime di Metodo o funzione in C++?

SourceMonitor ha solo "Dichiarazioni medie per metodo", non dichiarazioni massime per metodo. CCCC non supporta neanche.

esempio. Questa lunghezza della funzione è 1.

unsigned short get() 
{ 
    return 1; 
} 

Grazie.

+0

Dubito che ciò sia possibile con gli strumenti correnti. – iammilind

+0

Clang offre un'infrastruttura pulita per la scrittura di vari strumenti di livello sorgente. Puoi usarlo per sviluppare il tuo strumento. – arrowd

+0

potrebbe variare se si utilizzano le ottimizzazioni – Zaffy

risposta

2

La cosa più semplice a cui riesco a pensare è lo scripting.

  • Usa ad esempio ctags per ottenere un elenco di funzioni nel file
  • Usare Perl/Python/awk/grep per dividere il file sorgente in file separati, un file per ogni funzione
  • Basta contare le linee di ogni file, prendi la lunghezza massima. Se hai bisogno di maggiori dettagli, carica ogni file in un loc-counter, ad es. sloccount a
    ottenere informazioni più raffinate. Usare grep di nuovo per ottenere il risultato si è interessati a

Un altro strumento che potrebbe essere di aiuto:

pigro C++: E 'è un generatore di codice che divide i file che sono molto simili a C++ in intestazione e fonte. Se scrivi che trasformi il tuo codice in un file lzz, il codice generato include tag contatore di riga per funzione. Le differenze in questi numeri ti mostrerebbero quanto sono grandi le tue funzioni

+1

invece di dividere in file diversi, raccomanderei l'uso di ctags con -x, nel numero della riga di output leggibile dall'uomo sono indicati. ordinare da loro, ed è facile calcolare le linee (quel numero è solo di circa, ma dovrebbe essere sufficiente per trovare il più grande) per funzione – flolo

+0

Non ho usato ctags prima. Guarderò l'introduzione e cercherò di capirlo. – liuzw

+0

Cuciture molto potenti. Flolo e Martin, ci sono familiari? puoi dare i comandi per supportare i miei requisiti? Grazie mille – liuzw

0

Penso che molti strumenti di analisi statica potrebbero non darti quello che ti serve dato che non tengono necessariamente conto di cose come le istanze dei template, inclusioni di intestazione (comprese quelle tirato da intestazioni precompilate) e le caratteristiche di generazione del codice del compilatore.

Ho affrontato un problema simile in passato, con un grosso eseguibile le cui dimensioni erano dominate da una particolare libreria. Il modo in cui sono arrivato al fondo era semplicemente quello di guardare la dimensione dei file oggetto per ogni .cpp. Questo non ti darà tutta la storia, dal momento che il linker ottimizzerà le porzioni inutilizzate (anche se vale la pena di controllare che hai impostato l'opzione - /OPT:REF per Visual Studio). Ti permetterà comunque di focalizzare la tua ricerca. Trova i due o tre file oggetto più grandi e poi guarda i corrispondenti file .cpp. Hai quindi due opzioni: scrivi uno script che prende l'output di objdump (VisualStudio) o nm -C (gcc) in cui puoi estrarre gli offset di ogni funzione nel modulo, in modo da poterli differire ciascuno con il precedente per avere un'idea della dimensione di ciascuna funzione.

Oppure il metodo più semplice è solo utilizzare la ricerca binaria sul file cpp. #ifdef tutto il codice dopo la fine del #include e compilarlo. Questo ti darà un'idea dell'overhead degli include (se questo è enorme allora puoi scavare nelle inclusioni dell'header per trovare quale contribuisca di più). Successivamente, disabilita ogni metà del codice con #ifdef e trova quale metà è il più grande. Utilizzando questo metodo è possibile trovare rapidamente le funzioni che contribuiscono maggiormente alle dimensioni della libreria.

Nel caso della libreria che ho avuto questo stesso problema, la causa si è rivelata essere una funzione di modello molto ampia che veniva istanziata ogni volta che veniva salvata una variabile membro. La soluzione in quel caso era di rendere la funzione concreta in modo tale che tutto il codice che non richiedesse un comportamento specifico del tipo venisse istanziato una sola volta e le funzioni del template fossero localizzate per i bit di logica che sono specifici del tipo.

+0

Gli strumenti di analisi statica sono abbastanza per me. Possiamo ignorare i codici modello perché i nostri codici modello sono piccoli. Alcuni dei nostri metodi "normali" in C++ sono più di 600 righe di codice. E non penso che le dimensioni del file dell'oggetto possano ottenere le linee del codice del metodo, tranne un file ha un metodo. Ma non è vero per noi. – liuzw

0

CppDepend fornire queste informazioni, si basa su Clang e con CQLinq è possibile richiedere il codice desiderato.

1

È possibile eseguire la scansione del progetto con lo strumento SourceMeter e, per le proprie esigenze, fornisce file CSV contenenti funzioni/metodi con metriche (tra cui le metriche di dimensioni che si stanno cercando) e il modulo di contenimento (ad esempio libreria, oggetto condiviso, eseguibile). Usando un editor di fogli di calcolo puoi facilmente trovare le funzioni/i metodi più grandi per modulo.

Problemi correlati