Prüfstand für Testwerkzeuge: Codeanalyse im Praxiseinsatz

Seite 2: Viva64 PVS Studio

Inhaltsverzeichnis

PVS Studio gehört zu den günstigsten Angeboten am Markt. Es ist für Linux, macOS und Windows verfügbar und analysiert Code in den Programmiersprachen C, C++, C# und Java.

Für das Tool existiert eine Visual Studio Extension, mit der Entwickler ihren Code aus dem Editor heraus prüfen können. Im Gegensatz zu anderen Werkzeugen bringt PVS Studio keine grafische Bedienoberfläche mit, sondern setzt auf Kommandozeilenbefehle zum Ausführen und Steuern. Die HTML-Ausgabe der Kommandozeilenprogramme ist allerdings durchaus übersichtlich.

In der Enterprise Variante von PVS-Studio (ab 10 Entwicklern) ist auch eine Integration in SonarQube enthalten.

Im Vergleich zu den anderen Produkten hat es wenige Sicherheitsprobleme identifiziert, war aber das einzige Programm, das einen Buffer Overflow im memcpy() in folgendem Codeschnipsel gefunden hat:

int main(int argc, char *argv[]) {
  char buf[128];
  // atoi() gibt auch Minuswerte zur�ck:
  int user_len = atoi(argv[2]); 
  // Pr�fung wird durch Minuszahlen umgangen:
  int buf_size = sizeof(buf);

  if (user_len > buf_size) { 
    printf("Attempted Overflow Detected\n");
    return -1;
  }

  // ein Minuszeichen wird als gesetztes
  // h�chstwertiges Bit interpretiert:
  memcpy(buf, argv[1], user_len); 
  return 0;
}

PVS Studio lässt sich folgendermaßen verwenden:

$ pvs-studio-analyzer trace -- make
$ pvs-studio-analyzer analyze -o \\
  pvs-studio.out \\
  -l /home/testuser/.config/PVS-Studio/PVS-Studio.lic
$ plog-converter -a GA:1,2 -t tasklist -o \\
  pvs-studio.txt  pvs-studio.out

Die generierte Datei pvs-studio.txt enthält folgende Erkenntnisse:

/opt/vulntest/strcpy.c 11 warn V618 \\
  It's dangerous to call the 'printf' function \\
  in such a manner, as the line being passed \\ 
  could contain format specification. The example \\ 
  of the safe code: printf("%s", str);

/opt/vulntest/strcpy2.c 13 warn V618 \\
  It's dangerous to call the 'printf' function \\
  in such a manner, as the line being passed \\ 
  could contain format specification. The example \\
  of the safe code: printf("%s", str);

/opt/vulntest/use_after_free.c 29 err V595 \\
  The 'container.foo.b' pointer was utilized \\
  before it was verified against nullptr. \\
  Check lines: 29, 33.