Safeguard
Developer Tools•

Can SARIF suppressions carry your triage decisions to a new scanner?

SARIF has a suppressions property with kind, status and justification fields. Learn what it can carry between scanners and where it falls short.

Safeguard Security Team
4 min read

Partly. SARIF 2.1.0 lets a result carry a suppressions array with a kind, a status and a free text justification, so a dismissal can travel in the report file. It does not standardize the decider, the date or an expiry, so you still need a sidecar record for those.

What SARIF is

SARIF is the Static Analysis Results Interchange Format, an OASIS standard for the output of analysis tools. A SARIF file holds runs, each with results. Many tools write it, and many platforms read it, which makes it a natural carrier when you move between scanners.

What the suppressions property holds

Under the 2.1.0 specification, a result may contain a suppressions array. Each suppression object has:

  • kind: either inSource, meaning a language construct such as an annotation suppresses the result, or external, meaning the result is suppressed in an external persistent store.
  • status: accepted, underReview or rejected.
  • location: where the suppression is stored.
  • guid: which, per the spec's note, can link the suppression to a record in a result management system.
  • justification: a user supplied explanation.

The specification adds a behavior worth knowing. If the array is present but empty, a consumer must treat the result as not suppressed. If the array is absent or null, no suppression information is available at all. A migration script should not confuse the two.

The migration use

A decision exported from your old scanner as "external, accepted, justification: only used in tests" maps cleanly to a suppression object. The new tool, if it reads suppressions, can show the result as handled. The guid field can point back to the original record so the two stay linked.

The related baselineState property is also useful for checking your work. It marks each result as new, unchanged, updated or absent with respect to a baseline run. After import, a run compared against the baseline should show most results as unchanged. A big block of "new" results means identity matching failed.

Where it falls short

NeedSARIF support
Reason textYes, justification
Accepted or under reviewYes, status
Who decidedNot standardized
When it was decidedNot standardized
Expiry dateNo
Ticket linkPartly, through work item URIs on the result

For those gaps, add properties in your own namespace or keep a sidecar file. Check whether the consumer preserves unknown properties before relying on them.

Also remember that SARIF is built around code locations. Dependency findings point at a manifest or lockfile rather than a source line, and some consumers handle that differently. Test with a small dependency file.

Practical steps

  1. Export a sample of 20 decisions from the old tool.
  2. Convert them to SARIF suppression objects with a script.
  3. Load them into the new tool and see which fields survive.
  4. Record what was dropped and decide on a sidecar for it.

The spec also warns that justification text is user supplied, so a consumer should show it with care. Sanitize comments before you generate files.

Quick check

Does an empty suppressions array hide the finding?

No. Per the specification, an empty array means suppression information exists and the result is not suppressed.

Is SARIF the only way to move decisions?

No. VEX documents, CSV files and vendor APIs also work. SARIF is useful when both tools already read it.

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.