Every finding carries one of two labels, and they are never blended. One matched a pattern. The other traced attacker data from source to sink and prints every hop it walked, so you can audit the claim instead of believing it.
Nothing below is summarised. The label, the path, and the limits of what the engine could establish all ship together, because a claim without its working is just a louder guess.
cmd, unescapedThree hops, every one printed. Where a hop rests on something the engine could not follow, that hop says so rather than being smoothed over.
Most tools report everything at one confidence and leave the triage to you. The word they hide behind is possible — and it covers both a traced data path and a lucky-looking regex.
Pick one to hold it. Pick it again to let both go.
A rule cannot set its own confidence. Only a printed path earns the filled label — and that is enforced by the type system, not by a style guide.
Scored against OWASP BenchmarkJava, 1210 labelled test cases, on engine 0.5.0 (2026-10-15). Each label is scored separately, because one blended figure would be the same averaging this tool refuses to do inside a single finding.
The filled label is worth 29.9 points of precision over the hollow one. That gap is the entire claim this tool makes, and it is measured here rather than asserted.
No false positive wears the filled
label on this benchmark: all 562
flow-verified claims are real
vulnerabilities. That is a fact about these 1,210 test cases, not a
promise about your code — a proof means the path exists in the source, and the ways it can still be
wrong are in the limitations below, which a synthetic benchmark does not exercise.
Every run ends with the rule and language combinations this engine does not implement — currently 22 of them — each with the real reason, not a placeholder. In C it states outright that it does not model memory safety: no buffer overflows, no use-after-free. It tracks values, not sizes.
A gap you can read is a gap you can plan around. A gap you can’t see is the one that gets you.
The scanner is AGPL-3.0. Pointing it at your own code — closed-source, proprietary, commercial, any of it — puts no obligation on you whatsoever, and running it unmodified inside a company is free and unencumbered.
The one obligation attaches if you modify it and then serve your modified version to other people over a network, in which case those users are owed your source. If those terms do not work for your company, and for some they genuinely do not, the copyright sits in one place and a commercial licence can be discussed.
The scanner is the whole of the free plan, not a trial of it. Tools for working through findings over time, and across a team, are paid - see plans and pricing.
Sikkuumiii, who builds Defuse, runs it on your code, reads every finding, and hands back the report in a form your team can act on. The same two labels apply: what was proven comes with its path, what was only matched is said to be unproven, and what was not checked is written down.
The request form is public. Write only the language, the rough size and how to reach you privately - never code, keys or company details.