Skip to content

Findings und Severities

Was ein Finding ist und wie die drei Severities zu interpretieren sind.

Ein Finding ist die kleinste Einheit Output von CodeCharter. Eine konkrete Stelle im Code an der eine konkrete Regel zugeschlagen hat.

Anatomie eines Findings

Jedes Finding hat:

Feld Inhalt
Rule Slug und Anzeigename der Regel, z.B. datetime-direct-usage
Severity info, warn oder error (maschinenlesbarer Output schreibt die mittlere Stufe als warning)
Category Frei wählbar, gruppiert zusammengehörige Regeln
Entity Name und Art (Klasse, Methode, ...) des Code-Elements, das die Regel getroffen hat
File Absoluter oder relativer Pfad zur Datei
Line Zeilennummer
Column optional, Spaltennummer
Message Was hier konkret gefunden wurde
Description Was die Regel prüft (aus @description der Regel)
Recommendation Was zu tun ist (aus @recommendation der Regel)
Fingerprint Stabile, zeilenunabhängige ID des Findings über Läufe hinweg; wird von --baseline genutzt, um bekannte Findings zu unterdrücken (siehe Baseline)

Im JSON-Output erscheinen Findings als violations neben einem summary-Block:

{
  "summary": {
    "totalViolations": 1,
    "totalTypes": 128,
    "totalMethods": 932,
    "durationMs": 28400
  },
  "violations": [
    {
      "ruleId": "datetime-direct-usage",
      "ruleName": "Direct DateTime/DateTimeOffset usage instead of TimeProvider",
      "severity": "warning",
      "category": "Testability",
      "entityName": "PricingEngine.CalculatePrice",
      "entityKind": "Method",
      "filePath": "src/Domain/PricingEngine.cs",
      "lineNumber": 42,
      "column": 18,
      "message": "Direct call to DateTime.UtcNow",
      "description": "Direct calls to DateTime.Now/UtcNow/Today make code untestable",
      "recommendation": "Inject TimeProvider via constructor and call GetUtcNow()",
      "fingerprint": "a1b2c3d4..."
    }
  ]
}

Severities

CodeCharter kennt drei Stufen.

info

Hinweis. Lässt wie jedes Finding den Build per Default fehlschlagen; mit --fail-on warn oder --fail-on error nehmen Sie info-Findings aus dem Build-Gate heraus. Gut für Regeln die nice-to-haves erwischen: "diese Stelle wäre einfacher lesbar mit folgender Refactoring-Idee". Sollten in der täglichen Arbeit nicht zu viele werden, sonst werden sie ignoriert.

warn

Warnung. Per Default blockiert sie den Build wie jedes andere Finding und ist sichtbar im Output und im Editor. Gut für Konventionen, die Sie kollektiv durchsetzen möchten, etwa Async-Methoden ohne CancellationToken. Mit --fail-on warn greift das Build-Gate nur noch bei warn und error, info-Findings werden durchgelassen.

error

Fehler. Reserviert für Verstöße, die wirklich nicht in den Main-Branch dürfen: kaputte Architektur, Sicherheitslücken, explizit verbotene APIs.

Standard-Verhalten ohne --fail-on: Ohne dieses Flag verursacht jedes Finding jeder Severity (auch warn und info) Exit-Code 1. Exit-Code 0 bedeutet: keine Findings auf oder über dem aktiven Schwellwert. Mit --fail-on warn werden nur info-Findings durchgelassen, mit --fail-on error passieren sowohl info als auch warn ohne den Build zu blockieren.

Wann welche Severity

Faustregel: so streng wie nötig, so freundlich wie möglich.

  • error nur wenn der Verstoß einen echten Schaden anrichten würde (Sicherheit, Stabilität, Vertragsbruch).
  • warn für Konventionen, die das Team kollektiv durchsetzen möchte, mit dem Verständnis, dass es auch begründete Ausnahmen gibt.
  • info für Stil-Empfehlungen die "wäre besser, aber okay so".

Eine Regel die nur error produziert weil "wenn wir schon eine Regel schreiben, soll sie auch was bewirken" ist ein Anti-Pattern. Innerhalb weniger Tage suchen die Devs nach // codecharter-disable statt zu fixen.

Severity einer Regel überschreiben

Die Severity einer Regel ändern Sie in .codecharter/config.yml unter overrides:, und eine Regel schalten Sie unter ignore: ganz ab. Beides wird pro Regel über den Slug adressiert, nicht pro Datei oder pro Zeile. Siehe Konfigurationsdatei für alle verfügbaren Abschnitte.

# .codecharter/config.yml
version: 1
overrides:
  datetime-direct-usage:     # Slug einer eingebauten Regel
    severity: warning        # error | warning | info
ignore:
  - rule: empty-catch-block  # diese Regel komplett abschalten

Um Findings an einer bestimmten Stelle zu unterdrücken, verwenden Sie stattdessen einen // codecharter-disable-Kommentar (siehe Suppressions).

Aggregation

Im Build-Output stehen die Findings sortiert nach Severity, dann Datei, dann Zeile. Doppelte Findings (gleiche Regel, Entity, Datei und Zeile) werden nur einmal gemeldet. Mit --severity <level> legen Sie die minimale Severity fest, die angezeigt wird (Default: info, also alles). Am Ende des Runs gibt es eine Summary; Severity-Stufen ohne Findings werden weggelassen:

  17 violations (3 errors, 14 warnings)
  Analyzed 128 types, 932 methods in 28.4s

Exit-Code-Verhalten und CI-Integration siehe Exit-Codes und Output-Formate.