Imagine you're a food inspector with a different checklist for every restaurant — one checklist has 200 items, another has 5. At the end of the day, you report that Restaurant A has 40 violations and Restaurant B has 1. The headline reads 'Restaurant B is safer!' But you didn't actually measure safety — you measured how thorough your clipboard was. That's the core mechanism of this paper: SAST tools don't measure code quality uniformly across languages; they measure the maturity of their own rule sets per language, and the gap is enormous. The committed claim: this is the first empirical study that takes SAST tools (SonarQube, Semgrep, plus language-specific analyzers) and runs them across twelve implementations of the same protocol spec — OCPP 1.6, the dominant standard for EV charging station management — each written in a different programming language. The unit of comparison isn't 'which codebase is better' but 'how differently do tools behave when the specification is held constant and only the language changes.' That's a genuinely useful experimental design. The numbers are stark. Java's implementation triggered 1,689 total findings; Rust's triggered 2. But the authors are honest about the interpretation: mature languages like Java have decades of accumulated SAST rules, while newer languages like Rust have sparse coverage. The finding count is confounded by tooling depth, not just code quality. SonarQube and Semgrep, the two cross-language tools tested, showed highly uneven rule coverage across their supported languages. Language-specific tools sometimes found issues the generalists missed, and vice versa. The architecture here is straightforward empirical measurement, not algorithmic innovation. Twelve open-source OCPP 1.6 implementations were selected — one per language — and subjected to both multi-language SAST tools and the best available language-specific analyzer. The study design leans on OCPP as a natural experiment: same spec, different implementations, different ecosystems. It's a measurement paper, and the measurement is the contribution. Integrity is mixed. The corpus is real-world open-source code, which is good — no synthetic benchmarks or toy examples. But each language is represented by exactly one implementation, so you can't distinguish language-ecosystem effects from codebase-quality effects. The authors acknowledge this. There's no blinding or pre-registration, but for an empirical SE study at this scale, that's standard. The bigger limitation is that SAST findings aren't ground-truthed against actual exploitable vulnerabilities — you're counting what the tools report, not what's actually dangerous. The practical upshot is pointed: if you're choosing a language for a security-critical system like EVCS software, you should factor in SAST tooling maturity, not just language features. A language with immature tooling creates a false sense of security — fewer reported issues doesn't mean fewer real vulnerabilities. For the EV charging ecosystem specifically, OCPP's spec-level ambiguity means implementation divergence is inevitable, and tooling gaps mean some of that divergence goes undetected. The obvious next step the authors didn't take: manual vulnerability triage. They counted tool findings but didn't classify which findings represent real, exploitable security flaws versus noise. That's the experiment that would make this work load-bearing for policy. My read: it's a resource and expertise constraint — manual triage across twelve languages requires twelve domain experts, and this is a six-page conference paper from what appears to be a university group. The follow-up paper likely exists in someone's head already.
The analogy
Like a food inspector using a different checklist at every restaurant — one with 200 items, one with 5 — then comparing violation counts as if they measured the same thing. The paper's core mechanism is exposing that SAST tools have wildly uneven 'checklists' per language, so cross-language finding counts are incommensurable.
Food inspector
Different-length checklists per restaurant make violation counts incomparable across venues
SAST cross-lang
Different-depth rule sets per language make finding counts incomparable across implementations
Honest assessment
A useful first measurement that establishes cross-language SAST comparison as a research question worth pursuing. The 845× gap between Java and Rust findings is the headline, and the honest interpretation — tooling maturity, not code quality — is the contribution. But without ground-truth vulnerability triage, the findings remain suggestive rather than actionable. This is a short conference paper that opens a door; it doesn't walk through it. Most useful for security engineers choosing languages for critical infrastructure and for SAST tool developers benchmarking their coverage gaps.
What Is CLAIMS?
53
/ 100
BedrockNews applies a structured analytical framework called CLAIMS to academic papers and technical research releases.
How CLAIMS worksClaim
3/5
Ladder
2/5
Architecture
3/5
Integrity
3/5
Milestone
2/5
Successor
3/5
What is this paper actually committing to?
Genuine first: nobody has run SAST tools across twelve languages on same-spec implementations before. But it's a measurement contribution, not a method or tool — valuable but bounded in ambition.
The field fight
Do SAST tool findings reflect actual code security, or do they primarily reflect tooling ecosystem maturity?
Side A
SAST findings are a reasonable proxy for code quality — more findings means more risk
Held by: Industry compliance frameworks, CI/CD security gates
Side B
SAST findings are confounded by rule-set depth per language — cross-language comparisons are misleading
Held by: This paper, language-security researchers
Milestone tracker
Unlocks: Actionable guidance on which SAST tools actually catch real vulnerabilities per language, not just report more findings
Current
12
languages
SAST comparison (this paper)
Next
12
triaged codebases
true-positive classification
~1-2 years if manual review funded
Verified Facts (5)
Total issues ranged from just two in Rust to 1,689 in Java
Applied both comprehensive multi-language tools (SonarQube and Semgrep) and language-specific analyzers
Twelve OCPP 1.6 implementations--each written in a distinct programming language
6 pages, 2 tables, Author-accepted manuscript. Published at IEEE CSR 2026
Mature programming languages like Java yielded substantially more findings than newer languages like Rust
Practical Implications (4)
If you're selecting a language for EVCS or other security-critical IoT systems, factor in SAST tooling maturity — low finding counts in newer languages may reflect blind spots, not safety
Don't use raw SAST finding counts as a cross-language security metric without normalizing for rule-set depth
SAST tool vendors should publish per-language rule coverage statistics so users can assess detection gaps
OCPP implementers should supplement SAST with manual code review and dynamic testing, especially in languages with immature static analysis ecosystems
More latest news
Read all