2016-07-15 12 views
1

Ich habe Probleme mit Coverity mit meinem C/C++ Code.Coverity Scan überspringt alle Befehle aufgrund der gcc -M Option und scannt nichts

Wenn ich cov-build mit --debug-flags translate-phases ausführen, bekomme ich eine Ausgabe, die vorschlägt, dass alle Compileraufrufe wegen des Flags -M übersprungen werden. Im Wesentlichen (Lesen build-log.txt nach cov-build ausgeführt wird:

ARGS after split: -M -MP <other commands follow> 

Dann wird die nächste Zeile:

Skipping command line '-M -MP <other commands follow>' because argument '-M' is a skip argument 

Das in Coverity zu führen scheint keine meiner Dateien kompiliert und erzeugt daher keine Ausgabe

tut. Coverity einfach nicht unterstützen die -M Flag? Gibt es Workarounds?

Für die Vollständigkeit bin ich uns Coverity Scan 7.6.1 und gcc 4.8.2.

+0

Yeah ... Coverity ist ein großartiges Tool, das einige Dokumentationslücken hat :) Basierend auf dem Log-Element * "... argument '-M' ist ein Sprungargument ..." *, ich vermute es nicht unterstützt (aber es ist nur eine Vermutung). Im großen und ganzen: Warum bitten Sie Coverity, die Ausgabe von Regeln für Make-Abhängigkeiten zu analysieren? – jww

Antwort

0

Ich habe die Antwort vor zwei Stunden herausgefunden.

Für mich ist der cov-configure Befehl erzeugt fünf verschiedene Konfigurations Artefakte (wo 2-5 Ordner sind):

  1. Hauptkonfigurationsdatei
  2. g ++ - config-0
  3. g ++ - config-1
  4. gcc-config-0
  5. gcc-config-1

Ich weiß nicht wirklich, warum es entschieden hat, mir vier Ordner zu geben, zwei für jeden Compiler, aber trotzdem.

In jedem dieser vier Ordner war eine Datei.Alle diese enthielten die Zeilen:

<skip_arg>-M</skip_arg> 
<skip_arg>-MM</skip_arg> 

zu diesem Tag Lesen auf, teilt es den cov-translate Befehl (von cov-build genannt) nicht zu cov-emit jeden Compiler Aufruf zu senden, die entweder dieser Argumente übergibt. Das Entfernen dieser beiden Zeilen löste alles.

Ich kann nicht sagen, warum diese beiden Tags standardmäßig dort waren. Aber es funktioniert jetzt.

+0

Sie haben zwei für jeden - gcc als C, gcc als C++, g ++ als C, g ++ als C++ – Caleb

+0

'-M' ist ein' skip_arg', weil Kompilationen mit '-M' eigentlich nichts kompilieren. Sie benötigen nachfolgende * echte * Compilations, die Coverity kompilieren wird. Das hat Paolos Antwort gesagt. Hast du einen sauberen Build gemacht? Vielleicht war der Grund, warum nur die '-M'-Aufrufe auftraten, die Tatsache, dass alle Build-Artefakte aktuell waren und daher festgestellt wurde, dass keine Kompilierungen erforderlich waren (aber die' -M'-Aufrufe wurden immer noch benötigt, um Abhängigkeiten zu gewährleisten -miteinander ausgehen). – Caleb

+0

@Caleb Ich habe immer saubere Builds gemacht. Der Build-Prozess, mit dem ich arbeite, ist ziemlich kompliziert und ich bin nicht sehr erfahren in C/C++ - Build-Prozessen macht es schwierig zu entziffern, was genau vorgeht. In jedem Fall aber hat das Entfernen dieser beiden Tags dazu geführt, dass Coverity meinen Code gesehen hat und jetzt funktioniert. – Jokab

1

Die Übergabe von -M an den Compiler bedeutet -E, d.h. nur den Präprozessor ausführen. Aus diesem Grund macht Coverity hier überhaupt nichts. Es gibt jedoch keinen Grund, warum es nicht mit dem zweiten Aufruf von gcc fortfahren sollte, das -M nicht enthält und daher kompiliert.

Das heißt, es gibt bessere Möglichkeiten, Abhängigkeiten automatisch als das alte -M Flag zu generieren; Insbesondere neuere Versionen von GCC ermöglichen das Kompilieren und Generieren von Abhängigkeiten mit einem einzigen Befehl. Die entsprechende Make-Datei Idiom ist dies:

# the magic is all in this line 
DEPFLAGS  = -MMD -MP -MT [email protected] -MF $(@D)/$(*F).d 

# remember to change the spaces to tab here! 
# anyway this is just an example. All you need to do is to add 
# $(DEPFLAGS) to your usual C compilation rule. 
.c.o: 
     $(CC) $(CFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o [email protected] $< 

# same for C++ 
.cc.o: 
     $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o [email protected] $< 

# at the end of the makefile, include the dependencies 
-include $(wildcard *.d) 

Sie können so etwas wie -include $(wildcard */*.d *.d) benötigen, wenn Sie einen nicht rekursiven Makefile haben. Aber dieser Teil wird wahrscheinlich Ihren bestehenden Regeln sehr ähnlich sein.

Dies wird here beschrieben und die verknüpfte Webseite wird mehr Informationen zur automatischen Abhängigkeitsgenerierung liefern, als Sie dachten, dass es existieren könnte.

+0

Während Ihre Antwort interessant ist und ich danke Ihnen dafür, bin ich nicht in der Lage, die Art zu ändern, wie der Build-Prozess in irgendeiner Weise funktioniert. Also diese Antwort hilft leider nicht wirklich. – Jokab

+0

@Jokab Aber führt Ihr Build-Prozess GCC nach dem '-M'-Aufruf ein zweites Mal aus? (Ich interessiere mich für die Antwort sowohl mit als auch ohne 'cov-build'). –