Safeguard
Supply Chain•

Does reachability analysis make two scanner counts incomparable?

A tool that filters by reachability reports fewer findings than one that lists every present package. Compare them on the same layer, not on raw totals.

Safeguard Security Team
4 min read

Yes, raw totals become incomparable. A scanner that lists every vulnerable package present and one that filters to findings whose vulnerable code is called answer different questions. Compare them on the same layer: present, then reachable, and keep both numbers labeled.

Two layers of the same problem

Presence asks whether a package with a known flaw is in your dependency tree. A version comparison against advisory data answers it.

Reachability asks whether your code can actually call the vulnerable function or path. It needs an analysis of how your code uses the library.

A report built on presence will list every match. A report built on reachability will list a subset, or will rank the reachable ones first. If you set the two side by side, one number looks small and the other large, and neither is wrong.

How to compare fairly

  1. Ask what layer each number is. Read the tool's documentation, or check one known case, such as a flaw in a function you never call.
  2. Get the presence list from both. Align scope and inputs so that this layer matches between tools. Present count differences then come from data, not from filtering.
  3. Get the reachable subset from each tool that offers it. If only one tool offers it, you cannot compare reachability across the two. Compare presence, and treat the reachability output as extra information.
  4. Validate a sample by hand. Pick a few findings marked unreachable and read the code. Pick a few marked reachable and confirm the call path.
  5. Record the limits. Reachability depends on language support and on how dynamic your code is. Reflection, plugins and generated code can hide a call path.
LayerQuestionStrengthLimit
PresenceIs the package here?Broad, simple to verifyMany matches never run
ReachableCan our code call it?Focuses effortDepends on analysis coverage
Exploitable in contextCan an attacker use it here?Closest to real riskNeeds environment knowledge

Do not treat unreachable as safe forever

Code changes. A new feature can start calling the vulnerable function. Rerun the analysis on each build, not once. Keep unreachable findings in the register with their status, so a later change can flip them.

Also remember that other issues in the same package can be reachable even when one flaw is not. Review per advisory, not per package.

Using it for priority, not for exclusion

A sound use is ordering. Fix reachable findings with a fix available first. Schedule the rest. A weaker use is deleting the unreachable ones from view, which loses the evidence you will want when an auditor or customer asks how you decided.

Try it yourself

Click through it at your own pace, or open it full screen. Compare the full list with the reachable view and note which findings drop out and why.

Where Safeguard fits

Safeguard includes reachability analysis alongside SBOM and dependency scanning, so a finding can be viewed on both layers. A free scan at gold.safeguard.sh/scan lets you compare it with your current tool on one project.

Quick check

If a tool reports fewer findings, is it missing things?

Not necessarily. It may be filtering by reachability. Compare the presence layer first.

Can reachability results change without a code change?

Yes, if the analysis improves or the dependency changes. Rerun it regularly.

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.