Check Anti-Patterns

anti-patterns checks the documented C++ patterns in the library, demos, build helpers, maintenance tool, and tests. It is run by pre-commit after code cleanup.

Run the Command

From the project root, run a full scan or select project-relative files and directories:

./erbsland-core-tool anti-patterns
./erbsland-core-tool anti-patterns src/erbsland/text tool/src/tool/anti_patterns
./erbsland-core-tool anti-patterns --jobs 4 --limit 50
./erbsland-core-tool anti-patterns --show-suppressed

--jobs accepts 1 through 64 workers; the default is the bounded logical CPU count. --limit accepts 1 through 200 report rows and defaults to 20. Active findings make the command fail. Accepted findings appear in the summary and can be inspected with --show-suppressed.

Configure Source Selection and Rules

Source Directories in tool/conf/tools/anti_patterns.elcl accepts project-relative directory globs. For example, cmake/tools/*/src and test/profiling/*/src select source trees without scanning sibling data or resource templates. Each matched directory is scanned recursively; each pattern must match at least one directory. ** can select directories across multiple levels. Explicit command-line paths remain literal targets and replace this selection for that run.

Rules can expose optional settings beneath their own section:

--[ Anti Patterns . Namespace Noise ]--
Domains         : "text", "unit", "err", "mem", "options", "path", "stream"
Ignored Symbols : "mem::secureErase"

Here, the ignored symbol does not contribute to namespace-noise counts. Omitted rule settings are empty lists; the shipped configuration supplies this project’s policy. See the reference for the available settings.

Accept a Finding

Fix the code when possible. For intentional code, place an adjacent // anti-pattern: allow <rule> -- <reason> comment before the construct or after its statement. To accept a file or directory location, add a reasoned Exception block to tool/conf/tools/anti_patterns.elcl. Use an explicit recursive glob for directory coverage, such as tool/test/unittest/src/**. List several rule identifiers together only when the same reason explains each one. Path also accepts a list when the same rules and reason apply to several locations:

--*[ Anti Patterns . Exception ]*--
Path   : "src/First.cpp", "src/Second.cpp"
Rules  : "regular_string_literal"
Reason : "These adapters pass narrow C strings to native interfaces."

Multi-line lists with one * entry per path are also supported.

The scanner caches source findings in .cache/anti_patterns.json. Changes to a source file, the running tool binary, or rule settings invalidate the relevant results. Source-pattern changes refresh the selected inventory and retain reusable results for unchanged selected files. Configured exceptions are applied after cache lookup, so editing an exception does not require a rescan. A missing or damaged cache is rebuilt automatically.

See Anti-Patterns Reference for validation, rule registration, and scanning details. The Bad Code and Anti-Patterns catalog explains each rule.