Statisk kodanalys på libssh2

April 21st, 2010 by Joachim Strömbergson Leave a reply »

För några dagar sedan släpptes version 1.2.5 av SSH-biblioteket libssh2.

libssh2-logga.

Eftersom jag använder en Steve Jobs-maskin tänkte jag att det kunde vara kul att testa att bygga libssh2 för att se hur väl det funkar. Det korta svaret visade sig vara alldeles utmärkt. Eftersom libssh2 använder autoconf var det bara att köra ./configure och sedan make och biblioteket byggde utan problem.

MacOSXs utvecklingsmiljö Xcode inkluderar förutom kompilatorn gcc även den LLVM-baserade kompilatorn clang, ett projekt Apple aktivt driver utvecklingen av.

Jag har använt clang och tycker att den är bättre på att hitta problem, ger bättre varningar samt genererar något bättre kod än gcc. Jag testade därför att bygga libssh2 med clang. Genom att helt enkelt deklarera CC=clang som parameter till configure gick det sedan att bygga libssh2. Återigen utan varningar och problem.

En funktion som clang inkluderar är statisk kodanalys. Detta innebär att verktyget går igenom alla logiska vägar i programmet och kan detektera felaktig användning av variabler, ex att variabler blir lästa innan de definierats. Clang utför kodanalysen som en del av kompileringen och genererar sedan ett antal rapporter (webbsidor) som visar de vägar genom koden som leder fram till problem den detekterat. Så här kan en rapport se ut:

kodtrace1.

För att köra kodanalysatorn fristående (i ett terminalfönster) och inte genom Xcode finns det ett litet program kallat scan-build. Installationen av scan-build är så svår som att tanka ner och packa upp katalogen verktyget ligger i. Sedan får man se till att köra configure med CC=scan-build som kompilator och dessutom slå på generering av debuginformation vid kompilering.

Kompilering med scan-build to klart längre än med clang eller gcc, men gick igenom utan problem på libssh2. Resultatet blev att den hittade 67 problem. De flesta av dessa var Dead assignment och relaterade problem, dvs ställen i koden där en variabel uppdateras, men sedan aldrig mer blir läst.

Mer intressant var dock att det upp ett antal logiska fel av typen Dereference of undefined pointer value och Uninitialized argument, dvs ställen där en pekare blir läst som inte blivit definierad samt argument som blir använda men som inte blivit initierade. Dessa problem är mer problematiska och skulle kunna öppna för säkerhetsproblem.

Daniel Stenberg, pappa till libssh2 har nu satt upp ett cronjobb som kör clangs statiska analysator på kodbasen en gång per dygn och genererar rapporter. Här finns exempelvis Rapporterna för för dagens körning (2010-04-21) – och libssh2 är nu nere på 28 problem.

För den som vill se hur scan-build rapporterar olika fel är här en rapport för en död tilldelning och här är en rapport för en derefererad, men icke definierad pekare.

Jag tycker att clang och dess statiska kodanalysator är enkla och smidiga att arbeta med och ger bra återmatning vid kodutveckling. clang är BSD-licensierad och finns till ett flertal plattformar. Håller du på att knacka kod tycker jag att du skall testa clang.

No related posts.

Related posts brought to you by Yet Another Related Posts Plugin.

Advertisement

Leave a Reply

You must be logged in to post a comment.