Serve aiuto per eliminare percorsi e variabili del codice morto dal codice sorgente C

7

Ho un codice C legacy sulle mie mani e mi viene assegnato il compito di filtrare simboli e percorsi morti / inutilizzati. Nel corso del tempo ci sono stati molti inserimenti e cancellazioni, causando molti simboli inutilizzati. Ho identificato molte variabili morte che sono state scritte solo una volta o due, ma non sono mai state lette da.

Entrambi i test blackbox / whitebox / regression hanno dimostrato che la rimozione del codice morto non ha influito su nessuna procedura. (Abbiamo una suite di test completa).

Ma questa rimozione è stata eseguita solo su una piccola parte del codice. Ora sto cercando un modo per automatizzare questo lavoro.

Ci affidiamo a GCC per fare il lavoro.

P.S. Sono interessato a rimuovere cose del tipo:

  1. variabili che vengono letti solo per poterli leggere.
  2. variabili che sono distribuite su più file sorgente e che vengono scritte solo su

Ad esempio:

file1.c:
int i;

file2.c:
extern int i;
....
i=x;
    
posta Anjum Kaiser 06.07.2012 - 08:04
fonte

2 risposte

5

Dovresti controllare cosa può fare scan-build di clang per la tua build. A volte può determinare se una variabile viene scritta solo, ma i risultati non vengono mai utilizzati ( Dead store nella lingua di scan-build).

Il problema che hanno tutti questi strumenti è che non possono determinare se una chiamata come

int status = do_something(input_var);

fa più dell'assegnazione di un valore a status , ad es. do_something potrebbe modificare non solo input_var , ma anche lo stato globale. Quindi, quando pulisci la roba, assicurati di controllare cose che si basano su effetti collaterali.

scan-build si integra perfettamente nel processo di build basato su make, ad es.

$ scan-build ./configure
$ scan-build make

esegue il tuo codice tramite scan-build quando si utilizzano gli autotools.

Puoi anche provare cppcheck , ma nella mia esperienza non trova più di quello che trova la scansione-build (e scan- build può trovare altri problemi che cppcheck non può vedere).

    
risposta data 06.07.2012 - 09:29
fonte
1

Se non mi sbaglio, il PC-Lint / FlexeLint di Gimpel è in grado di dirti se le cose stanno andando inutilizzato. Credo che dall'ultima volta che l'ho usato (molte lune fa), selezionerà le variabili mai usate, le funzioni mai usate, le intestazioni mai utilizzate, ecc. Ecc.

Ha anche un qualche tipo di sistema per incorporare i tag per disattivare gli avvisi su determinate righe di codice, se lo desideri.

Si noti che quando ho usato questo strumento per trovare percorsi di codice inutilizzati, era un processo multi-pass - esegui lo strumento, rimuovi tutte le cose inutilizzate, esegui lo strumento, trova altre cose inutilizzate (perché avevo appena rimosso le funzioni che erano gli unici utenti di alcune altre funzioni), ecc. ecc.

Un po 'caro, temo, ma strumenti piuttosto buoni, e se hai solo bisogno di una licenza per superare questo problema, piuttosto che uno per dev da integrare con la tua build, allora non è male. Sembra che le licenze per PC siano molto più economiche, quindi se ne comprate solo una per questo lavoro, ci proverei.

    
risposta data 06.07.2012 - 13:17
fonte

Leggi altre domande sui tag