2013-05-26 18 views
6

Ho un progetto che include una grande libreria di terze parti e sono tenuto a garantire che il progetto sia privo di lanugine. Tuttavia, la libreria ha diverse migliaia di errori.Utilizzo di PC-Lint sul progetto con librerie di terze parti

Modificare la libreria per rimuoverli non è un'opzione: come si gestirà questo in genere?

Attualmente, il codice è stato creato utilizzando Keil uVision ed è qui che viene chiamato PC-Lint, quindi se ciò potrebbe ancora essere il caso migliore.

C'è un modo per specificare che questi sono file di libreria e quindi non dovrebbero essere analizzati?

Grazie.

+0

Quindi stai cercando un modo per ignorare completamente un qualsiasi set di file sorgente? (La tua libreria non è un file oggetto precompilato, stai compilando dal sorgente?) Se salti completamente i file, potresti finire con errori di tipo "funzione non definita" durante il wrap-up globale ... – Ross

+0

Esattamente. Questo è il motivo per cui non escludo solo i file dal comando LINT. È possibile includerli a questo scopo, ma anche indicare che i loro errori dovrebbero essere omessi? – Mark

risposta

7

Ecco le informazioni dal sito Gimpel, credo che copre le opzioni che stai cercando (grassetto aggiunto per enfasi):

Lint utilizza l'etichetta di intestazione "library" per designare queste intestazioni su cui un programmatore non ha controllo (come le intestazioni del compilatore). Per impostazione predefinita, tutto il #include da una directory esterna o racchiuso tra <> è considerato "libreria". Questo può essere modificato mediante l'uso dell'opzione + libclass e ulteriormente ottimizzato con le opzioni +/- libdir e +/- libh. È quindi possibile utilizzare le opzioni -wlib, -elib e -elibsym per controllare solo quei messaggi che vengono emessi dalle intestazioni delle librerie. I file di opzioni del compilatore distribuiti con PC-lint di solito contengono un'opzione -wlib (1) che limita l'output di filamenti dalle intestazioni delle librerie agli errori solo (sopprimendo messaggi di avviso e informativi).

È possibile trovare ulteriori informazioni sul sito Gimpel here.

Inoltre, se non ricordo male, -wlib (0) sopprime tutti gli errori e gli avvisi di libreria ... al contrario di -wlib (1) menzionato sopra. Dovrò ricontrollare quando torno al lavoro. Non ho una copia del manuale con me.

--- EDIT ---

Se si tratta di un'opzione, porrei tutti i file associati con la libreria in una directory diversa. In Keil, puoi andare su "Strumenti-> Imposta PC-Lint". Quindi aggiungere la nuova directory all'elenco di "PC-Lint Include Folders". L'opzione -wlib (0) dovrebbe quindi trattare quelle intestazioni come "estranee" e non restituire errori. Ovviamente, dovresti modificare le impostazioni del progetto per compilare anche i file della libreria.

--- EDIT2 Aggiunto Esempio ---

Va bene, ecco un po 'di test ho cercato di garantire che il mio suggerimento sarebbe lavorare. Ho creato un progetto in una directory che ho chiamato "ex_lib" e ho chiamato il progetto lib_test. In "Gruppo Sorgente 1" Ho creato e aggiunto il file "main.c":

main.c

#include <lib_test.h> 

int main (void) 
{ 
    uint16_t x = 5; 
    uint16_t y = 10; 
    uint16_t total1 = 0; 
    uint16_t total2 = 0; 
    uint16_t total3 = 0; 
    uint16_t total4 = 0; 


    total1 = add(x,y); 
    total2 = sub(x,y); 
    total3 = mult(x,y); 
    total4 = div(x,y); 

    return 0; 
} 

Poi ho creato una sotto-directory chiamata "library" e ha creato un secondo progetto chiamato libreria in quella directory. Il progetto della libreria consisteva dei seguenti file "lib_test.h" e "lib_test.c".

lib_test.h

#ifndef LIB_TEST__ 
#define LIB_TEST__ 

#include <stdint.h> 

extern uint16_t add(uint16_t x, uint16_t y); 
extern uint16_t sub(uint16_t x, uint16_t y); 
extern uint16_t mult(uint16_t x, uint16_t y); 
extern uint16_t div(uint16_t x, uint16_t y); 

#endif /* LIB_TEST__ */ 

lib_test.c

#include "lib_test.h" 

uint16_t add(uint16_t x, uint16_t y) 
{ 
    return (x + y); 
} 

uint16_t sub(uint16_t x, uint16_t y) 
{ 
    return (x - y); 
} 

uint16_t mult(uint16_t x, uint16_t y) 
{ 
    return (x * y); 
} 

uint16_t div(uint16_t x, uint16_t y) 
{ 
    return (x/y); 
} 

Nel progetto biblioteca, alla voce "Opzioni per 'Obiettivo 1' Target", ho selezionato "Crea Biblioteca". Ho quindi compilato il progetto della libreria.

Dopo aver completato correttamente la compilazione, sono tornato al progetto lib_test e fatto clic con il pulsante destro del mouse su "Target1" e selezionato "Aggiungi gruppo". Ho creato un gruppo chiamato "Libreria" e aggiunto il "library.lib" precedentemente compilato dalla directory "library" al gruppo "Library".

Infine, sotto le opzioni per Target 1 (nel progetto lib_test), sono passato alla scheda "C/C++" e aggiunto "libreria" a "Includi percorsi". Sono stato quindi in grado di compilare correttamente (con alcuni avvisi sulle variabili impostate ma mai utilizzate) il progetto lib_test. Sotto "Strumenti-> Set-up PC-Lint" Ho aggiunto il seguente:

PC-Lint Includere cartelle: C: \ Keil_ARM \ RV31 \ INC \ e biblioteca \

Lint eseguibile: C: \ Lint \ LINT-NT.EXE

file di configurazione: C: \ Lint \ LNT \ CO-RV.LNT

ho modificato il file CO-RV.LNT per verificare i miei risultati Lint modificando -wlib(). Quando ho eseguito Lint con -wlib (0) non ho ricevuto avvisi o errori sui miei file di libreria. Poi ho cambiato -wlib (2) e ho ricevuto numerosi avvertimenti su stdint.h.

Questa è sicuramente una semplificazione eccessiva ma dovrebbe darti un buon punto di partenza. Inoltre, ho ricevuto avvisi di Lint sulle mie variabili non accessibili in "main.c", ma mi aspettavo che.

+0

Ho visto questo e l'ho provato - ma per quanto posso vedere, si applica solo ai file di intestazione - è sbagliato? – Mark

+0

Penso che la chiave sia garantire che i file di libreria di terze parti si trovino in una directory "esterna", quindi tutti i #include ai loro file di intestazione farebbero riferimento a tale directory. Potrebbe essere un po 'troppo ingombrante a seconda delle dimensioni del tuo progetto, ma è un'opzione. –

+0

Wow, grazie per la risposta dettagliata! Ho già tutti i file della libreria in una directory dedicata. La separazione in due progetti e l'utilizzo del file della libreria potrebbero funzionare, ma ciò interrompe la funzione "Vai alla definizione di ...", il che è un peccato. La mia preoccupazione di saltare completamente i file è che ritengo sia meglio l'analisi completa del progetto (sia per l'uso con ALOA che per evitare errori di "funzione non definita", quindi tutto sommato, vorrei tenere tutto insieme in modo che la funzionalità di Keil sia non è rotto, ma indica che alcuni file potrebbero contenere errori È possibile? – Mark

Problemi correlati