Spis treści

View page as slide show

Statyczna analiza kodu

Analiza statyczna kodu - analiza struktury kodu źródłowego lub kodu skompilowanego bez jego uruchomienia.

Static Analysis Software Testing (SAST) - narzędzia do automatycznej analizy statycznej

Analiza statyczna a inspekcja kodu („code review”)

SDL for Agile

Agile Development Using Microsoft Security Development Lifecycle - analiza statyczna w każdym sprincie

Źródło: http://www.microsoft.com/security/sdl/discover/sdlagile.aspx

Metody analizy

Zalety

Wady

Czego dotyczy analiza statyczna

Dlaczego analizować kod?

Statyczna analiza programu pozwala na:

Dlaczego analizować kod?

Koszt naprawy błędu w zależności od momentu wykrycia

benefits.jpg

Źródło: http://www.microsoft.com/security/sdl/about/benefits.aspx

Narzędzia

Lint - UNIX V7 1979, historyczny program od którego nazwy często określa się narzędzia do analizy i szukania błedów

Wielojęzykowe

Wiele innych:

Kompilatory

Kompilatory oprócz sprawdzania składni również potrafią sygnalizować możliwość występowania błędu w kodzie.

GCC warning options

Visual C++: warning level 4

cppcheck

Cppcheck
Online Demo

Wykrywane błedu

Ograniczenia

// calculate the number of days
int days = hours / 23;

Przykład

int main()
{
   char *x;
   int a[20];
 
   *x = 5;
   a[20] = 5;
 
   return 0;
}
cppcheck --enable=all test1.c 
Checking test1.c...
[test1.c:4]: (style) Variable 'x' is not assigned a value.
[test1.c:8]: (style) Variable 'a' is assigned a value that is never used.
[test1.c:8]: (error) Array 'a[20]' accessed at index 20, which is out of bounds.
[test1.c:7]: (error) Uninitialized variable: x
Checking usage of global functions..

Przykład

#include <stdio.h>
int main()
{
    char c;
    while (c != 'x');
    {
        c = getchar();
        if (c = 'x') return 0;
        switch (c) {
        case '\n':
        case '\r':
            printf("Newline\n");
        default:
            printf("%c",c);
        }
    }
    return 0;
}

Źródło: wikipedia.org

Przykład: buffer overflow

Śledzenie wywołań funkcji:

void f1(char *s)
{
   s[20] = 0;
}
 
void f2()
{
   char a[10];
   if (x + y == 2) {
      f1(a);
   }
}
Array 'a[10]' index 20 out of bounds

Prawie to samo ale cppcheck już nie wykrywa błędu

void f3(char *s)
{
   if (x + y == 2) {
      s[20] = 0;
   }
}
 
void f4()
{
   char a[10];
   f3(a);
}

Wycieki pamięci

void f()
{
   char *a = malloc(10);
   if (x + y == 2) {
      return;
   }
   free(a);
}

Wynik cppcheck

[mem.c:5]: (error) Memory leak: a
void f2(int x)
{
   char *a = 0;
   if (x == 10)
      a = malloc(10);
   if (x == 20)
      free(a);
}

Brak błedu?!

Automatyzacja testów

Przykłady: FindBugs, Cppcheck+TortoiseSVN SVN pre-commit

Źródła