Safeguard
Developer Tools•

How to read a reachability call path and decide what to do

A reachability finding shows a chain of calls from your code to a vulnerable function. Learn to read it, test it, and decide on a fix or an exception.

Safeguard Security Team
3 min read

A reachability call path is a chain from an entry point in your code through functions to the vulnerable one. Read it from the top: is the entry point reachable by outside input, does each step really happen, and can the data you control reach the last call. Then fix, mitigate or record an exception.

What a path looks like

Tools format them differently, but the idea is the same.

handleUpload  (your code)
  parseArchive  (your code)
    lib.Extract  (dependency)
      lib.unpackEntry  (vulnerable function)

The top line is where execution starts. The bottom line is the flawed function. Everything between is the proof.

Step 1: Check the entry point

Is the first function an HTTP handler, a message consumer, a command line parser, or a test? A path that starts in a test file only matters if tests ship. A path from a public endpoint matters more than one from an admin tool.

Step 2: Check each hop

Open the code for each step. Is the call conditional on a flag that is always off? Is it wrapped in a branch that cannot run in production? Static analysis ignores most conditions, so a path can exist on paper and not in practice.

Step 3: Check the data

Read the advisory. What kind of input triggers the flaw? Now trace the data. Does anything you control or an outside party controls reach the vulnerable call, or is it a constant? The VEX specification treats this as its own case with a label for code that cannot be controlled by an adversary.

Step 4: Decide

FindingAction
Real path, outside input reaches itUpgrade or patch now
Real path, input is trusted onlyUpgrade on your normal schedule
Path is not real in practiceRecord the reason, set a review date
Cannot tellTreat as reachable until you can

Step 5: Leave a note

Write down the path, your conclusion and the date. The next person will otherwise redo the work.

A time box

Give each finding ten to fifteen minutes. If you cannot resolve it, escalate or assume reachable. A review that never ends is a backlog of its own.

Click through it at your own pace, or open it full screen.

A short example

A finding shows a path from a function named exportReport through a template library to a flawed formatter. Reading step one shows exportReport is only called by an admin command line tool. Step three shows the formatter only runs with a legacy option that your config disables. The path exists on paper, nobody outside the team can trigger it, and the option is off. You note all three facts, upgrade at the next routine window, and move on.

Quick check

What if the path runs through a test file?

Then it matters only if that code ships or runs in a pipeline with access to secrets. Otherwise lower the priority and note why.

Do I need to read every hop?

For findings you plan to dismiss or escalate, yes. For routine upgrades you do not need to.

Safeguard shows reachable paths on findings so you can do this review. Try the free scan on a repository you know well.

Sources

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.