programming-cpp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited programming-cpp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Write modern C++ with value semantics, deterministic resource cleanup, and explicit lifetime contracts. As of 2026-10: C++23 is the published ISO standard; C++26 was technically completed by WG21 in March 2026 and awaits ISO publication, with compiler and library support still partial. Read build presets, compiler versions, selected language standard, standard-library implementation, and CI targets first. A compiler accepting -std=c++23 or -std=c++26 does not prove every facility of that standard is available. Recheck vendor support tables when adopting features.
Every resource has an owner; every view has a lifetime. Prefer values and standard containers. RAII (resource acquisition is initialization) makes cleanup follow scope exit, including exceptions, but does not automatically prevent dangling references or unsynchronized shared mutation.
| Standard | Useful facilities |
|---|---|
| C++20 | Concepts, ranges, std::span, std::format, std::jthread/stop tokens, consteval, constinit. |
| C++23 | std::expected, std::print, std::ranges::to, explicit object parameters, std::mdspan. |
Use concepts to express template requirements and ranges when the resulting pipeline is clearer than a loop. std::format is C++20; std::print is C++23. Neither guarantees a performance win for your workload. Modules and newer library features need compiler, library, and build-system support; don't introduce a migration or compatibility wrapper merely to use newer syntax. C++26 adds static reflection, contracts (pre, post, contract_assert), std::execution senders/receivers, standard-library hardening, and erroneous behavior for uninitialized reads; use them only where the project selects C++26 and every supported compiler implements the specific paper.
For safety on current toolchains, enable the implementation's library hardening in debug and CI builds where the project allows it (_GLIBCXX_ASSERTIONS for libstdc++, _LIBCPP_HARDENING_MODE for libc++), and run AddressSanitizer/UndefinedBehaviorSanitizer in tests; hardening converts some undefined behavior into traps, not into recoverable errors.
unique_ptr for exclusive dynamic ownership; use shared_ptr only for shared lifetime, with weak_ptr where needed to avoid ownership cycles. Shared ownership does not synchronize the pointed-to object.string_view, and span ordinarily borrow. Don't retain or return them beyond their backing storage's lifetime. Container reallocation and mutation can invalidate views and iterators; lazy ranges may retain references to predicates and source storage.const&. Transfer ownership explicitly. Return values naturally; return std::move(local) can prevent named return value optimization.optional for expected absence, variant for closed alternatives, and expected<T, E> for explicit recoverable failure where compatible with the project's error model. Don't replace established exceptions globally.expected must be checked before unchecked value access. Preserve meaningful errors; don't convert failed parsing, I/O, or configuration into a successful empty object or zero.[[nodiscard]] when discarding them usually violates the contract. Keep destructors nonthrowing; use an explicit operation when callers need to observe finalization errors.jthread requests stop and joins when destroyed; stopping is cooperative, so blocking operations need a way to wake. Captured references must remain alive until work finishes.std::atomic<T> is not guaranteed lock-free. Weaker memory ordering needs a correctness argument, not just a benchmark.const& does not prove thread safety: another alias may mutate the same object. Establish lifetime and synchronization before sharing access.PRIVATE, PUBLIC, and INTERFACE to express actual consumer requirements. Preserve the existing dependency manager and reproducible version policy.C++23: preserve failure as an explicit alternative instead of substituting a default.
#include <expected>
enum class WorkerError { non_positive };
[[nodiscard]] std::expected<unsigned, WorkerError> worker_count(int value) {
if (value <= 0) {
return std::unexpected(WorkerError::non_positive);
}
return static_cast<unsigned>(value);
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.