Skip to content

fix(libc): retain ordinary short character scan fields - #13119

Merged
oneandonlydean merged 2 commits into
boykopovar:mainfrom
JJenkx:fix/libc-ordinary-short-character-fields
Nov 4, 2026
Merged

oneandonlydean merged 2 commits into
boykopovar:mainfrom
JJenkx:fix/libc-ordinary-short-character-fields

Conversation

@JJenkx

@JJenkx JJenkx commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

What

Ordinary Linux character scans delegated to glibc can write a nonempty short %c field and then return EOF, skipping the following %n. Route narrow character fields through the shared scanner so available bytes count as a conversion, suppressed fields advance the input, and exact-width reads leave the next field available. Stream scans retain their recursive lock throughout the operation.

Preserve a reached %n before later input failure, and stop unknown positional syntax as measured in both bundled references. A failed host stream conversion now keeps its own input-versus-matching classification: peeking after it has consumed an invalid numeric prefix must not turn a matching failure into EOF. The contiguous scanner retains its existing failure classification. Ordinary narrow character fields also match the measured 32-bit signed width interpretation: zero or sign-bit-set widths default to one character after retaining the low 32 bits, rather than treating the field width as an unsigned 64-bit length.

Formats containing a q length retain the previous host stream scanner path; their console behavior remains unverified as recorded in the existing debt entry. This prevents the narrow %c routing from rejecting previously accepted quad-length fields.

Landing order agreed with the #9087 author: #13057, this PR, then #9087. #12622 and #12428 already follow #9087, including shared scanner/debt context. Owned #12397, #13012, #13025 and #13049 merged cleanly in the recorded pairwise checks after moving new fixtures out of competing insertion points.

Tested

Latest Linux qualification (2026-11-02): exact head 9083fe9a7e88c5dd26dfb721140fd535771c95f3 on pinned main a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8. Keeps main’s byte-based wide scanner, positional guard and ScansWideInProcess predicate alongside ordinary short-character routing with secure=false. The shared stream path keeps main’s orientation and error handling.

6 focused groups repeated three times: 18 passes, zero skips. Public headers, conventions, whitespace, raw libc/test builds and the actual production NID-patching command passed. MinGW syntax passed for Formatting.cpp. No new Windows/macOS runtime, bundled-SDK reference, native title, GPU or performance claim; earlier evidence retains its historical pins.

Earlier pinned qualifications follow.

Linux x86_64, CPU-only Release build, bundled dependencies. Pinned upstream 08a10d225306ad102b57408e2ef7566bcfb829b2; baseline dda980dc84bd5ee955e98720c293ecb439c0c92d is that main plus #13057. Final candidate 1baea53cdedba020ebd1091b550c7bcf0b92a686, libc SHA256 980ee5aaa73cfda87ed2b96508ba875fcd385009f3b1302c060c00a9416c5db9.

  • Baseline and change: 4/4 focused suites executed and passed, zero skips (guest_formatting, guest_wide_formatting, guest_safe_errors, file_streams). All four pass after the failure-classification and quad-routing corrections.
  • Earlier negative controls load the string and stream regressions against the baseline library and fail at their intended assertions. The new classification regression also fails specifically against the prior public 9602df2c1ae implementation at Stream scan changed a matching failure to input failure; it passes with this correction.
  • Twelve new direct/va-list stream cases cover %qd, %qi, %qu, %qo, %qx and %qX followed by %c%n, checking 64-bit values, consumed count, stream position and the next unread byte. They fail against the previous public 45c9255296d library at the intended quad-length assertion; the new candidate passes. All 11,300 existing comparison rows were rerun and are identical to the previously qualified corrected outputs.
  • Ninety-six explicit direct/va-list string/stream boundary cases cover signed 32-bit limits, low-word wrap and widths beyond 64 bits, including suppression, byte guards, consumed counts, stream position and the next unread byte. Both fixture groups fail against prior public 4741138ff83; the stream assertion identifies the signed-width boundary. The extended matrix finds 240 field-regressed rows per ordinary mode on that old public head and none with this correction; all previous 11,300 outputs remain unchanged. Secure width/capacity behavior is unchanged and its measured gaps are recorded in debt.
  • Fixtures cover direct/va-list calls, empty/short/exact fields, suppression, stream embedded NULs, output guards, stream position/EOF, mixed fields, leading %n, whole-field stream locking, and matching/input failures on ordinary and secure streams.
  • Both bundled references agree across 21,380 generated comparison rows. The corrected candidate matches 3,452 previously mismatching comparison rows, with zero field or individual-byte regressions. Matrices overlap; these are comparison rows, not unique behaviors. Scope includes the original character/count matrices, mixed integer/float/pointer/string/scanset formats, 4,800 floating-prefix boundary rows, and 10,080 additional width-boundary rows across ordinary/secure string/stream modes. Matrices overlap; secure capacity/width gaps, literal-first EOF and incomplete-exponent mismatches remain and are not claimed fixed.
  • The extended boundary matrix found 180 ordinary-stream return regressions in the previous public head; this correction resolves them and also fixes the same pre-existing secure-stream failure classification. References execute as CPU-only converted modules. No physical-console, native-title, GPU, FPS or Windows/macOS runtime result is claimed.

Commands: cmake --build <build> --parallel 2 --target libc guest_formatting_tests guest_wide_formatting_tests guest_safe_error_tests file_streams_tests; ctest --test-dir <build> -V -R '^(guest_formatting|guest_wide_formatting|guest_safe_errors|file_streams)$' --output-junit <arm>.xml.

Current width-boundary correction, probes, both reference outputs, previous-output reruns and qualification, SHA256 778433297b6defa02713104a3bacab07f7bd77b4dfa36e11e25570a320148df0. Upload downloaded and hash-verified.

Earlier quad-routing correction and qualification, SHA256 b8ef70e5797a6dd45e721d5aaa4fc261215f8fd570adef04580e0acdb37ec4f0. Upload downloaded and hash-verified.

Failure-classification correction, qualification, boundary probe/reference outputs, all rerun candidate outputs, JUnit and old-public-head negative, SHA256 1c3aa7508eb40f98fbb031424643e70602cff026baa165e6ab2d11e802909961.

Original baseline/probes/reference matrices and initial negative controls, SHA256 1a50f44872ef93a247f4f227fe047124f3a828fb473111c887b37293dfd56995. Its candidate-head results are historical; the current correction and expanded results above supersede them. Both uploads were downloaded and hash-verified. Only authored synthetic evidence is attached, no reference binaries.

Independent Windows validation: bunbeans2-arch reports Windows 11 Pro22631, i9-9900K, UCRT64 GCC16.1, Release, this 1baea53cde stack merged into main f7f03daf52. file_streams and guest_formatting pass5/5; plain main passes both3/3. Their reset-to-main Formatting.cpp control fails the file-lock check5/5 while formatting still passes. That control also removes stacked #13057, so it validates the combined stack's lock behavior, not this PR's character-field changes independently. The Linux field-specific negative controls and SDK matrices above retain that narrower attribution. This is an external contributor report; no Windows agent was resumed for it. #13057 has merged; this refreshed branch integrates that main history.

Qualification update — 2026-10-30, repeat 2

Integrated main e471817c68d4e1b1e44b0ce369ed88bafe4ae8ed at dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669, preserving the old public head and actual integration parent e471817c68d4e1b1e44b0ce369ed88bafe4ae8ed.

Resolved the narrow-character dispatch conflict with the existing measured ordinary-route/large-width logic. The generalized locking fixture keeps both secure routes and both ordinary routes; main's secure locking assertions remain. No new scanning semantics were added.

Focused Linux CPU: 12 passes (guest_formatting, guest_scan_count, guest_stdio_variadic, file_streams), public_headers passed once, zero skips. MinGW syntax and conventions pass.

Windows source/runtime qualification is owned by the resumed Windows worker and is separate from these Linux results. No new native SDK/title/GPU/performance claim.

Evidence: immutable qualification receipts, SHA-256 0e170ba60a93a8b65f4dac8050f68833249b80b5ef519f05d38340700cedeb5b (download verified).

Actual Windows qualification at exact refreshed public dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669: Windows 11 Enterprise 10.0.22621, Ryzen 9 5950X, WinLibs GCC 15.2 UCRT r7, Ninja Release, BUILD_TESTING=ON. Rebuilt patched libc and focused tests, then repeated guest_formatting, guest_scan_count, guest_stdio_variadic, file_streams three times: 12 passes, 0 skips. Windows FIFO 726e47f972f64c37a5e32a05f5a08c41, isolated source/build reused only between completed own tests. No SDK/game/GPU/performance or new reference-data claim. Evidence: https://github.com/JJenkx/AnyPS5/releases/download/linux-validation-20261023/owned-current-windows-20261030-repeat2.tar.gz, SHA256 e423c97373758bf59239e02c138b74f35f1a45488793bc92878a4c836f94a584. AI-assisted: yes (Codex).

AI-assisted: yes (Codex).

Current-main qualification — 2026-10-30, repeat 3

Rebased to 0502e85d9873f69f4ac7377cc5b8e9c7ab0a68ad on tested main d2863131efb0e41c116e4197841b6a3086ce087a, using an exact lease from dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669. The remaining series contains six authored commits in the original order. Three earlier commits became empty because main already contains the secure short-character implementation, whole-scan lock and include grouping; they were not duplicated. The old main-integration merge is incorporated through the new base.

The measured ordinary short-character, signed-width, matching/input-failure and host-q stream behavior remains. Main's new ordinary string q cutoff and character-length policy are preserved. Existing EOF/read-error errno fixtures are byte-identical to main; the measured ordinary string/stream and four-route lock fixture assertions match the previous head after normalizing temporary-file helper spelling. Main's portable temporary-file fixtures remain. No fixture assertions were weakened.

Fresh Linux Release libc and test builds pass guest_formatting, guest_wide_formatting, guest_safe_errors, file_streams, guest_scan_count and guest_stdio_variadic three times each: 18 passes, plus public_headers once, zero skips. Three MinGW production/fixture syntax checks pass. The existing test macro and command line both define WIN32_LEAN_AND_MEAN, producing one harmless redefinition warning. Conventions, whitespace, authored-series and submodule-pointer checks pass.

Later main 6b48aee5d2ea9fce6155163d78f8ce8dc84f7827 leaves every topic file unchanged and has a clean merge preview; it was not executed. No fresh Windows, macOS, SDK/reference matrix, negative-control, title, GPU or performance run is claimed. Earlier 11,300-row comparisons and Windows results retain their original pins. AI-assisted: yes (Codex).

Immutable source, build and test receipts, SHA-256 784c7afd95828e9d3ec65614c80683f1ed09ce1874c0fa685b3f96c48b25dba0 (download verified).

Checklist

@JJenkx

JJenkx commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor Author

Resolved in 45c9255296d7b56114ef5bf1dd6406424183cf06. Additional floating-prefix qualification found180 ordinary stream result regressions in prior public 9602df2c1ae: for example %1f %1c%n on + returned EOF instead of matching failure0. The shared scanner now uses the host conversion's result to distinguish stream matching failure from input failure, rather than peeking after the failed conversion consumed its prefix. Contiguous scanning retains its prior rule.

The new stream fixture fails specifically against the old public library and passes with this correction. Four focused suites pass; all11,300 comparison rows have zero field/byte regressions, with2,604 corrected comparison rows versus the documented main+#13057 baseline. Matrices overlap. The PR description now links the current source pins, outputs and negative control. The hold requested for the old head is resolved; this is a production change and needs review on the new head.

@orezraey Please retain this stream failure-classification correction alongside both conversion-bookkeeping paths when integrating after the agreed landing order.

Current correction evidence, SHA256 1c3aa7508eb40f98fbb031424643e70602cff026baa165e6ab2d11e802909961. CPU-only evidence, no new title/FPS/Windows runtime claim. AI-assisted: yes.

@orezraey

Copy link
Copy Markdown
Contributor

Will do: when #9087 is refreshed after this lands, it keeps the stream matching-versus-input failure classification from 45c9255 together with both ordinary and secure contiguous conversion bookkeeping, and the formatting tests are rerun on the merged head.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@JJenkx the %c handling matches the reference rows, the stream lock is held throughout, and the negative controls fail at the intended assertions. One regression to fix before landing:

  1. For a format that contains a narrow %c, fscanf, vfscanf (and so scanf/vscanf) now go through the in-process scanner. That scanner does not know the q length: ScanSource reads lengths from "hljztL" and its non-secure conversion check rejects q, so the scan ends there. fscanf(f, "%qd %c", &value, &c) used to reach the host scanner, which reads q as ll (the scanf entry in the libc debt file says so for these four functions); now it returns 0 with nothing stored. sscanf/vsscanf are not affected, they cut the format at q before this code. Please either treat q as ll in the in-process path for the stream entry points, or send formats containing q to the old path, and add one row to the tests; none of the attached probe formats has a q length. If you would rather keep the new behaviour, the debt entry has to say that a q in a format with %c ends the scan.

  2. Landing: this branch carries copies of the two fix(libc): retain short stream character scan fields #13057 commits and then edits the same %c block, so it already conflicts with fix(libc): retain short stream character scan fields #13057's head in Formatting.cpp and FileStreams.cpp. That is expected for a stack; please rebase onto main after fix(libc): retain short stream character scan fields #13057 lands so the PR shows only its own change. The same two files conflict with fix(libc): follow snprintf_s and sscanf_s constraints as measured on a PS5 #9087 and fix(libc): check sprintf_s and vsprintf_s as titles' libc.prx does #12622 today, and docs/dev/debt/libc.md with fix(libc): match bundled narrow scansets and scan directive parsing #12428, which matches the order you describe. I confirmed fix(libc): print %C, %S and a zero %lc in the printf families as titles' libc.prx does #12397, fix(libc): preserve errno on string scan input exhaustion #13012, fix(libc): preserve errno on stream scan input exhaustion #13025 and fix(libc): ignore non-wide lengths on character scans #13049 merge cleanly with this head.

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 7851 docs/dev/debt/libc.md L107
PR 15801 core/libs/prx/libc/src/Formatting.cpp L92, L563-564, L668
PR 15802 core/libs/prx/libc/src/Formatting.cpp L92, L394-396, L563-564, L668
PR 15803 core/libs/prx/libc/src/Formatting.cpp L92, L394-396, L563-564, L668
PR 15804 core/libs/prx/libc/src/Formatting.cpp L92, L394-396, L563-564, L668
PR 15807 core/libs/prx/libc/src/Formatting.cpp L92, L394-396, L563-564, L668

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 5021 core/libs/tests/Formatting.cpp
docs/dev/debt/libc.md
PR 5303 docs/dev/debt/libc.md
PR 6819 docs/dev/debt/libc.md
PR 7081 docs/dev/debt/libc.md
PR 7386 core/libs/prx/libc/src/Formatting.cpp
core/libs/tests/FileStreams.cpp
core/libs/tests/Formatting.cpp
docs/dev/debt/libc.md
PR 7447 docs/dev/debt/libc.md
PR 7715 docs/dev/debt/libc.md
PR 8150 core/libs/tests/FileStreams.cpp
docs/dev/debt/libc.md
PR 8965 docs/dev/debt/libc.md
PR 9340 core/libs/prx/libc/src/Formatting.cpp
core/libs/tests/Formatting.cpp
docs/dev/debt/libc.md
PR 9371 docs/dev/debt/libc.md
PR 9447 docs/dev/debt/libc.md
PR 9526 docs/dev/debt/libc.md
PR 10158 docs/dev/debt/libc.md
PR 10200 docs/dev/debt/libc.md
PR 10397 docs/dev/debt/libc.md
PR 10405 docs/dev/debt/libc.md
PR 10780 docs/dev/debt/libc.md
PR 11172 docs/dev/debt/libc.md
PR 11661 docs/dev/debt/libc.md
PR 11689 docs/dev/debt/libc.md
PR 11698 docs/dev/debt/libc.md
PR 12510 docs/dev/debt/libc.md
PR 12511 docs/dev/debt/libc.md
PR 12518 docs/dev/debt/libc.md
PR 12704 docs/dev/debt/libc.md
PR 12849 docs/dev/debt/libc.md
PR 13449 docs/dev/debt/libc.md
PR 13486 core/libs/prx/libc/src/Formatting.cpp
core/libs/tests/FileStreams.cpp
core/libs/tests/Formatting.cpp
docs/dev/debt/libc.md
PR 13794 docs/dev/debt/libc.md
PR 13804 docs/dev/debt/libc.md
PR 13809 docs/dev/debt/libc.md
PR 14085 docs/dev/debt/libc.md
PR 14212 docs/dev/debt/libc.md
PR 14559 core/libs/tests/FileStreams.cpp
PR 14560 core/libs/tests/FileStreams.cpp
PR 15095 docs/dev/debt/libc.md

@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Manual shared-file review for the overlap bot's “could not compare” entries, at this PR's 45c9255296d head. These branches already conflict with main, so this is a content review, not a claim of clean pairwise merges.

Peer Reviewed shared-file scope
#5021 (151294f979ab) Test va-list aliases, already present here; no narrow character-scan semantics.
#8150 (6a9b1285c596) Entropy-character/sticky-error tests.
#12057 (b03facfbd4ab) Windows unbuffered update-stream tests.
#7386 (bf7352321cf8) Broad wide-stream/input refactor; needs to retain the ordinary narrow routing, short/suppressed counts, reached %n, whole-scan lock and stream failure distinction added here.
#9340 (3f2fa3b28050) Wide scanset/non-BMP decoding and tests; complementary to the narrow field path.
#10324 (5e32fdc2a5cc) Stream orientation calls; the shared-scanner routes added here must also become byte-oriented when that API lands.

The other14 bot-listed peers share only docs/dev/debt/libc.md with this change; their entries concern other behaviors. No second ordinary short-character-field implementation was found in the reviewed shared-file patches.

@peeldealer @Canzi18 @MarrasFederico Proposed order for these shared source changes: #13057, this PR, then your refreshed branches keeping both behaviors and regression sets. In #10324, placing byte orientation in the shared stream scanner (or before its dispatch) will cover the early narrow path as well. Please confirm the order or suggest a preferred integration order. The order with #9087 and its stacked follow-ups is already agreed above.

AI-assisted: yes.

@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Fixed in 4741138ff832bdc205f61ec101ac73d36bbfb36b using your suggested preservation of the old path: formats containing a quad-length directive remain on the host stream scanner, so the new narrow-character routing does not reject %qd and friends. No expansion of console-unverified quad semantics is claimed.

Added 12 direct/va-list stream cases for %qd, %qi, %qu, %qo, %qx and %qX followed by %c%n, checking values beyond 32 bits, consumption, the next unread byte and stream errors. The fixture fails against prior public 45c9255296d at Ordinary stream scan lost the host quad length, then passes with the correction. All four focused suites pass with zero skips; all 11,300 previous comparison rows were rerun and remain identical. Conventions passes against refreshed origin/main.

The description now names this head and links the correction evidence, SHA256 b8ef70e5797a6dd45e721d5aaa4fc261215f8fd570adef04580e0acdb37ec4f0, downloaded and verified. I will remove the stacked #13057 commits by rebasing after that prerequisite lands, as requested. CPU-only Linux qualification; AI-assisted: yes.

@JJenkx

JJenkx commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor Author

Resolved in 1baea53cdedba020ebd1091b550c7bcf0b92a686. Ordinary narrow-character fields now use the measured signed 32-bit width behavior: the low 32 bits are retained, and zero or a sign-bit-set width defaults to one character. This removes the extra consumption on %2147483648c and related fields. Secure width/capacity behavior is unchanged; its pre-existing reference differences are recorded in debt.

The 96 new direct/va-list string/stream cases fail against old public 4741138ff83 and pass with this correction. Four focused suites pass with zero skips. The expanded 10,080-row boundary matrix agrees between both references and has zero field or individual-byte regressions; it resolves all 480 field-regressed ordinary rows of old 474 in that expanded matrix. Every output of the earlier 11,300-row qualification remains unchanged. Totals are comparison rows with overlapping cases, not unique behaviors. Conventions and whitespace pass.

The hold on the previous head is resolved. @oneandonlydean @orezraey Please retain this ordinary-width correction alongside the already coordinated scanner changes; the existing landing order is unchanged. No title, FPS, GPU or Windows runtime result is claimed.

Correction and numeric/synthetic qualification evidence, SHA256 778433297b6defa02713104a3bacab07f7bd77b4dfa36e11e25570a320148df0, uploaded/downloaded and verified. No reference binaries attached. AI-assisted: yes.

@bunbeans2-arch

Copy link
Copy Markdown
Contributor

A Windows run with GCC 16: Windows 11 Pro 10.0.22631, i9-9900K, MSYS2 UCRT64 GCC 16.1.0, Release, this PR (1baea53cde) merged into main f7f03da.

  • With this PR: file_streams and guest_formatting passed 5 of 5.
  • Same tree with only Formatting.cpp put back to main (this PR's tests kept): file_streams failed 5 of 5 at the new check Short stream character scan released its file lock during a field; guest_formatting still passed.
  • main f7f03da alone (its own tests and source): both passed 3 of 3.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 30, 2026
JJenkx added a commit to JJenkx/AnyPS5 that referenced this pull request Oct 30, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 30, 2026
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 30, 2026
@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Linux run at this PR's exact head dbf670a5cb (dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669), not merged onto anything else; its base on main is e471817c68.

Arch Linux, kernel 7.2.9, Ryzen 9 7950X, g++ (GCC) 16.2.1 20260810, glibc 2.44, x86-64. Release, BUILD_TESTING=ON, Ninja -j4, private worktree.

  • ctest -R '^(guest_formatting|file_streams)$': passes in each of 3 runs (6 passes).

@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Qualification update — 2026-10-30, repeat 2

Integrated main e471817c68d4e1b1e44b0ce369ed88bafe4ae8ed at dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669, preserving the old public head and actual integration parent e471817c68d4e1b1e44b0ce369ed88bafe4ae8ed.

Resolved the narrow-character dispatch conflict with the existing measured ordinary-route/large-width logic. The generalized locking fixture keeps both secure routes and both ordinary routes; main's secure locking assertions remain. No new scanning semantics were added.

Focused Linux CPU: 12 passes (guest_formatting, guest_scan_count, guest_stdio_variadic, file_streams), public_headers passed once, zero skips. MinGW syntax and conventions pass.

Windows source/runtime qualification is owned by the resumed Windows worker and is separate from these Linux results. No new native SDK/title/GPU/performance claim.

Evidence: immutable qualification receipts, SHA-256 0e170ba60a93a8b65f4dac8050f68833249b80b5ef519f05d38340700cedeb5b (download verified).

Actual Windows qualification at exact refreshed public dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669: Windows 11 Enterprise 10.0.22621, Ryzen 9 5950X, WinLibs GCC 15.2 UCRT r7, Ninja Release, BUILD_TESTING=ON. Rebuilt patched libc and focused tests, then repeated guest_formatting, guest_scan_count, guest_stdio_variadic, file_streams three times: 12 passes, 0 skips. Windows FIFO 726e47f972f64c37a5e32a05f5a08c41, isolated source/build reused only between completed own tests. No SDK/game/GPU/performance or new reference-data claim. Evidence: https://github.com/JJenkx/AnyPS5/releases/download/linux-validation-20261023/owned-current-windows-20261030-repeat2.tar.gz, SHA256 e423c97373758bf59239e02c138b74f35f1a45488793bc92878a4c836f94a584. AI-assisted: yes (Codex).

AI-assisted: yes (Codex).

@github-actions github-actions Bot added libc docs needs rebase Conflicts with main, rebase needed labels Oct 30, 2026
@JJenkx
JJenkx force-pushed the fix/libc-ordinary-short-character-fields branch from dbf670a to 0502e85 Compare October 30, 2026 22:59
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 30, 2026
@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Current-main qualification — 2026-10-30, repeat 3

Rebased to 0502e85d9873f69f4ac7377cc5b8e9c7ab0a68ad on tested main d2863131efb0e41c116e4197841b6a3086ce087a, using an exact lease from dbf670a5cb1afa5d9948ebfdcdb1bea4ad8de669. The remaining series contains six authored commits in the original order. Three earlier commits became empty because main already contains the secure short-character implementation, whole-scan lock and include grouping; they were not duplicated. The old main-integration merge is incorporated through the new base.

The measured ordinary short-character, signed-width, matching/input-failure and host-q stream behavior remains. Main's new ordinary string q cutoff and character-length policy are preserved. Existing EOF/read-error errno fixtures are byte-identical to main; the measured ordinary string/stream and four-route lock fixture assertions match the previous head after normalizing temporary-file helper spelling. Main's portable temporary-file fixtures remain. No fixture assertions were weakened.

Fresh Linux Release libc and test builds pass guest_formatting, guest_wide_formatting, guest_safe_errors, file_streams, guest_scan_count and guest_stdio_variadic three times each: 18 passes, plus public_headers once, zero skips. Three MinGW production/fixture syntax checks pass. The existing test macro and command line both define WIN32_LEAN_AND_MEAN, producing one harmless redefinition warning. Conventions, whitespace, authored-series and submodule-pointer checks pass.

Later main 6b48aee5d2ea9fce6155163d78f8ce8dc84f7827 leaves every topic file unchanged and has a clean merge preview; it was not executed. No fresh Windows, macOS, SDK/reference matrix, negative-control, title, GPU or performance run is claimed. Earlier 11,300-row comparisons and Windows results retain their original pins. AI-assisted: yes (Codex).

Immutable source, build and test receipts, SHA-256 784c7afd95828e9d3ec65614c80683f1ed09ce1874c0fa685b3f96c48b25dba0 (download verified).

@JJenkx
JJenkx force-pushed the fix/libc-ordinary-short-character-fields branch from 0502e85 to 9083fe9 Compare November 2, 2026 17:57
@JJenkx

JJenkx commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

Current-main qualification at 9083fe9a7e88c5dd26dfb721140fd535771c95f3, tested main a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8. Keeps main’s byte-based wide scanner, positional guard and ScansWideInProcess predicate alongside ordinary short-character routing with secure=false. The shared stream path keeps main’s orientation and error handling.

Linux: guest_formatting, guest_stdio_variadic, guest_scan_count, file_streams, guest_wide_stream_scan, guest_wide_conversion, each three times: 18 passes, zero skips. Public headers, conventions, whitespace, raw production libc and test builds, and the production NID patch command pass. MinGW syntax passed for Formatting.cpp. Main gitlinks and relevant fixtures/helpers are preserved.

Forcing secure scanning on the ordinary stream route fails the existing supported stream-contract assertion in file_streams; exact restoration passes and reproduces the raw libc hash. This is not a claim that the later named short-field assertion was reached.

No new Windows/macOS, console/reference-library, title, GPU or performance run is claimed. Earlier measurements and controls remain at their original pins. AI-assisted: yes (Codex).

Immutable source, command and test evidence, SHA-256 0e0231161112ecd15878b8abd7273e56dbc3644bf2506e3f10dd0c7d20be24eb (public download verified).

@MarrasFederico

Copy link
Copy Markdown
Contributor

#10324 is merged, so nothing on my side needs to come first. At 9083fe9a7e the new fscanf and vfscanf routes both go through ScanGuestStream, which calls Orientation(-1) after the IsOpen check, so the early narrow path makes the stream byte-oriented as well. No changes needed from me.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

❌ AMD GPU test: failed

PR head 9083fe9 merged onto main a4eca2a · tested 2026-11-03 02:00 UTC · 51 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ❌ 3,403 passed · 16 failed (1 new: 1 fail on main with the PR's tests too, 13 also fail on main, 2 unstable on main) · 122 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 3,541 of 3,591 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (1371 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.7 s, ⚠️ agc_driver_graphics_maps_fallback 120.4 s, ⚠️ agc_driver_graphics 120.2 s, ⚠️ public_headers 90.2 s, ⚠️ agc_driver_image_sample_unnormalized 72.7 s

Failing tests

This PR changes test files, so each failing test was also built and run on main with only the PR's test changes applied. ✅ there means the failure comes from the PR's other changes; ❌ means the test fails on main too, so this run does not show the PR caused it.

Test With this PR Same test on main a4eca2a (main + this PR's test changes only)
file_streams ❌ failed ❌ also fails
file_streams: Subprocess aborted (also failed when re-run alone), assertion and diagnostics
ctest: Subprocess aborted

[libc] unhandled exception 'St13runtime_error' thrown from 0x5fd736fbe09d
terminate called after throwing an instance of 'std::runtime_error'
  what():  Stream scan changed a matching failure to input failure
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_array_layer_target_cpu: failed in 1 of the last 6 main runs
agc_driver_pipeline_journal: failed in 4 of the last 6 main runs
Failing on main too (13, not counted against this PR)
agc_driver_guest_memory_lifetime_direct
agc_driver_image_table
agc_driver_job_manager_compute_capacity
agc_driver_native_depth_bda_clear
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_driver_native_multisample_depth
agc_driver_submit_progress
agc_idle_publish_wait
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Passed on retry (8, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_dithered_alpha_to_coverage: Timeout in the parallel run; also passed only on retry in 4 other runs in the last 7 days
agc_driver_emulated_color_compare: Timeout in the parallel run; also passed only on retry in 20 other runs in the last 7 days
agc_driver_emulated_color_compare_srgb_decode: Timeout in the parallel run; also passed only on retry in 5 other runs in the last 7 days
agc_driver_graphics: Timeout in the parallel run; also passed only on retry in 55 other runs in the last 7 days
agc_driver_graphics_maps_fallback: Timeout in the parallel run; also passed only on retry in 65 other runs in the last 7 days
agc_driver_same_queue_label_wait: Failed in the parallel run; also passed only on retry in 2 other runs in the last 7 days
agc_driver_sgpr_pattern_fill_keys: Failed in the parallel run; also passed only on retry in 1 other runs in the last 7 days
public_headers: Timeout in the parallel run; also passed only on retry in 4 other runs in the last 7 days
Validated but not compared (65, not in the main baseline's validation pass)
file_streams
public_headers
public_headers_compile_0
public_headers_compile_1
public_headers_compile_10
public_headers_compile_11
public_headers_compile_12
public_headers_compile_13
public_headers_compile_14
public_headers_compile_15
public_headers_compile_16
public_headers_compile_18
public_headers_compile_19
public_headers_compile_2
public_headers_compile_20
public_headers_compile_21
public_headers_compile_22
public_headers_compile_23
public_headers_compile_24
public_headers_compile_25
public_headers_compile_26
public_headers_compile_27
public_headers_compile_28
public_headers_compile_29
public_headers_compile_3
public_headers_compile_30
public_headers_compile_31
public_headers_compile_32
public_headers_compile_33
public_headers_compile_34
public_headers_compile_35
public_headers_compile_36
public_headers_compile_37
public_headers_compile_38
public_headers_compile_39
public_headers_compile_4
public_headers_compile_40
public_headers_compile_41
public_headers_compile_42
public_headers_compile_43
public_headers_compile_44
public_headers_compile_45
public_headers_compile_46
public_headers_compile_47
public_headers_compile_48
public_headers_compile_49
public_headers_compile_5
public_headers_compile_50
public_headers_compile_51
public_headers_compile_52
public_headers_compile_53
public_headers_compile_54
public_headers_compile_55
public_headers_compile_56
public_headers_compile_57
public_headers_compile_58
public_headers_compile_59
public_headers_compile_6
public_headers_compile_60
public_headers_compile_61
public_headers_compile_62
public_headers_compile_63
public_headers_compile_7
public_headers_compile_8
public_headers_compile_9
Validation IDs already present on main (4 IDs in 749 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (749 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, and 741 more
VUID-vkCmdCopyImage-srcImage-01548 (10 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, and 2 more
VUID-vkCmdCopyImage-srcImage-01551 (10 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, and 2 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (122)
usage: check_skips.py [-h] [--job {linux,windows}] [--list] [--require-tests]
                      junit
check_skips.py: error: /home/ben/anyps5-gpu-ci/data/runs/pr-13119/9083fe9a7e88-a4eca2a056bf/ctest.xml: testcase 'public_headers_compile_0' is notrun and was not run
Reproduce
git fetch origin 9083fe9a7e88c5dd26dfb721140fd535771c95f3 a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8
git checkout a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8 && git merge --no-ff 9083fe9a7e88c5dd26dfb721140fd535771c95f3
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 12 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 16 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1
# the failing tests, on this merge and on main:
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(file_streams)$' --parallel 1 -V

Automated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

Hi JJenkx,

The TechLevelZero AMD run at 9083fe9a7e (Ubuntu 24.04 container) has file_streams aborting on Stream scan changed a matching failure to input failure (core/libs/tests/FileStreams.cpp:570), also when re-run alone. This is a CPU test, so the GPU isn't the cause. I think the cause is the host glibc.

The new loop at FileStreams.cpp:557-574 expects a matching failure (0) for every input in {"+", "-", ".", "+.", "0x", "0x.", "infi", "nan("} with "%64f %1c%n". The scan reaches glibc (__isoc99_vfscanf / __isoc99_vsscanf, core/libs/prx/libc/src/Formatting.cpp:31-32, :187, :204), and glibc versions disagree on two of those inputs. A plain C fscanf(f, "%64f %1c%n", ...) on each input gives:

input glibc 2.44 (Arch) glibc 2.39 (Ubuntu 24.04)
0x. returns 0, value untouched returns 1, value 0
nan( returns 0 returns 2, value NaN, %1c takes the (

The other eight inputs of the loop (including "" and " ", which expect EOF) give the same result on both. Ubuntu 24.04 is also what the hosted Linux runners use, so the check would fail there after a merge even though it passes on newer glibc.

Could you make the check not depend on the host glibc? For example, assert the two inputs separately as "whatever the host glibc returns" (or leave them out of the loop with a debt note), and keep the strict matching-failure expectation for the inputs every glibc agrees on. If the console's result for 0x. and nan( is known, please name it, and say in the debt entry that Linux follows the host glibc here.

The stream scan check expected a matching failure for "0x." and "nan(" under
"%64f %1c%n", but glibc versions disagree on those two: 2.44 fails both, while
2.39 converts "0x." to 0 and "nan(" to NaN with the "(" left for %1c. The eight
inputs every glibc agrees on keep the strict check; the two others must now give
what the host's own fscanf gives, with nothing stored when the host reports a
matching failure. The debt entry names both glibc behaviours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JJenkx

JJenkx commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

@oneandonlydean thanks, you were right that this depended on the host glibc. Done in 5395199de1 (on top of 9083fe9a7e), following your first suggestion:

  • The strict matching-failure loop keeps the eight inputs every glibc agrees on ("", " ", +, -, ., +., 0x, infi).
  • 0x. and nan( are now checked against the host itself: for each of the four scanners the result must equal what the host's own fscanf(f, "%64f %1c%n", ...) returns on the same input, and when the host reports a matching failure nothing may be stored. With a narrow %c the scanners take ScanGuestStream → ScanSource, which hands the %64f directive to the host one directive at a time (HostFscanf), so the float field follows glibc on every scanner.
  • The scanf-family debt entry now says that on Linux a float conversion of 0x. or nan( follows the host glibc (2.44 fails both; 2.39 converts 0x. to 0 and nan( to NaN, leaving the ( for the next conversion), and that the console's result is not measured.

Tested: glibc 2.44 (Arch, GCC 16.2.1, Release) file_streams 3/3 and check_conventions.py; glibc 2.39 (Ubuntu 24.04, GCC 13.3), checked independently on an extract of the exact float-field fixture and Formatting.cpp's ScanSource with the plain and secure adapters: the old head 9083fe9a7e fails the matching-failure assertion there and 5395199de1 passes; on 2.44 both pass. That 2.39 check covers the scanner core and this fixture block, not a full file_streams build. A plain C probe reproduces your table on both.

AI-assisted: yes.

Independent glibc reproduction, exact fixture/core probes, source proofs and raw logs, SHA-256 79fc36ea96c63cb84494cb93c1938252f6344fd291a4ed6c1c812a686ed3691c (uploaded archive downloaded and verified). This archive covers the narrow core/fixture qualification described above, not a complete Ubuntu file_streams run.

@JJenkx

JJenkx commented Nov 3, 2026

Copy link
Copy Markdown
Contributor Author

Windows run at exact head 5395199de1: the new host-dependent float scan check passes, and Windows' C runtime is a third behaviour for the two inputs.

Setup: Windows 11 Enterprise 22621, MinGW-w64 GCC 15.2.0 UCRT (r7), Release, BUILD_TESTING=ON, fresh build directory.

  • Tests: guest_formatting, guest_stdio_variadic, guest_scan_count, file_streams, guest_wide_stream_scan and guest_wide_conversion all pass in each of 3 runs (18 passes), none skipped. The build has 0 errors and 0 warnings.

  • The host here is UCRT, not glibc. A standalone probe built with the same toolchain runs fscanf(f, "%64f %1c%n", ...) on a temporary file:

    Input Result Stored
    0x. -1 nothing (value 42, Z, -77)
    nan( -1 nothing (value 42, Z, -77)

    So UCRT reports EOF for both. glibc 2.44 reports a matching failure, and 2.39 converts them. The guest scan matches the host on Windows too. The debt entry could name UCRT as well, since on Windows a title sees -1 for these two inputs.

AI-assisted: yes.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head 5395199 merged onto main 7feb37e · tested 2026-11-03 06:32 UTC · 31 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 3,621 passed · 13 failed (0 new, 12 also fail on main, 1 unstable on main) · 59 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 3,693 of 3,743 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (1308 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 121.5 s, ⚠️ agc_driver_graphics_maps_fallback 89.4 s, ⚠️ agc_driver_graphics 80.6 s, ⚠️ agc_driver_image_sample_unnormalized 70.5 s, ⚠️ agc_driver_lazy_resolved_abi 67.1 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 5 of the last 7 main runs
Failing on main too (12, not counted against this PR)
agc_driver_guest_memory_lifetime_direct
agc_driver_image_table
agc_driver_job_manager_compute_capacity
agc_driver_native_depth_bda_clear
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_driver_native_multisample_depth
agc_driver_submit_progress
agc_idle_publish_wait
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (4 IDs in 752 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (752 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, and 744 more
VUID-vkCmdCopyImage-srcImage-01548 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-vkCmdCopyImage-srcImage-01551 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (59)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_copied_writer_label_order_drain: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_driver_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWi
Reproduce
git fetch origin 5395199de1f52f3dd79ac412a25a6627fdfa8eac 7feb37ee3e30e10139b483fb4df689d5b5b69ab8
git checkout 7feb37ee3e30e10139b483fb4df689d5b5b69ab8 && git merge --no-ff 5395199de1f52f3dd79ac412a25a6627fdfa8eac
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 12 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 16 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@oneandonlydean
oneandonlydean merged commit 2694196 into boykopovar:main Nov 4, 2026
20 checks passed
orezraey added a commit to orezraey/AnyPS5 that referenced this pull request Nov 4, 2026
Keep boykopovar#13119's ordinary %n bookkeeping beside the secure contiguous one,
route sscanf through ScansInProcess, and give the shared secure stream
%c loop the 32-bit width rule and the destination-size clamp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants