External tool error
| Vulnerability potential | Low |
| DDoS potential | None |
External tool error
Impact
This is an analyzer-internal diagnostic, not a defect in the analyzed program itself. Visao drives an external tool (a compiler front-end, a preprocessor, a build wrapper, or a language-specific parser binary) to obtain the data it needs. The diagnostic is raised when that external tool exits with a non-zero status, crashes, times out, or writes output that cannot be consumed.
The practical consequence is that the affected translation unit is not analyzed. Real defects that live in that file are silently skipped, so the run produces a false sense of safety. In a CI gate this typically means the file is reported as “clean” only because it was never examined.
Vulnerability potential
This diagnostic has no direct security relevance to the analyzed code: it
describes a failure of the analysis pipeline, not an exploitable condition in the
target program. The only indirect concern is coverage loss — a genuine
vulnerability in the skipped file can slip through unnoticed — which is why the
severity is kept at Low rather than None. There is no memory corruption,
injection or privilege issue in Visao itself implied by the message.
Technical details
The external tool is invoked as a child process. Visao captures its exit code,
stdout, and stderr, and reads any artifact files it was expected to emit. The
diagnostic fires when one of the following happens:
Non-zero exit
The tool returned a failure status. The most common causes are a missing include
path, an undefined macro, an unsupported language standard flag, or a header that
only exists in the project’s real build environment. The compile database
(compile_commands.json) passed to the tool may be stale or reference paths that
do not exist on the analysis host.
Crash or signal
The tool terminated on a signal (segfault, abort). This usually points to a bug in the external tool or to an input that triggers it, and is outside Visao’s control.
Timeout
The tool exceeded the configured time budget. Pathological inputs (deeply nested templates, generated code) or a hung subprocess produce this.
Unconsumable output
The process succeeded but emitted output in an unexpected format or version, which the parsing stage could not deserialize.
Catching the issue
Because this is a tool diagnostic, “catching” it means restoring a working analysis environment rather than editing program logic.
Reproduce the invocation
Re-run the exact command line Visao used (it is printed with the diagnostic) by
hand. The external tool’s own stderr almost always states the underlying cause
directly.
Fix the build context
Ensure the compile database is regenerated against the same toolchain, that all include directories and generated headers are present, and that the language standard / target flags match the project. Pin the external tool version so the output format matches what Visao expects.
Guard rails
Treat these diagnostics as build errors in CI rather than warnings, so coverage gaps are never silently accepted. Raise the per-tool timeout for legitimately large units.
How to reproduce
Point the analyzer at a unit that references a header absent from the analysis host. The external compiler front-end exits non-zero and Visao surfaces the external tool error instead of analyzing the file. Observe that no other diagnostics are reported for this unit.
/* The build host does not provide this vendor header, but the real
firmware build does. The external front-end aborts on the missing
include before any analysis can run. */
#include <vendor/secret_soc_regs.h>
int main(void)
{
return SOC_BOOT_MAGIC; /* macro defined only inside the missing header */
}