Ist es ratsam, Clang für die Analyse von persönlichem Code in einem Projekt zu verwenden, das mit gcc erstellt wird?

8

Ich fing an, an mehreren C-Projekten zu arbeiten, die mit bauen gcc. Ich glaube, diese Wahl wurde aus mehreren Gründen getroffen:

  • Musste sehr früh für Arm Cross-Compilieren (glaube ich).
  • Leistung ist die erste und wichtigste Spezifikation.
  • gcc war und ist die einfache erste Wahl.

Ich habe keinen Grund, diese Wahl anzufechten, und ich bin sowieso nicht in der Lage, dies zu tun.

Die Codebasis eines einzelnen Projekts ist relativ klein. Jedes Projekt wird mit einem relativ sauberen Makefile erstellt (das derzeit aktualisiert wird), gcc -Wall -Wextrabeschwert sich bei weitem nicht und es werden nur minimale Tests durchgeführt. Es wird keine automatisierte statische Analyse oder Code-Formatierung durchgeführt, und der Code ist syntaktisch nicht konsistent, obwohl er sehr gut lesbar ist und sich durchdacht anfühlt.

Ich möchte nicht jede Codezeile auf einmal neu formatieren, ich beabsichtige, das zu tun, was irgendwo um diese Antwort herum beschrieben wurde (zumal der Kontext wirklich nicht so schlecht ist): Umgestaltung und hauptsächlich Neuformatierung so weit wie möglich, wenn es um ein Thema geht, Aber immer noch Themen ohne Absichten im Codestil. Leider bin ich nicht in der Lage, Commits einen Codestil oder zusätzliche Überprüfungen aufzuerlegen, aber ich bin der Meinung, dass meine Kollegen der Meinung sind, dass Sie beim Ändern einer Datei die vorhandene Codekonvention respektieren sollten (obwohl mir der aktuelle Status bekannt ist des Codes geschah nicht auf magische Weise) und der Wunsch, guten Code zu schreiben.

Dies ist das erste Mal, dass ich in C mit einem solchen Geisteszustand programmiere, und ich bin sehr angetan von den verschiedenen Tools zur Codeanalyse und -formatierung clang.

Der Kern meiner Frage lautet also: Könnte es zu Problemen führen, wenn ich beim Erstellen von clangHinweisen Hinweise verwende und clangFormatierungs- und Analysewerkzeuge verwende gcc? Beispielsweise könnten einige Warnungen von einer internen Darstellung stammen, gccdie nicht verwendet wird, oder von Bytecode clang, der generiert gccwerden soll, was nicht der Fall ist .

Gibt es eine gute Möglichkeit, die gccKompilierungsparameter (hauptsächlich die Zielarchitektur und die Optimierungsstufe) automatisch zu übergeben , clangdamit die Warnhinweise sinnvoll sind?

Ich werde hinzufügen, dass ich mit gccund seiner Fehlerberichterstattung vertraut bin . Ich bin daran interessiert, mehr (relevante) Warnungen und Fehler zu erhalten, nicht nur besser formulierte und verständlichere Warnungen. Wenn ich also zusätzlichen Hinweisen nicht vertrauen clangkann, die aufgrund ihrer internen Darstellung erstellt werden können, weil ich gccam Ende des Tages damit baue , dann bin ich nicht wirklich daran interessiert.

Ich habe viel Kontext aufgenommen, also zögern Sie nicht, eine Bemerkung zu machen oder eine zugrunde liegende Frage zu beantworten, die ich nicht herausbringen konnte.

nathdwek
quelle
In Bezug auf Codekonventionen achtet er darauf, Ihre Favoriten nicht auf ein vorhandenes Projekt zu übertragen. Es ist unwahrscheinlich, dass die Dinge wesentlich besser werden und andere Mitwirkende ärgern können. Gleiches gilt für die Auswahl der Werkzeuge. Es ist sehr einfach, sich davon ablenken zu lassen, Dinge auf die "richtige" Weise zu wiederholen, ohne wirklich Verbesserungen vorzunehmen.
Beldaz

Antworten:

9

Beispielsweise könnten einige Warnungen von einer internen Darstellung stammen, die gcc nicht verwendet, oder von Bytecode-Clang, der beabsichtigt, zu generieren, dass gcc dies nicht tut.

Äußerst unwahrscheinlich. Clang warnt Sie vor Ihrem Code, nicht vor einer internen Darstellung, die er verwendet. Alle Warnungen sollten von etwas Verdächtigem stammen, das Sie in Ihrem Code tun, und nicht von Implementierungsdetails von clang.

Möglicherweise haben Sie Probleme, wenn einer der von Ihnen verwendeten Codes nicht standardmäßiges C ++ verwendet. GCC unterstützt viele Erweiterungen von C ++, die von anderen Compilern nicht akzeptiert werden. Wenn Sie eines dieser Elemente verwenden, kann clang die Kompilierung Ihres Codes einfach ablehnen. GCC muss das Kompilieren vieler alter Codes unterstützen und ist (wie ich es verstehe) in einigen Punkten milder als Clang.

Winston Ewert
quelle
2

Ich benutze beide bei der Arbeit, gcc und clang. Natürlich erhalten Sie mit beiden Compilern zusammen mehr Warnungen, und das ist großartig. Andererseits können sich die Warnungen widersprechen.

Der nervigste Fall, den ich gefunden habe, ist, wenn clang eine defaultRegel in erkennt switchund sagt, dass alle Werte bereits abgedeckt sind und gcc darauf besteht, einen defaultFall zu haben ( hier dokumentiert ). Sie werden diesen Widerspruch jedoch nur sehen, wenn Sie auf beiden Compilern sehr strenge Warnungen einrichten.

Subjektiv würde ich sagen, dass Clang strengere Warnungen hat und Sie sogar mehr davon erhalten können, wenn Sie -Weverythingoder sogar den Clang-Analysator (statischer Code-Analysator) verwenden. Aber ich hatte auch Warnungen, die gcc entdeckt hat und die auch wichtig sind.

Die meisten Compiler-Switches haben genau den gleichen Namen. Die Namen der Warnschalter unterscheiden sich. Dies kann ärgerlich sein, wenn Sie -Wno-*Optionen zum Deaktivieren von Warnungen verwenden. Soweit ich sehen kann, können Sie die bedingte Kompilierung in make / cmake nicht vermeiden, aber es ist nicht schwer, dies zu lösen.

Ich würde es vermeiden, Code mit automatischen Werkzeugen zu formatieren. Es ist ärgerlich, weil es die Schuldausgabe verschmutzt. Und dann können langfristige Zusammenschlüsse sehr schwierig werden.

Martin Sugioarto
quelle