The SBOM challenge: achieving zero false positives

Table of Content

Incredibuild logo

Incredibuild Team

reading time: 

3–5 minutes

There are plenty of vendor claims about SBOM accuracy. There’s less hard evidence.

So we ran a direct test, one we use ourselves when benchmarking Build Guard’s accuracy. Two tools. One build. A well-documented open-source project with a verifiable ground truth. Here’s what happened.

Why we chose OpenCV

When we were developing our SBOM tool for C++, we needed a reliable way to measure our own accuracy. OpenCV became our primary benchmark project for three reasons.

  • Genuinely complex: OpenCV is widely deployed in computer vision (robotics, automotive, medical imaging, production apps) and features multiple platform paths, optional dependencies, and conditional compilation, which often breaks naive SBOM tools.
  •  Thorough documentation: The third party directory is well-maintained, dependencies are explicitly marked as required vs. optional, and platform-specific behavior is documented, allowing for a reliable ground truth verification, which is rare in C++ projects.
  • Public and reproducible: Anyone can reproduce this test by cloning the repo, building it, running an SBOM tool, and comparing the output against the documented dependency list.

What Syft reported: 92 components

Syft is one of the most widely used open-source SBOM generators. It’s well-maintained, has broad language support, and is the kind of tool many teams reach for first. We’re not singling it out as uniquely flawed. It’s representative of the source-scanning approach.

Against our OpenCV build, Syft reported 92 components. That sounds comprehensive. Here’s what was actually in the list:

  • JUnit, Gradle, Scala
  • GitHub Actions workflow references
  • Java and Android support files
  • CI configuration artifacts
  • One actual C++ component (FFMpeg)

FFmpeg: reported six times

TWhat happened is exactly what you’d expect from a source scanner: Syft scanned every file in the OpenCV repository. OpenCV has Java bindings for Android, CI configuration, and various non-C++ language artifacts. Syft found them all and reported them as software components. This is because from a file-scanning perspective, they are files in the repository.

This is not a bug. Syft is working as designed. The fundamental limitation is that scanning the repository is not the same as scanning what was compiled.This is what creates a lot of false positives and unnecessary noise.  

The FFmpeg problem

FFmpeg appearing six times deserves its own explanation, because it illustrates the accuracy gap precisely.

FFmpeg is not compiled into OpenCV. It’s an optional, platform-specific, runtime-loaded dependency. On Linux, OpenCV uses whatever FFmpeg the OS has installed. On Windows, it loads a pre-built DLL at runtime, and only if it’s present. If FFmpeg isn’t installed, OpenCV falls back to alternative implementations entirely. FFmpeg never enters the compiled codebase.

In our Windows build, FFmpeg wasn’t installed. It wasn’t compiled. It wasn’t linked. It’s not in the binary.

This is what a false positive looks like in practice. FFmpeg carries real CVEs. When your SBOM reports it as a component of your software, your security team will investigate. They’ll find nothing. They’ll lose time. And they’ll start treating SBOM alerts as noise, which is the most dangerous outcome of SBOM inaccuracy.

What BuildGuard reported: what was actually built

Build Guard doesn’t scan the repository. It hooks into the build process and records every file the compiler accessed and every library the linker resolved during the actual compilation.

BuildGuard produced 87 components. At first glance, this looked similar in scale to Syft. But when we examined the results more closely, we found that BuildGuard successfully identified all 12 third-party C++ dependencies, with version and license information included wherever it could be derived from the build artifacts.

The remaining 73 components were internal OpenCV code dependencies that were compiled during build time, and these can be easily filtered out with the tool.

Most importantly, every component reported was real: there were zero false positives. In addition, the output provided a full provenance chain, showing exactly how each component entered the build.

Needless to say this is a big difference. 

Reproduce this yourself

OpenCV is public. You can run this test without any commercial tooling. Clone the repository. Build it in your environment. Run your current SBOM tool. Then compare the output against the documented third party dependency list.

The exercise is more revealing than most teams expect and it will tell you a lot about how much you can trust the SBOM you’re currently relying on.

If you want to include BuildGuard in that comparison, reach out to the Incredibuild team. We’ll help you set it up and walk through the results together.see. 

Table of Content

Shorten Your Builds

Incredibuild empowers your teams to be productive and focus on innovating.

Share

Related Blog Posts

C++, Compilers, Financial Services, MedTech
Why we built Islo:  AI coding agents need an execution layer
[4 May 2026]
C++
The illusion of control: is your SBOM lying to you?
[23 Mar 2026]
AI
Slashing AOSP Build Times: How to Bridge the “AI Velocity Gap”
[4 Mar 2026]

Never run anything twice