Help! Clang Tidy



  • Hallo!

    Ich bin ein kompletter Anfänger und wollte mehr über Code Beautifier und Clang Tidy lernen. Ich habe das noch nie gemacht und brauche Eure Hilfe 🙂
    Ich habe eine Liste von Formatierungsregeln, die ich gerne abarbeiten möchte.
    Ich habe mir 15 Formatierungsregeln überlegt, die ich befolgen möchte:
    keine /.../ Stilkommentare verwenden
    Beschriftungen gut lesbar machen
    konsistente Zeilenenden sicherstellen
    Boolesche Ausdrücke sauber layouten
    Leerzeichen um binäre Operatoren ausgleichen
    kein Leerzeichen nach Nicht-Wort-Präfix-Operatoren
    kein Leerzeichen vor Postfix-Operatoren
    nicht mehr als 60 Zeilen in einem Block
    nicht mehr als 60 Zeichen in einer Kommentarzeile
    Vermeiden Sie mehr als 500 bis 1000 Zeilen pro Datei
    vermeiden Sie mehr als 140 Zeichen pro Zeile
    jede Anweisung oder Deklaration in einer neuen Zeile beginnen
    Break, Continue und Return zur tieferen Verschachtelung bevorzugen
    identifizieren, um die Verschachtelung und Fortführung von Anweisungen und Deklarationen zu berücksichtigen
    Vermeiden Sie mehr als drei Ebenen der Verschachtelung
    Raum um geschweifte, geklammerte und eingeklammerte Bereiche ausgleichen

    Wie sind diese Dinge mit ClangTidy möglich?
    Könntet ihr mir bitte helfen?
    Vielen Dank im Voraus! 🙂

    LG
    Shirl



  • Abgesehen davon dir auszudenken was du gerne machen möchtest: was hat du denn schon unternommen um zu deinem Ziel zu kommen? Wo/woran genau bist du gescheitert?



  • Eigentlich benutzt man clang-format zum Umformatieren der Datei, also für sowas wie "Leerzeichen um binäre Operatoren ausgleichen", Zeilenlängen etc. Das Tool arbeitet auf den Source-Dateien, hat aber kein vollständiges Verständnis für den Code, liest also z.B. keine Header ein.

    clang-tidy dagegen ist für volles Code-Verständnis ausgerichtet und wird verwendet, um im Code nach Problemen zu suchen und ggf. Verbesserungen zu machen. Also sowas wie eine Index-Loop durch eine Range-Loop zu ersetzen. Oder auch Konstrukte zu finden, die z.B. out-of-bound oder anderes UB produzieren. Guckst du hier: https://clang.llvm.org/extra/clang-tidy/checks/list.html - z.B. sowas hier gibt es dort: https://clang.llvm.org/extra/clang-tidy/checks/readability-braces-around-statements.html



  • Hi @hustbaer und @wob ,

    ihr habt natürlich recht. Ich möchte gerne mit Clang-Format arbeiten.
    Hierzu habe ich mir auch schon die Dokumentation durchgelesen und gesichtet und mir ein config-file angelegt.

    Grundsätzlich scheitert es bei mir allerdings an der Umsetzung, da ich völlig neu in dieser Thematik bin und mir unsicher darin bin, ob die Befehle das verursachen, was sie sollen.
    Demnach scheitert es wohl bereits an der Eingabe.

    Liebe Grüße



  • Wo ist denn das Problem? Ich fange gerne mit nur ein paar Optionen an, also erstelle z.B. folgende .clang-format im Wurzelverzeichnis deines C++-Projekts.

    BasedOnStyle: llvm
    AllowShortFunctionsOnASingleLine: InlineOnly
    AlwaysBreakTemplateDeclarations: true
    BreakBeforeTernaryOperators: true
    IndentWidth: 4
    AccessModifierOffset: -4
    ColumnLimit: 95
    

    (wie du hier siehst, bevorzuge ich 4 Zeichen Indent statt 2 (default) und erlaube 95 Zeichen/Zeile (default 79 oder 80?))

    Und dann kannst du einfach clang-format -style=file FILENAME.cpp ausführen (wobei du natürlich FILENAME.cpp durch deine Datei ersetzen musst). Noch praktischer ist es natürlich, wenn du das über den Editor / die IDE direkt aufrufst.



  • Hi @wob 🙂

    Ja, ich habe einzelne Befehle wie
    BasedOnStyle: LLVM
    IndentWidth: 4
    UseTab: Never
    ColumnLimit: 80
    Language: Cpp
    Standard: Auto
    DerivePointerAlignment: false
    PointerAlignment: Left
    AllowShortBlocksOnASingleLine: false
    AllowShortCaseLabelsOnASingleLine: false
    AllowShortFunctionsOnASingleLine: None
    AllowShortLoopsOnASingleLine: false
    IndentCaseLabels: true
    PenaltyBreakComment: 0
    PenaltyBreakString: 0
    BreakBeforeBraces: Linux

    bereits herausgefunden und angewendet.
    Allerdings bin ich mir bei dem Rest unsicher, ob es hierfür geeignete Optionen gibt, die meinen Regeln gerecht werden.



  • @shirl sagte in Help! Clang Tidy:

    nicht mehr als 60 Zeilen in einem Block

    Naja, sowas wie "nicht mehr als 60 Zeilen in einem Block" wirst du damit wohl nicht lösen können, denn dann müsstest du ja den Code umschreiben - ne Funktion erzeugen usw.

    Für zu langen Code in einer Funktion kannst du z.B. https://clang.llvm.org/extra/clang-tidy/checks/readability-function-size.html verwenden. Aber nicht für alle deine Bedingungen wird es fertige Checks geben.



  • Hi @wob!

    Vielen Dank für deine Hilfe! 🙂


Anmelden zum Antworten