Cross-platform Rust rewrite of the GNU coreutils
This report summarizes scanner evidence for uutils/coreutils, a Rust project with 24,315 GitHub stars. SynthScan examined 316,153 lines of code across 944 source files, recording 793 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 2.7 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 781 finding(s).
Are imports declared and package/API names verified? 6 finding(s).
Are wrappers, guards, and repeated structures necessary? 25 finding(s).
Which changes need focused human review? 793 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 793 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 401 | phf_codegen.workspace = true | COMMENT |
| LOW | Cargo.toml | 441 | "dep:regex", | COMMENT |
| LOW | util/build-pgo.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | util/check-toctou.sh | 1 | #!/bin/bash | COMMENT |
| LOW | util/check-libc-interposition.sh | 1 | #!/bin/bash | COMMENT |
| LOW | util/check-common.sh | 1 | #!/bin/bash | COMMENT |
| LOW | util/dwr.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | util/update-version.sh | 1 | #!/bin/sh | COMMENT |
| LOW | util/build-run-test-coverage-linux.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | util/android-commands.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | util/android-commands.sh | 201 | # finishes a command run with a summary. It returns with the exit code of the probe if specified as | COMMENT |
| LOW | util/check-open-once.sh | 1 | #!/bin/bash | COMMENT |
| LOW | util/gnu-unfixable-tests.txt | 1 | # spell-checker:ignore getmntent GETMNTENT xstat fopen | COMMENT |
| LOW | util/gnu-unfixable-tests.txt | 21 | # --- Structurally impossible --------------------------------------------- | COMMENT |
| LOW | util/run-gnu-test.sh | 41 | # --- Self-heal: make the shared GNU harness point at THIS checkout ---------- | COMMENT |
| LOW | util/build-gnu.sh | 161 | sed -i '/tests\/help\/help-version.sh/ D' Makefile | COMMENT |
| LOW | util/build-gnu.sh | 361 | # in the case of GNU, it seems inconsistent. Nevertheless, it looks like it | COMMENT |
| LOW | tests/test_uudoc.rs | 1 | // This file is part of the uutils coreutils package. | COMMENT |
| LOW | tests/by-util/test_env.rs | 1261 | } | COMMENT |
| LOW | tests/by-util/test_env.rs | 1281 | /// .args(&args[1..]) | COMMENT |
| LOW | tests/by-util/test_sort.rs | 221 | #[case::numeric_fixed_floats("numeric_fixed_floats", &["-n", "--numeric-sort", "--sort=numeric"])] | COMMENT |
| LOW | tests/by-util/test_sort.rs | 241 | #[case::keys_open_ended("keys_open_ended", &["-k 2.3"])] | COMMENT |
| LOW | tests/by-util/test_sort.rs | 4221 | #[case(&["-k2,3"], "aa\n0aa\x0c\n", "0aa\x0c\naa\n")] | COMMENT |
| LOW | tests/by-util/test_mv.rs | 901 | #[rstest] | COMMENT |
| LOW | tests/by-util/test_mv.rs | 1601 | assert!(!at.file_exists(file1)); | COMMENT |
| LOW | tests/by-util/test_mv.rs | 1881 | // total 0 | COMMENT |
| LOW | tests/by-util/test_mv.rs | 2721 | .fails(); | COMMENT |
| LOW | tests/by-util/test_join.rs | 881 | // | COMMENT |
| LOW | tests/by-util/test_numfmt.rs | 1 | // This file is part of the uutils coreutils package. | COMMENT |
| LOW | tests/by-util/test_numfmt.rs | 21 | #[case::from_iec_i_without_suffix_are_bytes(&["--from=iec-i", "1024"], "1024\n")] | COMMENT |
| LOW | tests/by-util/test_numfmt.rs | 41 | #[case::format_with_zero_padding_and_padding_option(&["--format=%06f", "--padding=8", "1234"], " 001234\n")] | COMMENT |
| LOW | tests/by-util/test_numfmt.rs | 61 | // https://github.com/uutils/coreutils/issues/11667 | COMMENT |
| LOW | tests/by-util/test_numfmt.rs | 81 | #[case::from_iec_i(&["--from=iec-i"], "1.1Mi\n0.1Gi", "1153434\n107374183")] | COMMENT |
| LOW | tests/by-util/test_basenc.rs | 61 | #[case::base32hex_autopad_short_quantum(&["--base32hex", "--decode"], "C5H66", "abc")] | COMMENT |
| LOW | tests/by-util/test_unexpand.rs | 41 | .succeeds() | COMMENT |
| LOW | tests/by-util/test_ls.rs | 1221 | COMMENT | |
| LOW | tests/by-util/test_ls.rs | 1281 | // Having Some([2, 0]) in a color basically means that "it has the same color as whatever | COMMENT |
| LOW | tests/by-util/test_ls.rs | 1301 | // │ ├── ln-up2 -> ../.. | COMMENT |
| LOW | tests/by-util/test_stdbuf.rs | 1 | // This file is part of the uutils coreutils package. | COMMENT |
| LOW | tests/by-util/test_cp.rs | 1521 | .arg(TEST_HELLO_WORLD_DEST) | COMMENT |
| LOW | tests/by-util/test_cp.rs | 3721 | COMMENT | |
| LOW | tests/by-util/test_rm.rs | 1621 | /// `--preserve-root` must refuse a bind mount of `/`. | COMMENT |
| LOW | tests/by-util/test_tail.rs | 421 | #[test] | COMMENT |
| LOW | tests/by-util/test_tail.rs | 501 | } | COMMENT |
| LOW | tests/by-util/test_tail.rs | 2721 | // tail --follow=name file1 file2 | COMMENT |
| LOW | tests/by-util/test_tail.rs | 4841 | /// >file data | COMMENT |
| LOW | tests/by-util/test_tail.rs | 4901 | COMMENT | |
| LOW | tests/by-util/test_yes.rs | 61 | #[test] | COMMENT |
| LOW | tests/by-util/test_sleep.rs | 301 | COMMENT | |
| LOW | tests/by-util/test_wc.rs | 61 | .stdout_is(" 13 109 772 -\n"); | COMMENT |
| LOW | tests/by-util/test_wc.rs | 101 | #[rstest] | COMMENT |
| LOW | tests/by-util/test_mkdir.rs | 321 | // TODO Enable and modify this for macos when xattr processing for macos is added. | COMMENT |
| LOW | tests/by-util/test_mkdir.rs | 341 | // Reference: `<https://github.com/torvalds/linux/blob/master/include/uapi/linux/posix_acl_xattr.h>` | COMMENT |
| LOW | tests/by-util/test_cat.rs | 901 | /// Location: src/uucore/src/lib/mods/error.rs:751 - `.unwrap()` causes panic | COMMENT |
| LOW | tests/by-util/test_split.rs | 801 | } | COMMENT |
| LOW | tests/by-util/test_install.rs | 1261 | ucmd.arg(file) | COMMENT |
| LOW | tests/by-util/test_printf.rs | 1 | // This file is part of the uutils coreutils package. | COMMENT |
| LOW | tests/by-util/test_printf.rs | 21 | #[case::sub_q_string_special_non_printable(&["non-printable: %q", "test~"], "non-printable: test~")] | COMMENT |
| LOW | tests/by-util/test_printf.rs | 41 | #[case::sub_num_float_e_no_round(&["%e", "99999994"], "9.999999e+07")] | COMMENT |
| LOW | tests/by-util/test_printf.rs | 61 | #[case::sub_any_asterisk_second_param(&["%.*i", "3", "11", "4", "12"], "0110012")] | COMMENT |
| 668 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/test_compare_test_results.py | 519 | # Instead of assertRaises, just call main() and check its return value | COMMENT |
| MEDIUM | util/run-gnu-test.sh | 41 | # --- Self-heal: make the shared GNU harness point at THIS checkout ---------- | COMMENT |
| MEDIUM | util/run-gnu-test.sh | 44 | # PATH, so the harness can silently run a stale/other build. Re-point the PATH | COMMENT |
| MEDIUM | util/run-gnu-test.sh | 55 | # to whatever 'target/*/coreutils' actually exists so the harness adapts to the | COMMENT |
| MEDIUM | tests/by-util/test_ls.rs | 3824 | // Essentially the same test as above, but only test symlinks and directories, | COMMENT |
| MEDIUM | tests/by-util/test_chmod.rs | 1982 | // Assert on the path only (not the mode bits), so the test is robust to the | COMMENT |
| MEDIUM | src/uu/md5sum/Cargo.toml | 45 | # harness = false | COMMENT |
| MEDIUM | src/uu/checksum_common/Cargo.toml | 32 | # harness = false | COMMENT |
| MEDIUM | src/uucore/src/lib/mods/clap_localization.rs | 12 | //! instead of parsing error strings, providing a more robust solution. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/test_compare_size_results.py | 28 | def test_load_sizes_date_keyed(self): | CODE |
| LOW | util/test_compare_size_results.py | 48 | def test_load_sizes_flat_fallback(self): | CODE |
| LOW | util/test_compare_size_results.py | 74 | def test_compare_threshold_boundaries(self): | CODE |
| LOW⚡ | util/test_compare_size_results.py | 99 | def test_compare_added_removed_and_totals(self): | CODE |
| LOW⚡ | util/test_compare_size_results.py | 109 | def test_compare_sort_and_zero_reference(self): | CODE |
| LOW⚡ | util/test_compare_size_results.py | 116 | def test_format_report_renders_changes(self): | CODE |
| LOW | util/test_compare_size_results.py | 137 | def test_main_writes_only_when_significant(self): | CODE |
| LOW | util/test_compare_size_results.py | 156 | def test_main_missing_reference_is_not_fatal(self): | CODE |
| LOW | util/test_compare_test_results.py | 54 | def test_log_extension_removal(self): | CODE |
| LOW | util/test_compare_test_results.py | 94 | def test_with_comments_and_blanks(self): | CODE |
| LOW | util/test_compare_test_results.py | 214 | def test_new_and_removed_tests(self): | CODE |
| LOW | util/test_compare_test_results.py | 250 | def test_skip_to_fail_not_regression(self): | CODE |
| LOW | util/test_compare_test_results.py | 316 | def test_main_exit_code_with_real_regressions(self): | CODE |
| LOW | util/test_compare_test_results.py | 352 | def test_filter_intermittent_fixes(self): | CODE |
| LOW | util/test_compare_test_results.py | 426 | def test_console_output_formatting(self, mock_stderr, mock_stdout): | CODE |
| LOW | util/test_compare_test_results.py | 469 | def test_file_output_generation(self): | CODE |
| LOW | util/test_compare_test_results.py | 507 | def test_exit_code_with_no_regressions(self): | CODE |
| LOW | util/test_compare_test_results.py | 524 | def test_exit_code_with_regressions(self): | CODE |
| LOW | util/test_compare_test_results.py | 548 | def test_github_actions_formatting(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | util/test_compare_test_results.py | 440 | except SystemExit: | CODE |
| HIGH | util/test_compare_test_results.py | 488 | except SystemExit: | CODE |
| HIGH | util/test_compare_test_results.py | 563 | except SystemExit: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/compare_gnu_result.py | 44 | # Check if all failing tests are intermittent based on the environment variable | COMMENT |
| LOW | util/analyze-gnu-results.py | 135 | # Check if file arguments were provided | COMMENT |
| LOW | util/analyze-gnu-results.py | 145 | # Check if the first argument is an output file (starts with -) | COMMENT |
| LOW | util/run-gnu-test.sh | 140 | # Check if the file exists with .sh, .pl extension or without any extension in the $path_GNU directory | COMMENT |
| LOW | util/build-gnu.sh | 81 | # Check if all patches are already applied | COMMENT |
| LOW | .github/workflows/l10n.yml | 540 | # Check if symlinks exist | COMMENT |
| LOW | .github/workflows/manpage-lint.yml | 66 | # Check if manpages were generated | COMMENT |
| LOW | .github/workflows/manpage-lint.yml | 89 | # Check if mandoc produced any output (errors only, not style warnings) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/uu/touch/src/touch.rs | 543 | // we need to check if the path is the path to a directory (ends with a separator) | COMMENT |
| LOW⚡ | src/uu/dirname/src/dirname.rs | 91 | // Step 1: Strip trailing slashes (but not if the entire path is slashes) | COMMENT |
| LOW⚡ | src/uu/dirname/src/dirname.rs | 100 | // Step 2: Check if it ends with `/.` and strip the `/+.` pattern | COMMENT |
| LOW | src/uu/dirname/src/dirname.rs | 124 | // Step 3: Normal dirname - find last / and remove everything after it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/by-util/test_tail.rs | 4274 | // TODO: Add test for the warning `--pid=PID is not supported on this system` | COMMENT |
| LOW | tests/by-util/test_chown.rs | 341 | // TODO: implement once output "failed to change" to stdout is fixed | COMMENT |
| LOW | src/uu/cp/src/cp.rs | 800 | // TODO: implement the following args | COMMENT |
| LOW | src/uu/cp/src/cp.rs | 2982 | // TODO: implement something similar to gnu's lchown | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/uu/dirname/src/dirname.rs | 91 | // Step 1: Strip trailing slashes (but not if the entire path is slashes) | COMMENT |
| LOW⚡ | src/uu/dirname/src/dirname.rs | 100 | // Step 2: Check if it ends with `/.` and strip the `/+.` pattern | COMMENT |
| LOW | src/uu/dirname/src/dirname.rs | 124 | // Step 3: Normal dirname - find last / and remove everything after it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/by-util/test_mv.rs | 3184 | fs::write(&dst_path, "placeholder").expect("Failed to write placeholder dst"); | CODE |
| LOW | tests/by-util/test_basenc.rs | 170 | let input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ".repeat(50); | CODE |
| LOW | tests/by-util/test_basenc.rs | 170 | let input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ".repeat(50); | CODE |
| LOW | tests/by-util/test_basenc.rs | 191 | let input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ".repeat(50); | CODE |
| LOW | tests/by-util/test_basenc.rs | 191 | let input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ".repeat(50); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/build-pgo.sh | 13 | # Usage: | COMMENT |
| LOW | src/uucore/src/lib/features/update_control.rs | 22 | //! # Usage example | COMMENT |
| LOW | src/uucore/src/lib/features/backup_control.rs | 38 | //! # Usage example | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | util/analyze-gnu-results.py | 158 | print(f"Error: File '{json_files[0]}' not found.", file=sys.stderr) | CODE |
| MEDIUM | util/gnu-json-result.py | 38 | print(f"Error processing file {path}: {e}", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | util/test_compare_test_results.py | 410 | # Create an ignore file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | util/run-gnu-test.sh | 92 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/analyze-gnu-results.py | 49 | CODE | |
| LOW | util/run-clippy.py | 34 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | util/run-clippy.py | 6 | CODE |