C++ standard is declared
cpp/standard-declared@v1
A CMake build that enables C++ declares the standard it compiles against, and that standard is no older than the configured floor.
| Id | cpp/standard-declared |
| Version | v1 |
| Category | cpp |
| Default severity | warning |
| Interpreter | python3 |
| Timeout | 30 seconds |
| Violations tolerated | 0 |
| Collects | cpp |
Collectors
This guardrail doesn't gather anything itself. It relies on the collectors below, which the CLI runs once per build before any check, and reads what they found from GUARDRAIL_FACTS. If a collector collects nothing, this guardrail is skipped, not failed.
| Collector | Gathers | Inputs it is given |
|---|---|---|
cpp | The C or C++ build in the project directory: which build system and package manager it uses, the C++ standard and CMake version it requires, the packages it declares and which of them are pinned, and the packages it expects the machine to carry. CMakeLists.txt is a script, so what it declares conditionally is not seen and scanned says so. | projectDir |
The inputs above are this guardrail's own inputs, passed straight through to the collector. Setting one in buildnote.json changes what is collected, and two guardrails configured the same way share a single collection.
Configuration
{
"guardrails": {
"failOn": "error",
"checks": [
{
"use": "cpp/standard-declared@v1",
"severity": "warning",
"with": {
"projectDir": ".",
"minStandard": "17"
},
"exemptions": []
}
]
}
}Inputs
| Input | Description | Default | Environment variable |
|---|---|---|---|
projectDir | Directory holding the project, relative to the directory the CLI runs in. | . | GUARDRAIL_INPUT_PROJECTDIR |
minStandard | Oldest C++ standard accepted, written as the number CMake takes: 11, 14, 17, 20 or 23. A declared standard below this is a violation. | 17 | GUARDRAIL_INPUT_MINSTANDARD |
How to fix
Set the standard the build compiles against in CMakeLists.txt:
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)The guardrail only reads CMAKE_CXX_STANDARD in a CMakeLists.txt. A standard requested only through target_compile_features is not seen, and the build counts as declaring none. If the checkout is built with Meson or Bazel, the standard is declared somewhere the guardrail doesn't read, so the check skips instead of guessing.
When no standard is declared, the compiler's default decides. The same commit then compiles as C++14 under one toolchain and C++17 under the next, and a feature that built on a laptop fails on the runner.
More in cpp
cpp/cmake-minimum-floor. A CMake build names the CMake version whose policy defaults it uses, and that version is no older than the configured floor.cpp/package-manager-declared. The checkout declares its dependencies through vcpkg or Conan, so it names the versions it builds against instead of taking whatever the machine has installed.cpp/standard-required. A CMake build that enables C++ requires the standard it declares, so a compiler that doesn't support it fails instead of falling back to an older one.