Skip to content

[rustjava-cp-tag-switch-passthrough-mutation-detectable] test(classfile): 태그 pass-through 개악을 end-to-end 로 「잡히게」 한다 - #49

Merged
Jun025 merged 3 commits into
mainfrom
feat/rustjava-cp-tag-passthrough
Sep 16, 2026
Merged

Jun025 merged 3 commits into
mainfrom
feat/rustjava-cp-tag-passthrough

Conversation

@Jun025

@Jun025 Jun025 commented Sep 16, 2026

Copy link
Copy Markdown
Owner

결함 — ★테스트가 자기가 지킨다고 말하는 것을 지키지 않았다

parse_tagged 의 pass-through 가지를 거부 → 통과로 개악:

_ => Ok((data, Self::Integer(0))),

⇒ test_unsupported_constant_pool_tag_raises_class_format_error 는 ★여전히 «ok».
스위트 전체에서 그 개악을 문 것은 constant_pool::tests::tags_outside_the_accepted_set_are_still_rejected 1건뿐 — ★end-to-end 층에는 없었다.

★근인 — 추측이 아니라 «판별 실험»으로 좁혔다

옛 테스트는 Hello.class 상수풀 1번의 태그 바이트를 덮는데, 그 슬롯은 ★코드가 invokespecial 로 참조하는 Methodref 다
⇒ 덮는 순간 파일이 여러 경로로 동시에 깨진다. 그리고 ClassFileError 가 모든 파싱 실패를
★**「Invalid class file」로 평탄화하므로(그 테스트 파일이 스스로 적어 둔 한계) 단언이
★
「태그가 미지라 거부」와 「클래스가 무너져 거부」를 구별하지 못한다.**

★★경쟁 가설(바이트 어긋남)은 «실험으로 기각»했다 — Methodref 와 같은 4바이트를 정확히 소비하는 개악으로도 여전히 green.

처방 — ★단언 조이기가 «아니다»

문면이 평탄해 조일 것이 없다. ⇒ ★입력이 그 가지에 «유일한 결함»으로 도달하게 했다.
test-data/cp/UnreferencedTag{13,14,19}.class(생성기 test-data/src/cp/make_cp_fixtures.py 신규):

  • ★참조되지 않는다 — 하류 소비자가 «대신» 거부할 수 없다
  • ★페이로드 0 · 상수풀 «맨 끝» — pass-through 가 0바이트를 소비해도 리더가 access_flags 에 정확히 서 있다

★세 성질이 «전부» 값한다: 뒤 둘이 없으면 개악이 «다르게 깨진» 파일을 만들어 또 green 이 된다.

전/후 — 같은 개악, 다른 결과

pass-through 개악 결과
전 거부 → 통과 테스트 ok(= 결함)
후 거부 → 통과 ★red — 문면 must be rejected: ""(★빈 출력 = 클래스가 «성공적으로 실행»됐다)
후 ★다른 가지(태그 16) 개악 6 테스트 red ⇒ 스위트는 여전히 switch 전체를 지킨다

cargo test --all 568 / 0 failed / 1 ignored — ★수 불변(테스트 1개 «치환») ⇒ ★수가 아니라 전/후 개악 쌍이 증거다.

★제품 코드 변경 «0»

개악은 실증용 임시이고 전부 되돌렸다 — git diff --cached 에 제품 크레이트 0건 ·
복원된 constant_pool.rs sha 393e0594d7eb647e 일치.

계약 2 — 흔들림 점검

옛 픽스처(BadTag*)를 쓰던 다른 테스트 0건(전수) · hello_class()·fixture() 헬퍼는 여전히 4·5회 쓰여 고아 0 ·
새 단언은 ★오탐이 늘지 않는다(픽스처가 결함 하나만 갖도록 지어져 흔들릴 표면이 좁다) · 픽스처 재생성 멱등.
DoD 7줄 전건 rc=0.

채택 제안

2026-09-16-ldc-tags-15-16-17#p1(worklog json adoptedProposals 기록)

…le): 태그 pass-through 개악을 end-to-end 로 «잡히게» 한다

「알 수 없는 상수풀 태그를 거부한다」는 테스트가 그 가지를 개악해도 green 이었다.
- 근인(판별 실험): 옛 픽스처가 Hello.class 의 «참조되는» Methodref 슬롯을 덮어
  파일이 여러 경로로 동시에 깨졌고, ClassFileError 가 문면을 평탄화해
  「태그가 미지라 거부」와 「클래스가 무너져 거부」를 구별하지 못했다.
  ★desync 가설은 기각했다 — 4바이트를 정확히 소비하는 개악도 green 이었다.
- 처방: 단언을 조이는 것이 아니라 입력이 그 가지에 «유일한 결함»으로 도달하게 했다.
  test-data/cp/UnreferencedTag{13,14,19}.class =
  참조되지 않고 · 페이로드 0 · 상수풀 맨 끝인 엔트리 하나만 미지 태그.
- 전/후: 같은 개악에 대해 전 ok → 후 red(문면 must be rejected: "" = 클래스가 실행됨).
  다른 가지(태그 16) 개악 → 6 테스트 red ⇒ 스위트는 여전히 switch 전체를 지킨다.
★제품 코드 변경 0 — 개악은 실증용 임시이고 전부 되돌렸다.
jun0 added 2 commits September 16, 2026 18:05
…/main — 형제 #47 착지분과의 충돌 2파일 합집합 해소

충돌은 REPORT.md·STATE.md 의 «맨 위 새 항목» 두 건뿐이고(측정 2026-09-16T09:03:56Z),
코드 파일 tests/test_class_format.rs 는 자동 병합됐다 — 양방향 hunk 동일성으로 확인.
해소는 전건 보존·합집합·시간순(eb8b4eb 16:20 > 3b3667d 14:45).
… 게이트③ 착지 기록 동봉 (PR #49 · --merge)
@Jun025
Jun025 merged commit 0fe0a5d into main Sep 16, 2026
10 checks passed
@Jun025
Jun025 deleted the feat/rustjava-cp-tag-passthrough branch September 16, 2026 09:16
Jun025 pushed a commit that referenced this pull request Sep 16, 2026
…gin/main — 형제 #47·#49 착지분과의 충돌 2파일 시간순 합집합 해소

충돌은 REPORT.md·STATE.md 의 «맨 위 새 항목»뿐이고(측정 2026-09-16T10:12:58Z),
main 쪽이 이미 두 항목(#49 16:20 · #47 14:45)을 갖고 있어 이 회차(15:46)를 그 «사이»에 끼웠다.
코드 파일 tests/test_class_format.rs 는 자동 병합 — 양측 델타 보존을 줄 단위로 확인했다.
Jun025 pushed a commit that referenced this pull request Sep 16, 2026
…/main — 형제 #48·#49 착지분과의 충돌 2파일 합집합 해소

충돌은 REPORT.md·STATE.md 의 «맨 위 새 항목»뿐이고(측정 2026-09-16T10:39:37Z),
이 회차(17:47:55)가 main 의 두 항목(#49 16:20 · #48 15:46)보다 뒤라 그 위에 얹었다.
★코드 파일은 양측 교집합이 0 이다 — tests/test_class_format.rs 를 피한 설계 판단이 값했다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant