Prüfstand für Testwerkzeuge: Codeanalyse im Praxiseinsatz

Seite 3: Parasoft C/C++test

Inhaltsverzeichnis

Parasoft ist einer der älteren Player im Markt und einer der wenigen, die in Europa entwickeln. Das Tool ist ausschließlich auf C und C++ ausgelegt – wobei es auch getrennte Varianten für .Net und Java gibt. Es läuft auf Linux und Windows und besitzt ein Plug-in für die Eclipse-Entwicklungsumgebung. Darüber hinaus unterstützt es die Einbindung in Continuous-Integration-Tools (CI) wie Jenkins oder Bamboo.

Wie alle anderen komplexeren Werkzeuge zeigt es an, welche Programmteile es untersucht hat (Coverage). Die Ergebnisse der Tests waren allerdings enttäuschend. Das war nach Auskunft des Herstellers der Tatsache geschuldet, dass die Tests mehrere bekannte Fehler in der Software trafen, die erst in der nächsten Version bereinigt werden sollten.

Dazu gehört folgendes Beispiel, das aus der NIST-Testsuite "Juliet" für statische Quellcodeprüfer stammt und einen "double free"-Bug enthält – in einer Form, die Testern bei der manuellen Inspektion eines komplexen Programms leicht übersehen können:

namespace CWE415_Double_Free__no_copy_const_01 {
  class BadClass {
    public:
      BadClass(const char *data) {
        if (data) {
          this->data = new char[strlen(data) + 1];
          strcpy(this->data, data);
        } else {
          this->data = new char[1];
          *(this->data) = '\0';
        }
      }

      ~BadClass() { delete[] data; }

      BadClass &operator=(const BadClass &badClassObject) {
        if (&badClassObject != this) {
          this->data = 
            new char[strlen(badClassObject.data) + 1];
          strcpy(this->data, badClassObject.data);
        }
        return *this;
      }

      void printData() { printf("%s\n", data); }

    private:
      char *data;
  };

  void bad() {
    BadClass badClassObject("One");
    /* FLAW: There is no copy constructor in the class.
     * This will cause a double free in the destructor */
    BadClass badClassObjectCopy(badClassObject);
    badClassObjectCopy.printData();
  }
}  // namespace CWE415_Double_Free__no_copy_const_01

using namespace CWE415_Double_Free__no_copy_const_01;

int main(int argc, char *argv[]) {
  bad();
  return 0;
}

Die Software lässt sich im Vergleich mit den anderen mit den wenigsten Handgriffen starten. Grundlage ist das in der Desktop-Oberfläche recht komfortable Generieren einer angepassten Policy.

$ cpptestcli \\ 
  -config file:///home/testuser/parasoft.properties \\
  -compiler gcc_7-64 -report ./ -trace make

Die Policy Konfiguration in der c/c++test Deskop Oberfläche (Abb. 1).