Sonar-inspirierter statischer Code-Analyser fuer Delphi/Object-Pascal-Code. Findet Memory-Leaks, Code-Smells, Sicherheitsluecken und Wartbarkeits-Probleme.
🇬🇧 English version · 🇫🇷 Version française
Das Repository enthaelt zwei Komponenten:
| Komponente | Zweck | Pfad |
|---|---|---|
| Standalone-EXE | Stand-alone-Tool zum Analysieren von Verzeichnissen | StaticCodeAnalyserForm/ |
| IDE-Plugin | Dockbares Tool-Fenster in der Delphi-IDE | StaticCodeAnalyserIDE/ |
- 198 Regeln (175 Pascal + 23 DFM) — siehe
DETECTORS_de.mdundrules/sca-rules.jsonfuer den kanonischen Stand (Sonar + SonarDelphi-Migration + DFM + Bonus) - Sonar-Style Stat-Tiles ueber dem Grid: Fehler / Warnungen / Hinweise / Bugs / Code-Duplikate / Code-Quality als Letter-Grade A–E (Rohscore + Breakdown im Tooltip)
- Severity-Filter + Typ-Filter (Bug, Code Smell, Vulnerability, Security Hotspot, Code Duplication)
- Help-Panel rechts mit "Vorher/Nachher"-Code-Beispielen je Befund
- Claude-AI-Prompt-Generator — Klick auf eine Zeile legt einen kompletten Markdown-Block in die Zwischenablage
- VCS-Branch-Mode — analysiert nur in der Branch geaenderte Dateien (siehe unten)
- Suppression ueber
// SCA: ignoreKommentare - Export als CSV / JSON / Jira / HTML
- Theme-Aware — folgt dem aktiven Delphi-IDE-Theme (Light/Dark/Mountain Mist/Carbon)
- Recent-Pfade persistiert pro Session
- Ignore-Liste unter
%APPDATA%\StaticCodeAnalyser\ignore.txt
Eigenstaendiges Programm, kompiliert via analyser.d12.dproj. Bietet:
- Verzeichnis-Scan
- Einzeldatei-Analyse
- CSV-Export
- Direkt-Navigation zur Befundzeile (oeffnet IDE und springt zur Zeile)
Bauen:
Open analyser.d12.dproj in Delphi 12 -> Project -> Build
Designtime-Paket mit dockbarem Tool-Fenster. Wird ueber das Menue Tools / Static Code Analysis Tool for Delphi oder Ansicht / Static Code Analysis Tool for Delphi aufgerufen.
Zusaetzliche Funktionen gegenueber Standalone:
- 📄 File — analysiert die aktive Source-Datei in der IDE
- Branch-Changes — analysiert nur die im Branch geaenderten Dateien
- Direkt-Navigation ueber IDE-Editor-Services (kein WinAPI-Hack)
- Statistik-Tile-Reihe mit Echtzeitzahlen
- Help-Panel mit Vorher/Nachher-Snippets
Installieren — am einfachsten zuerst: die Release-Setup-EXE
(StaticCodeAnalyserSetup-<Version>.exe) oder das GetIt Local Package
(StaticCodeAnalyser-v<V>-getit-manifest.zip → Load Local Package
im GetIt Package Manager). Alternativ Selbstbau:
Open StaticCodeAnalyser.IDE.d12.dproj -> Project -> Install
Vollstaendige Liste mit Status (✅ implementiert / 🟡 teilweise / 🔲 offen)
in DETECTORS_de.md.
Aktueller Stand (v0.9.16): 198 Regeln (175 Pascal + 23 DFM) — Sonar-Katalog + SonarDelphi-Migration (SCA120-152) + DFM-Detektoren + Naming/Formatting (SCA060-119) + Bonus.
Schwerpunkte:
| Severity | Beispiele |
|---|---|
| 🔴 Blocker | MemoryLeak, EmptyExcept, NilDeref, SQLInjection, HardcodedSecret |
| 🟠 Critical | DivByZero, MissingFinally, FormatMismatch, FieldLeak |
| 🟡 Major | LongMethod, LongParamList, DeepNesting, MagicNumber, DuplicateString |
| 🔵 Minor | UnusedUses, TodoComment, EmptyMethod, DeadCode |
| 🎁 Bonus | HardcodedPath, DebugOutput, DuplicateString |
Statt das ganze Projekt zu scannen, kannst du nur die Dateien analysieren lassen, die im aktuellen Branch geaendert wurden — drastisch schneller (Sekunden statt Minuten), ideal als Pre-Commit-Check.
- Im IDE-Plugin auf den Button
Branch-Changesklicken - Der Analyser sucht ausgehend vom
Projektpfadnach oben nach.gitoder.svn - Holt die Liste der geaenderten
.pas-Dateien - Analysiert nur diese und zeigt die Befunde im Grid
Git-Repositories vereinen zwei Quellen:
git diff --name-only --diff-filter=ACMR <base>...HEAD # committed Branch-Diff
git status --porcelain # uncommitted + untracked
<base> wird automatisch ermittelt: origin/HEAD → main → master.
Aktionen A/C/M/R werden einbezogen, D (deleted) uebersprungen.
SVN-Repositories analysieren nur die Working Copy:
svn status
Status M/A/R/? werden einbezogen, D/!/I/C uebersprungen.
CLI-Tool muss aufrufbar sein. Suchreihenfolge:
| VCS | Suchreihenfolge |
|---|---|
| Git | PATH → C:\Program Files\Git\bin\git.exe → C:\Program Files (x86)\Git\bin\git.exe → C:\Program Files\TortoiseGit\bin\git.exe → TortoiseGit\mingw64\bin\git.exe |
| SVN | PATH → C:\Program Files\TortoiseSVN\bin\svn.exe → C:\Program Files (x86)\TortoiseSVN\bin\svn.exe → C:\Program Files\Subversion\bin\svn.exe |
Empfohlen:
- Git for Windows (git-scm.com)
- TortoiseSVN mit aktivierter Option "command line client tools" — sonst fehlt
svn.exe
| Setup | Funktioniert? |
|---|---|
| Git for Windows allein oder mit TortoiseGit | ✅ ja, via PATH |
| TortoiseGit allein ohne Git for Windows | ❌ TortoiseGit liefert kein eigenes git.exe |
| TortoiseSVN MIT "command line client tools" | ✅ ja, automatisch im TortoiseSVN-Bin-Pfad gefunden |
| TortoiseSVN OHNE "command line client tools" | ❌ klare Fehlermeldung — Installer mit Option nachholen |
| Mode | Zeit (typisches Projekt) |
|---|---|
| Vollstaendiger Verzeichnis-Scan | 60–90 s |
| Branch-Changes (5–30 .pas-Dateien) | 200 ms – 3 s |
Das IDE-Plugin folgt dem aktiven Delphi-IDE-Theme via:
StyleServices.GetSystemColorin Custom-Drawing (OnDrawCell, TTilePanel.Paint)clBtnFace/clWindow/clBtnTextals Property-Werte (auto-themed)IOTAIDEThemingServices.ApplyThemebeim Frame-HostingINTAIDEThemingServicesNotifierfuer Live-Theme-WechselCM_STYLECHANGED+SetParent-Override als zusaetzliche Trigger
Architektur-Module:
| Unit | Inhalt |
|---|---|
uAnalyserPalette.pas |
Zentrale Farb-Konstanten (Severity-Hintergruende, Akzente, Icon-Farben) |
uAnalyserTypes.pas |
TFindingSeverity-Enum + Konversion |
uAnalyserTheme.pas |
SeverityBg, SeverityAccent, BlendColor |
Bekannte Limitation: Im Floating-Modus uebernimmt das Plugin-Fenster IDE-Theme-Wechsel zur Laufzeit nicht zuverlaessig. Workaround: Plugin im Dock-Modus betreiben oder Fenster nach Theme-Wechsel schliessen + erneut oeffnen.
Per Klick auf den Button Settings... oeffnet sich:
%APPDATA%\StaticCodeAnalyser\analyser.ini
Die Datei wird beim ersten Aufruf mit Default-Inhalt angelegt. Aenderungen
werden beim naechsten Klick auf Branch-Changes automatisch neu geladen.
[Repo]
; Vergleichs-Branch fuer "git diff <base>...HEAD".
; Leer = Auto-Detect (origin/HEAD -> main -> master).
; Beispiele: develop, release/2024.1, origin/main
BaseBranch=
; Uncommitted Working-Tree-Aenderungen einbeziehen?
; 1 = ja (Default - typisch fuer Pre-Commit-Check)
; 0 = nur committed Aenderungen
IncludeWorkingTree=1
[Paths]
; Vollstaendige Pfade falls git/svn nicht im PATH und nicht im
; Standard-Tortoise-Pfad liegen. Sonst leer lassen.
GitExe=
SvnExe=| Szenario | Setting |
|---|---|
Team mit develop als Default-Branch |
BaseBranch=develop |
| Nur Code-Review committeter Aenderungen | IncludeWorkingTree=0 |
| TortoiseGit im Custom-Pfad | GitExe=D:\Tools\Git\bin\git.exe |
| TortoiseSVN ohne CLI-Tools im PATH | SvnExe=C:\Program Files\TortoiseSVN\bin\svn.exe |
Befunde lassen sich pro Zeile unterdruecken:
x := 1 / y; // SCA: ignore (DivByZero geprueft - y kommt aus Validation)Auch ganze Dateien koennen ueber %APPDATA%\StaticCodeAnalyser\ignore.txt
ausgeschlossen werden — eine Datei (oder ein Pfad-Glob) pro Zeile.
Der Analyser sucht ausgehend vom Projektpfad nach oben. Stelle sicher
dass der Pfad innerhalb eines Repos liegt und du nicht versehentlich einen
Sub-Pfad ausserhalb des Repo-Roots gewaehlt hast.
Dein Repo hat keinen Default-Branch unter dem ueblichen Namen. Setze in
analyser.ini den BaseBranch= Eintrag explizit (z. B. develop).
- Datei-Endung: nur
.pas-Dateien werden analysiert..dpr/.dpkwerden noch nicht erfasst (Erweiterung moeglich) - Submodule:
git statuserfasst Submodul-interne Aenderungen nicht — separat im Submodul-Ordner scannen - Test-Filter: Tests werden standardmaessig ausgeschlossen. Setze
[Detectors] IncludeTests=1in deranalyser.iniwenn gewuenscht - Ignore-Liste: pruefe
%APPDATA%\StaticCodeAnalyser\ignore.txt
Der Analyser nutzt Default-Codepage zur stdout-Konvertierung. Bei Pfaden
mit Sonderzeichen kann es zu Encoding-Glitches kommen. Workaround in
.gitconfig:
[core]
quotepath = false
Liefert UTF-8 statt escaped Sequenzen.
| Ziel | Schritt |
|---|---|
| Standalone-EXE | analyser.d12.dproj oeffnen → Project → Build |
| IDE-Plugin (empfohlen) | Release-Setup StaticCodeAnalyserSetup-<Version>.exe ausfuehren, oder GetIt Local Package laden (StaticCodeAnalyser-v<V>-getit-manifest.zip) |
| IDE-Plugin (Selbstbau) | StaticCodeAnalyser.IDE.d12.dproj oeffnen → Project → Install |
Plattform: Win32 — das Plugin laeuft in der 32-Bit-IDE von Delphi 12.0–12.3 (die 64-Bit-IDE von 12.3 wird noch nicht unterstuetzt).
StaticCodeAnalyser/
├── StaticCodeAnalyserForm/ # Standalone-EXE + Detector-Code
│ ├── sources/ # Detektoren, Parser, Theme-Helper
│ ├── resources/ # Test-Pascal-Dateien fuer Detector-Test
│ ├── tests/ # Unit-Tests
│ └── analyser.d12.dproj # Standalone-Projekt
├── SCA.Engine/
│ └── SCA.Engine.dpk # Engine-Paket (Dev-Satz)
├── SCA.SharedUI/
│ └── SCA.SharedUI.dpk # Shared-UI-Paket (Dev-Satz)
├── StaticCodeAnalyserIDE/ # IDE-Plugin (dockable)
│ ├── uIDEExpert.pas # Tools-Menue-Wizard
│ ├── uIDEAnalyserForm.pas # Frame + Dockable-Form-Wrapper
│ ├── StaticCodeAnalyser.IDE.d12.dpk # Designtime-Paket (Dev-Satz)
│ └── StaticCodeAnalyser.Plugin.d12.dpk # Release-Monolith-Paket
├── docs/ # Mockups, Skizzen
└── DETECTORS_de.md # Vollstaendiger Detektor-Katalog mit Status