CodeGuard

Architektur-Überblick

Wie CodeGuard intern aufgebaut ist und welche Teile zusammenspielen.

Architektur-Überblick

CodeGuard besteht aus vier Schichten die getrennt entwickelt und getestet werden. Diese Trennung ist auch der Grund warum die Analyse deterministisch ist, jede Schicht hat klare Eingaben und klare Ausgaben.

Schichten von unten nach oben

1. Analysis (CodeGuard.Analysis)

Liest eine .NET-Solution mit MSBuild ein und baut ein abstraktes Code-Modell mit Typen, Methoden, Properties, Feldern und ihren Beziehungen (Coupling, Vererbung, Methodenaufrufe).

Außerdem läuft hier eine syntaktische Vor-Analyse die spezifische Pattern-Detection macht, z.B. "DateTime.Now wurde direkt aufgerufen" oder "Async-Methode hat keinen CancellationToken-Parameter". Diese Befunde landen als SyntaxIssue-Objekte im Modell.

Output: ein AnalysisModel mit den Collections Types, Methods, Properties, Fields, Events, Namespaces, Assemblies, TypeDependencies und SyntaxIssues.

2. DSL (CodeGuard.Dsl)

Liest .cgr-Dateien ein, parsed sie zu einem AST und kompiliert die LINQ-Queries zu ausführbaren Lambdas. Die DSL ist eine echte Untermenge von LINQ, die Queries werden zu kompilierten Lambdas übersetzt und gegen das Analysis-Modell ausgeführt.

Output: eine Menge ausführbarer Regeln, die gegen das Analysis-Modell laufen können.

Daneben liegt CodeGuard.Dsl.LanguageServer, ein LSP-Server für die VS-Code-Extension. Er gibt IntelliSense für DSL-Property-Namen, prüft Syntax-Fehler live und schlägt Schema-Pfade vor.

3. Output (CodeGuard.Output)

Konvertiert Findings in das angeforderte Format. Text, JSON, SARIF oder GitHub-Annotations. Jeder Output-Formatter ist eine eigene Klasse, neue Formate sind isolierbar.

4. Core (CodeGuard.Core)

Orchestriert die anderen drei Schichten. Cache-Verwaltung, Threading, CLI-Parameter-Parsing, Konfigurations-Loading. Hier wird auch entschieden ob etwas inkrementell oder voll-frisch analysiert wird.

Distributionen

Distribution Was es enthält
CLI (Standalone) Alle vier Schichten in einer Binary, self-contained.
Windows-Installer CLI plus VS Code Extension plus PATH-Setup.
VS Code Extension LSP-Client der den CodeGuard.Dsl.LanguageServer startet und die CLI aufruft.
GitHub Action Composite-Action die die CLI im Portal pullt, läuft und Annotations veröffentlicht.

Daten- und Kontrollfluss

codeguard analyze .
    │
    ▼
 Core.Loader               (liest Solution + .codeguard config)
    │
    ▼
 Analysis.Loader           (parsed Solution mit MSBuild)
    │
    ▼
 Analysis.SyntaxScanner    (erkennt DateTime.Now, leere Catch-Blocks, ...)
    │
    ▼
 Analysis.Model            (Collections aufbauen)
    │
    ▼
 Dsl.RuleLoader            (liest alle .cgr Files)
    │
    ▼
 Dsl.Compiler              (LINQ-Queries -> Lambdas)
    │
    ▼
 Dsl.RuleEngine            (führt Regeln gegen Modell aus)
    │
    ▼
 Core.FindingsCollector
    │
    ▼
 Output.Formatter          (--output console|json|sarif|github)
    │
    ▼
 Stdout / Datei

Was diese Architektur ermöglicht

  • Determinismus weil die Analyse zustandslos ist. Selber Input, selber Output.
  • Mehrere Output-Formate ohne dass die Analyse-Schicht etwas davon weiß.
  • Eigene Regelpakete weil die DSL die Schema-Stabilität als Vertrag hat. Wir brechen das Modell nicht zwischen Patches.