lclint
-=-=-=-=
Thus spake the master programmer:
"When you have learned to snatch the error code from
the trap frame, it will be time for you to leave."
-- Geoffrey James, "The Tao of Programming"
Zcela jiným přístupem jsou programy typu lint. Lint má klasicky
za úkol zkontrolovat syntax programu bez nutnosti použít opravdový
překladač. Lint většinou pracuje mnohem rychleji a detekuje mnohem
více warningů zejména co se týče portability programu, standardů
a dalších fines.
Dlouho chyběla free implementace podobného programu, protože gcc
-Wall udělá většinu jeho práce. Lclint toho ale umí přece jenom víc.
Překvapením pro mne bylo, že dokonce dokáže kontrolovat nejčastější
chyby při práci s pamětí a najde chyby v mých testech. Samořejmě, že
najde pouze poměrně zjevné chyby. Trochu zkušený programátor snadno
napíše program tak, že žádný podobný program nebude mít šanci chybu
odhalit (podobně jako sám programátor).
Lclint má také tendenci k planým poplachům a nejde stovky chyb
i v programu, kde žádné takové chyby nejsou. Na mých šestiřádkových
testech dokázal někdy najít i stránku a půl nedostatků. U delšího
programu je pak takový výpis zcela nepoužitelný, protože je často
o dost větší než vlastní program.
Pravděpodobně pokud lclint používáte systematicky od začátku,
taková situace nenastane. Lclint umožňuje do programu přidávat
anotace ve formátu speciálních komentářů, které zabrání planým
poplachům a umožní další testy. Můžete určit, kdy ukazatele nemůžou
být NULL, které parametry nejsou použity, co by se měnit mělo,
co by zase nemělo apod. Pokud do programu přidáte takové "smetí",
lclint asi najde i mnoho užitečných nedostatků. Jednou až se zase
pustím do nějakého nového většího programu, asi to zkusím.
A nakonec výsledky:
Chyby pro použití haldy
zapomenuté naalokované bloky paměti Fresh storage c not released
before return
uvolnění nenaalokovaného bloku
vícenásobné uvolnění bloku Dead storage c passed as out
parameter: c
alokace a realokace bloku o velikosti 0 Index of possibly null pointer c: c
použití paměti bez testu na selhání malloc Index of possibly null pointer c: c
Chyby pro použití ukazatelů
použití uvolněného bloku pro zápis Variable c used after being
released
použití uvolněného bloku pro čtení Variable c used after being
released
zápis za koncem pole v zásobníku
zápis za koncem alokovaného bloku
čtení za koncem alokovaného bloku
zápis daleko za koncem alokovaného bloku
zápis před koncem alokovaného bloku
čtení před koncem alokovaného bloku
čtení neinicalizované paměti Array element c[3] used before
definition
Zdrojové kódy najdete na:
sunsite.ms.mff.cuni.cz/pub/Linux/devel/lang/c
výheň