You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[rustjava-next-slice-and-stale-next-pointer] fix(rustjava-runtime): EUC-KR 쌍이 readBuf 경계를 넘어가게 한다 — 그리고 ## 다음 을 전수 재측했다
`LANE_IDLE rustjava`(1088분)의 근인은 워커가 아니라 발권이었고, 발권이 멈춘 이유는
`STATE.md` `## 다음` 의 최우선 항목이 이미 끝난 일을 가리켰기 때문이다(세 번째 재발).
8개 후보를 `git merge-base --is-ancestor` 로 전수 재측해 7건이 닫혀 있음을 확인하고
사료로 접었다. 유일하게 열려 있던 ④-3(InputStreamReader 디코더 경계)이 실제 결함이었다.
EUC-KR 보류 술어가 「마지막 바이트 >= 0x81 이면 한 바이트 보류」였는데, EUC-KR 후행
바이트는 선두 범위(0x81..=0xfe)와 겹친다 ⇒ 완성된 쌍의 후행도 보류돼 그 쌍의 선두가
홀로 남고, read() 마다 새로 만드는 디코더가 그 선두를 자기 상태로 삼킨 채 버려졌다.
실측 "12345678한" → "12345678\u{FFFD}". 전방 주사(선두면 2, 아니면 1)로 고쳤다.
개악 3종 전건 red: M1 종전 술어 복원 → U+FFFD · M2 보류 가지 제거 → 글자 소실 ·
M3 UTF-8 역주사 무력화 → 형제 2건 red 이고 새 테스트는 green(독립 프로브임의 증거).
DoD 10명령 rc=0 · cargo test --all 592 passed / 0 failed / 1 ignored.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: REPORT.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,14 @@
1
1
# REPORT
2
+
## [2026-09-23]`## 다음` 이 세 번째로 낡았고, 그 밑에서 EUC-KR 한 글자가 조용히 사라지고 있었다 (rustjava-next-slice-and-stale-next-pointer)
3
+
- 무엇을: `STATE.md``## 다음` 의 모든 「다음 후보」를 `git merge-base --is-ancestor` 로 **전수 재측**해 **8건 중 7건이 이미 닫혀 있음**을 확인하고 사료로 접었으며, 살아 있는 후보만 새 `⓪` 블록에 올렸다. 재측 과정에서 유일하게 «열려 있던» 항목(④-3 `InputStreamReader` 디코더)이 실제 결함임이 드러나 **그 자리에서 고쳤다**.
4
+
- 왜: `LANE_IDLE rustjava`(2026-09-23 · ★**1088분** 조용 · 큐 0 · running 0). 근인은 워커가 아니라 **발권**이었고, 발권이 멈춘 이유는 `## 다음` 의 최우선 항목이 **이미 끝난 일**을 가리켰기 때문이다. ★**이 절이 그 병을 스스로 두 번 기록해 놓고 세 번째를 냈다** — 2026-09-11 에 「다음 실작업 = ③의 null-guard」로 고쳐 쓴 그 null-guard 가 **같은 날 이미 닫혀 있었다**(`6da7d66f`).
5
+
- 사용자 영향: ★**EUC-KR 로 읽는 파일에서 문자가 사라지던 것이 멈춘다.**`new InputStreamReader(in)` 가 `file.encoding=EUC-KR` 에서 10바이트 읽기 경계에 걸린 한글을 `\u{FFFD}` 로 바꾸거나 **통째로 버렸다**. 실측 `"12345678한"` → ★`"12345678\u{FFFD}"`. 이제 원문 그대로다.
6
+
- ★★**근인 — 「완화책이 들어왔다」와 「완화책이 옳다」는 다른 문장이다.** 사료는 upstream 완화책이 ①의 머지로 들어온다고 적고 「다시 재라」고 남겼다. 들어오긴 했는데 **두 멀티바이트 charset 중 하나만 옳았다**: UTF-8 역주사는 연속 바이트(`0x80..=0xbf`)가 선두 바이트와 **서로소**라 성립하는데, EUC-KR 판은 「마지막 바이트 ≥ 0x81 이면 한 바이트 보류」였고 ★**EUC-KR 후행 바이트는 선두 범위(`0x81..=0xfe`)와 겹친다** ⇒ **완성된 쌍**의 후행도 보류돼 그 쌍의 선두가 홀로 남고, `read()` 마다 새로 만드는 `CharsetStreamDecoder` 가 그 선두를 **자기 상태로 삼킨 채 버려졌다**. 처방 = 전방 주사(선두면 2, 아니면 1 · **6줄**).
7
+
- ★**개악 대조쌍 3종 전건 red**: **M1** 종전 술어로 되돌림 → `left: "12345678\u{FFFD}"` · **M2** 보류 가지 통째 제거 → `left: "123456789"`(★**다른 실패 모양** — 이번엔 대체문자가 아니라 **소실**) · **M3** UTF-8 역주사 무력화 → ★**형제 테스트 2건이 red 이고 내 테스트는 green**(= 새 테스트가 EUC-KR 축의 독립 프로브이지 형제의 중복이 아니라는 증거). 복원 후 8/8 green.
8
+
- ★**고치지 «않은» 것**: 「`read()` 마다 디코더를 새로 만든다」는 구조는 그대로다 — `encoding_rs::Decoder` 를 자바 필드에 담을 수 없어 **보류 휴리스틱이 설계**다. ⇒ ★**다섯째 charset 을 더하면 이 함정이 되살아난다**(후속 카드).
9
+
- ★**기계 강제는 «안 만들었다»**: 「`## 다음` 이 `## 완료` 에 있는 id 를 가리키면 red」를 실제로 계산해 보니 지금 13개 중 **9개가 걸리는데 그중 대부분이 «해소됨·발권하지 마라»라고 «옳게» 적힌 주석**이었다 ⇒ 오탐이 지배적이라 검사기로 세울 수 없다. `AGENTS.md` 의 워크로그 부재 판정과 같은 결론(문서에만 두는 것이 가장 나쁘지만, 못 재는 것을 재는 척하는 것은 더 나쁘다).
10
+
- 검증: DoD 10명령 rc 0. 상세 = `docs/worklog/2026-09-23-stale-next-pointer-and-euc-kr-boundary.{md,json}`.
★**남긴 것 둘 더**: ⑵★**M5 층 어긋남**: ★**[2026-09-16 닫힘 · `rustjava-cp-tag-switch-passthrough-mutation-detectable`] 이제 `test_class_format` 이 «잡는다»**(픽스처를 «유일한 결함»으로 다시 지었다 — 종전엔 참조되는 Methodref 슬롯을 덮어 «다른 이유»로 통과했다) ⑶서드파티 생성기 corpus **미측정**(이 머신에 jar 0개).
1703
-
3. ★InputStreamReader 디코더 — 아래 사료 절 셋째 항목 그대로 **살아 있다**(별건).
1762
+
3.~~★InputStreamReader 디코더 — 아래 사료 절 셋째 항목 그대로 **살아 있다**(별건).~~
1763
+
★★**[2026-09-23 닫음] 「그대로 살아 있다」는 절반만 참이었다 — 재 보니 두 축 중 «하나»만 깨져 있었다.**
1764
+
사료가 요구한 「① 이후 상태를 다시 재라」를 실제로 했다: 완화책은 **들어왔다**(필드 `endOfInput` 실재 · UTF-8 역주사 실재 ·
1765
+
그 축은 `test_input_stream_reader_preserves_split_multibyte_and_buffered_eof` 로 **이미 잠겨 있었다**).
1766
+
★**깨져 있던 것은 EUC-KR 축**이고 ★**테스트가 0건이라 아무도 몰랐다**. 근인 = 「마지막 바이트 >= 0x81 이면 보류」인데
1767
+
EUC-KR 후행 바이트는 선두 범위와 **겹쳐서** 완성된 쌍도 보류돼 그 선두가 홀로 남고, read 마다 새로 만드는 디코더가 그것을 삼켰다.
1768
+
⇒ 전방 주사로 고치고 3형상을 잠갔다(이 회차). ★**「디코더를 read 마다 새로 만든다」는 구조 자체는 그대로다** —
1769
+
`encoding_rs::Decoder` 를 자바 필드에 담을 수 없어 «보류 휴리스틱»이 설계다. ★**그래서 다섯째 charset 을 더하면 이 함정이 되살아난다**(⓪ 아래 빚).
1704
1770
1705
1771
---- 이하 사료(2026-08-16 기재 · 크레이트 경로·태그 서술은 낡았다) ----
1706
1772
- ★`jvm_rust/src/interpreter.rs``Opcode::Invokedynamic(_) => todo!()` 는
@@ -1730,6 +1796,11 @@ green 전건 rc=0 · `cargo test --all` **261 passed / 0 failed / 1 ignored**(S3
0 commit comments