7 Stimmen

Wie kann man Coverity-Statikanalyse kompatibel mit dem C++0x-Standard machen?

Ich verwende einen Wind River Compiler 4 (gcc (C) und g++ (C++)) und er kompiliert alle meine Projekte ohne Probleme. Jetzt muss ich Coverity Static Analysis verwenden, um meinen Code zu überprüfen. Ich habe die spezifischen Compiler konfiguriert. Für den C-Code (gcc) gibt es keine Probleme und ich kann die Analyse durchführen, aber für den C++-Code (g++) erhalte ich viele Fehler:

.../c++config.h", Zeile 214: Fehler #40:
    erwartete einen Bezeichner
inline namespace __gnu_cxx_ldbl128 { }
       ^

.../c++config.h", Zeile 214: Fehler #326:
    inline-Spezifizierer nur bei Funktionsdeklarationen erlaubt
inline namespace __gnu_cxx_ldbl128 { }
^

.../c++config.h", Zeile 214: Fehler #65:
    erwartetes ";"
inline namespace __gnu_cxx_ldbl128 { }
                                   ^
.../include/string.h", Zeile 76: Fehler #312:
    Funktionen können nicht allein anhand des Rückgabetyps unterschieden werden
extern __const void *memchr (__const void *__s, int __c, size_t __n)
                     ^

.../include/string.h", Zeile 116: Fehler #312:
    Funktionen können nicht allein anhand des Rückgabetyps unterschieden werden
extern "C++" __const void *memchr (__const void *__s, int __c, size_t __n)
                     ^

Es scheinen sich einige C++11-spezifische Funktionen wie der inline-namespace zu handeln, aber der Code verwendet diese Funktionen nicht. Die oben aufgeführten Fehler wurden mit einem HelloWorld-Code erzeugt:

#include "stdio.h"
#include "util.h"
#include 
#include "string.h"

using namespace std;

int main()
{
    printf("Hallo Welt, C++ Version: %d.%d.%d\r\n",__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);

    return 0;
}

Ich habe versucht, den C++-Standard mit der g++-Option festzulegen

-std=c++98

aber das Ergebnis hat sich nicht geändert.

Der Test-Code befindet sich in einer großen Build-Hierarchie, aber die Schritte für Coverity sind wie folgt:

  1. Ziel und Umgebung einstellen (Wind River 4 Linux)
  2. make clean
  3. cov-configure mit Compiler-Verzeichnis und Typ
  4. cov-build mit dem richtigen "make all"-Befehl, der alleine funktioniert
  5. cov-analyze
  6. wenn (kein Fehler) cov-commit-defects

Ich habe auch Coverity konfiguriert, um alle "inline namespace" während des cov-builds durch "namespace" zu ersetzen (--ppp-translator replace/inline namespace/namespace). Die Inline-Fehler sind verschwunden, aber es treten mehr dieser Überlastungsfehler auf und es kommt nicht zu einem erfolgreichen Build. Ich habe auch versucht, das "C++" auf die gleiche Weise zu entfernen, aber es hat nicht funktioniert, es gibt immer mehr Fehler.

Hat jemand eine Idee, was hier das Problem ist? Und wie kann ich den Coverity-Build ohne Fehler durchführen? Vielleicht kann ich Coverity konfigurieren, um Standard-C++-Header zu ignorieren, aber ich weiß nicht wie?

5voto

bames53 Punkte 82553

Ihre Bibliotheksimplementierung verwendet C++11. Wahrscheinlich gibt es #ifdefs, die alle C++11-Sachen entfernen, wenn Sie g++ mit -std=c++98 aufrufen, aber anscheinend definiert Coverity nicht die gleichen Dinge, die erforderlich sind, um die C++11-Funktionen zu vermeiden.

Sie sollten herausfinden, welche Makros gcc verwendet, um den C++11-Code herum sind und sicherstellen, dass Coverity sie angemessen definiert, wenn es Ihr Projekt analysiert.

5voto

Indimental Punkte 826

Workaround von Coverity Support:

Der Inline-Namespace ist ein bekannter Fehler in Coverity. Um ihn zu umgehen, konfigurieren Sie Coverity mit den folgenden zusätzlichen Optionen (in der Konfigurationsdatei):

  --ppp_translator 
  ersetzen/inline namespace ([_a-zA-Z0-9]*)\s+\{\s*\}/namespace $1 { } using namespace $1; 

Nachdem wir einige andere Fehler erhalten haben, scheinen sie alle zu String-Definitionen zu gehören. Fügen Sie nun eine Coverity-Definition am Anfang von coverity-compiler-compat.h hinzu (auch im Konfigurationsverzeichnis):

#define __COVERITY_NO_STRING_NODEFS__

Nach diesen Änderungen läuft der cov-build ohne Fehler und die Analyse kann gestartet werden.

0voto

Some programmer dude Punkte 377919

Dieser Fehler sagt es ziemlich klar:

~~

inline-Spezifizierer nur bei Funktionsdeklarationen erlaubt

Gibt es einen Grund, warum der Namespace inline ist? Ich habe die Spezifikation nicht verfügbar, also kann ich Ihnen nicht sagen, ob es erlaubt ist oder nicht. (Dass der Compiler es zulässt, könnte ein Bug in GCC sein.)

~~

Versuchen Sie, dieses inline zu entfernen und Coverity wird hoffentlich glücklich sein.

Es scheint, dass Coverity nicht mit einigen C++11-Features aktualisiert wurde, wie etwa Inline-Namespaces.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X