Indrømmelse: Jeg er hysterisk med C/C++ kode
Jeg har hen over de sidste par måneder været med i et projekt, hvor vi
skulle rydde op i noget C/C++ kode på Linux, hvor der var en del
problemer. I dette blog-indlæg sætter jeg fokus på hvor "hysterisk"
man kan sætte sin GCC/GLANG C eller C++ compiler op, og der er ikke
fokus på dynamisk kode-check. Det regner jeg med at vende tilbage til
i et andet blogindlæg.
Basic-flag
Jeg startede projektet med at tilføje compile flag til GCC så vi fik
fockus på de værste problemer i koden. Jeg starter altid med "-Wall",
som giver en hel del advarsler af forskellig art, men f.eks. får man
ikke advarsler om variable som skygger for hinanden eller manglende
prototyper i headerfiler. Derfor starter jeg også med "-Wshadow
-Wimplicit-function-declaration"
CFLAGS := -Wall -Wshadow -Wimplicit-function-declaration
Strammer op
Efter at der kom styr på at alle basis-fejl blev rettet op, gik jeg
mere hårdt til værks, med at lede efter ubrugte variable, eller steder
hvor resultater ikke blev brugt, type-konverteringsfejl og endelig tre
hystade-flag "-ansi -pedantic -Wextra".
-Wunused-variable -Wunused -Wunused-result -Wconversion -ansi -pedantic -Wextra
Det skal lige nævnes at "-pedantic" er koblet til "-ansi", og måske er det mange sammenhænge
smartere at se på f.eks. "-std=c99" eller en tilsvarende C++ standard, da "-ansi" bl.a. blokerer
for v
For at få fokus på at selv advarsler blev undersøgt, konverterer jeg
advarsler til at blive flaget som fejl.
-fmax-errors=1 -Werror
Hvad betød det at være så hysterisk?
Det har været hårdt at rette koden op, så der ikke er advarsler
tilbage, men det var også en rigtig god oplevelse at rette koden op.
Langt det meste, der kom op i søgelyset var fejl ala.
int c = 1; uint d = c;
Det er kode som næsten altid er ok, men var "c" initialiseret med et
negativt tal, så kan det være mere "underholdende".
Der var også få tilfælde, hvor mere subtile men rigtige fejl pludselig kom
til overfladen.
Efter at være kommet i bund med fejl og advarsler har det været skønt
at arbejde med koden fordi nye advarsler drukner i listen af gamle
advarsler. Nu ved at jeg en advarsel er noget nyt og noget at jeg bør
kigge på. Overraskende har der ikke været surhed fra de andre
udviklere over at køre så hysterisk. Alle har taget godt i mod det,
men det var en hård fase at luge alle advarsler ud.
Et godt trick til at skrive makefiler er også at lave understøttelse
for forskellige niveauer af advarsler, så man i en stor restruktureringsøvelse kan køre med lavt
niveau af advarsler og senere i et udviklingsforløb få de mere detaljerede advarsler frem.
Andre GCC/G++ flag
Der er tonsvis af flag man kan give GCC og har du haft god anvendelse
af andre compilerflag, så skriv gerne om dem nedenfor.
En anden sjov erfaring er at selvom jeg f.eks. har slagtet alle
advarsler ned for en compiler, så er min erfaring at forskellige
compilere giver forskellige advarsler. De nyeste udgaver af Visual
Studio giver nogle valide advarsler, som GCC ikke fanger. At hoppe
mellem forskellige compilere er guld.
/pto

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.
Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.
Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.
Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.