Safeguard
Developer Tools•

Should you use each language's audit command or one scanner?

Native audit commands differ in data source, scope and noise. Use them for fast feedback, then add one shared view so findings compare fairly.

Safeguard Security Team
4 min read

Use both, for different jobs. Native audit commands are free, close to the developer, and understand their own ecosystem. A shared scanner or report gives one comparable view across all languages. The danger is treating the output of different tools as if it meant the same thing, because each answers a slightly different question.

How native tools differ

The audit tools shipped with ecosystems are not interchangeable. The official docs show three different behaviors:

ToolWhat it doesWhat it does not do
npm auditSends a description of your dependency tree to the registry and gets advisories backDoes not tell you whether your code calls the vulnerable function
govulncheckChecks whether your code directly or indirectly calls vulnerable functionsSeparates called from imported only
NuGet auditReports known vulnerabilities at restore, with direct versus all packages as a settingDepends on audit source and settings

The npm docs say that audit needs a package lock by default and that results may vary between runs when you bypass it. The govulncheck tutorial shows two groups of findings: vulnerabilities with call stacks in your code, and vulnerabilities in imported packages with no call stack, listed as informational. NuGet's pruning feature, per its docs, exists partly to reduce false positives from component scanners.

Why counts do not compare

Suppose npm audit reports 40 findings and govulncheck reports 2. That is not evidence that the Go service is twenty times safer. One counts every advisory matched to a version. The other filters by whether code calls the function. Comparing the two numbers is comparing different units.

A fair way to combine them

  1. Run native tools where developers work. They give fast feedback in pull requests.
  2. Collect an SBOM from every build. One format, one place.
  3. Match components against advisories in one system. Now every finding uses the same rules.
  4. Add exploitability context consistently. If some languages get call analysis and others do not, label which is which.
  5. Rank by exposure and impact, not by raw count per language.

What native tools do better

They know quirks nobody else tracks, like how a package manager resolves ranges or what a lock file records. They also fit existing workflows, so developers use them without new training. Do not replace them. Layer on top.

What a shared view does better

It answers cross-cutting questions: which services use a given library, which owner has the oldest open finding, how many repos lack a lock. Native tools answer those one repo at a time.

Try it yourself

Open the demo and compare the full list of findings with the list after reachability is applied. Look at how many items drop out and why.

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

Safeguard can help here: it scans dependencies and generates SBOMs, applies reachability analysis so you can sort findings by what your code can actually call, and enforces policies and gates on pull requests. You can try a free scan on a repository to see what it finds.

Quick check

Is a lower count from one language's tool proof it is safer?

No. Tools count different things. A tool that filters by call reachability will report fewer items than one that matches versions only.

Do I still need native audit commands if I have a scanner?

They are useful for fast developer feedback. Keep them, and use the shared view for portfolio questions.

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.