Indirizzare gli avvisi splint sulle funzioni "non utilizzate" mentre vengono passate come parametri
Domanda
Su un mio programma, il checker splint avverte:
expat-test.c:23:1: Function exported but not used outside expat-test: start
A declaration is exported, but not used outside this module. Declaration can
use static qualifier. (Use -exportlocal to inhibit warning)
expat-test.c:38:1: Definition of start
Viene utilizzata la funzione start () . Il programma utilizza il parser XML expat che funziona con i callback. Dai una funzione al parser:
XML_SetElementHandler(parser, start, end);
e il parser lo richiama in alcuni punti. Questo è un linguaggio molto comune in C e mi chiedo perché la stecca si lamenta. Non trovo nulla nelle FAQ o nelle manuale .
Soluzione
Chiami XML_SetElementHandler ()
nella stessa unità di traduzione (normalmente il file sorgente .c) in cui è definito start ()
? In tal caso, l'avviso potrebbe essere corretto: aggiungi statico
alla definizione della funzione e controlla se l'applicazione continua a collegarsi senza errori.
Altri suggerimenti
La parola chiave 'statica' nasconde efficacemente il nome di una funzione da altre unità di traduzione (file .C, di solito). Il codice è ancora lì e da quel file C è possibile ottenere l'indirizzo della funzione (ma non da altri file C). Puoi quindi passare l'indirizzo ad altre unità di traduzione, chiamando le funzioni o restituendo l'indirizzo da una funzione o memorizzandolo in una variabile globale, ecc.
Tendo a dichiarare tutte le funzioni che non vengono esportate come statiche. Mi è stato insegnato e attualmente credo che sia una buona pratica farlo. (Dichiarazione di non responsabilità: come nella maggior parte dei casi, esistono numerose eccezioni a questa "regola".)