Först två citat som säger mer än vad jag kan säga:
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are,
by definition, not smart enough to debug it."
- Brian W. Kernighan
"* Every program contains at least one error
* Every program can be made shorter by reducing the code by at least one line
Therefore, by induction, we see that:
- Every program can be reduced to one line of code that doesn’t work"
Det är dock teoretiskt möjligt att skriva bugfri kod men det kräver kunskap och extremt mkt merarbete och ändå kan det vara svårt.
De två huvudsakliga metoderna för att åstadkomma det (bortsett från design, design, design):
* Formellt bevisa koden
* Testa varje möjlig väg genom koden och varje möjligt invärde
Båda ovanstående metoder är utopier.
Knuth har en berömd kommentar om formellt bevisad kod:
"Beware of bugs in the above code; I have only proved it correct, not tried it"
Metodiken som man bör använda är dock att skriva test-fall hela tiden så man kan kontinuerligt testa varje funktion/metod medan man skriver och även efter när det sätts samman i sin helhet. Att se över vilka antaganden som görs och dokumentera, följa och sedan visa att de gäller när du implementerat koden.
Det finns dock språk som gör det möjligt att skriva så gott som buggfri kod men de är inte alltid lämpade för riktiga system. Logikspråket
Prolog och funktionsspråket
Haskell är t ex båda väl lämpade för att skriva, bevisa och testa koden och jag vet att många använder sig av t ex Haskell för att matematiskt bevisa alla antaganden som tagits.
Rent praktiskt, när man kodar själv och inte har för starka krav på korrekthet så är väl den bästa regeln att koda så det är lättläst och enkelt att förstå, kommentera och dokumentera antaganden, testa kontinuerligt och använd de hjälpmedel som finns.
Tips på bra hjälpmedel är t ex att slå på alla potentiellt relevanta varningar i din kompilator[1], använda run-time checkers (
valgrind!!!), om du har tillgång till det så använd programvara för statisk kodanalys.
För projekt i C så rekommenderar jag dig att läsa delar av koden samt designen till
vsftpd eller någon av
D J Bernsteins programvaror för inspiration av hur man skriver enkel, lättläst och idiotsäker kod.
[1] just nu har jag så gott som alltid följande påslaget när jag kodar C (kräver modern version av gcc):
-Wall -Wextra -Wshadow -Wwrite-strings -Wsign-compare -Wfloat-equal -Wconversion -Wmissing-noreturn -Wbad-function-cast -Wswitch-default -Wmissing-prototypes -Winline -Wredundant-decls