Skip to content

[2026-09-18-nonliteral-exception-call-sites-p0] feat(scripts): 비리터럴 사각을 «세어서 찍는다» — 관문으로 올리지 않는다 - #79

Merged
Jun025 merged 4 commits into
mainfrom
feat/rustjava-nonliteral-blind-spot-reported
Sep 21, 2026
Merged

Jun025 merged 4 commits into
mainfrom
feat/rustjava-nonliteral-blind-spot-reported

Conversation

@Jun025

@Jun025 Jun025 commented Sep 18, 2026

Copy link
Copy Markdown
Owner

채택 제안 2026-09-18-nonliteral-exception-call-sites#p0 — "Decide whether nonliteral exception() call sites should be a check, now that the baseline is 0."

결정

관문으로 올리지 않는다. 대신 검사기가 사각을 세어서 찍고 ★절대 실패시키지 않는다.
★결정과 근거를 검사기 docstring 에 못박았다 — 다음 회차가 관문을 다시 제안하기 «전»에 읽는 자리다.

★제안의 전제 «둘 다» 하루 만에 소멸했다(origin/main @ e9910a7a 재측)

제안 원문 지금
"now that the baseline is 0" ★거짓 — 1이다 (jvm/tests/test_exception_construction.rs:19)
"instead of crashing the whole runtime" ★거짓 — 더는 죽지 않는다

★그 1자리는 «옳고», «비리터럴이어야만» 한다: 그 테스트는 못 싣는 이름을 부르는데, 리터럴로 쓰면 ★바로 이 검사기가 red 가 된다(작성 당시 실측).
⇒ ★관문을 0으로 걸었으면 제안된 날 main 이 red 였고 그 대상은 정상 코드다.
★제안이 자기 why 에서 그 비용을 예고했다 — 「변수로 이름을 넘기는 정당한 리팩터가 red 가 되어 논박당한다」. ★약 4시간 뒤 현실이 됐다.

★막으려던 해악도 작아졌다: …-exception-throws-instead-of-unwrap 착지 후 못 싣는 이름은 프로세스를 죽이지 않고 NoClassDefFoundError 를 낸다
⇒ ★**「catch 가 안 걸린다」는 조용한 오동작**이지 «죽음»이 아니다(제안 userBenefit 의 근거가 그만큼 약하다).

대신 «값싼 절반»을 지었다

제안의 진짜 걱정은 tradeoff 의 **「회차 사이에 바닥이 측정되지 않는다」**이고, 그것은 관문 없이 고쳐진다:

Blind spot: 1 call site(s) build the class name at run time, so this check
does not see them. Not an error -- an unloadable name there raises NoClassDefFoundError
rather than the intended exception, which is a wrong catch, not a crash:
  ? jvm/tests/test_exception_construction.rs:19
✓ 43 named exception class(es) across 846 call site(s); all 268 loadable

★1파일 · +90/−6 · 새 DoD 명령 0 · 새 CI 잡 0 · 종료코드 의미 불변(0/1/2 그대로).

축 — 양방향 · ★제품 코드에

프로브 결과
jvm/src/jvm.rs 에 런타임 조립 self.exception(name, …) 주입 Blind spot: **2** · ★jvm/src/jvm.rs:1390 을 이름으로 지목
원복 Blind spot: **1** · 트리 클린
술어에서 «다른 함수 8종 분리» 제거 Blind spot: **42**(헬퍼 호출 33 + 헬퍼 정의 8 + 진짜 1)

★셋째가 그 수가 «의미»를 갖는다는 증거다 — exception( 은 테스트 트리의 헬퍼 8종의 부분문자열이고, 안 가르면 42배로 틀린다.
★축 조항에 대한 고지: Acceptance 는 「되돌리면 red」를 요구하는데 ★이 변경은 «의도적으로» red 를 낼 수 없다(그것이 결정이다).
⇒ 축은 수가 움직이고 새 자리를 이름으로 대는 것 + rc 가 양방향 0이며, 그것이 「보고하되 막지 않는다」의 뜻이다.

★대가(숨기지 않는다)

⒜찍힌 수는 무시할 수 있다 — 관문은 강제하고 한 줄은 스크롤로 지나친다(★반대편의 최강 논거다)
⒝수는 술어만큼만 정확하다 — 위 42 가 한 줄 실수의 모습이고, 이 회차 프로브 말고는 잠그는 것이 없다
⒞제품/테스트를 구별하지 않는다 — 오늘 전건이 테스트인데 표시가 없다(후속 카드로 냈다).

★내가 만든 회귀 둘을 «재서» 걷어냈다(눈으로 잡은 것이 아니다)

⑴.rs 전수를 두 번 걷기 → 3.34.3s → 10.013.3s ⇒ 단일 패스로 병합
⑵파일마다 개행 인덱스를 파이썬 루프로 만들기(남은 ~2배의 «진짜» 원인) ⇒ text.count 로 되돌림(전 트리 매치 ~850 ⇒ 매치당 세기가 문자당 인덱싱보다 싸다)
⑶앵커 [A-Za-z0-9_]*exception\( 가 단어문자 위치마다 시도 ⇒ 리터럴 앵커 + 앞 글자 검사로 교체
⇒ ★최종 비용 유의차 없음: 전 1.33/3.20/1.55/1.58s ↔ 후 1.73/1.88/1.44/1.54s(구간 겹침).

되돌릴 조건

⑴런타임 조립 이름이 제품 코드에 나타나거나 ⑵아무도 모르게 수가 는다 — ★그 한 줄이 정확히 그것을 막는다.

DoD (9명령 전건 rc=0)

fmt 0 · clippy stable 0 · clippy +beta 0 · clippy wasm32 0 · cargo test --all 585 passed / 0 failed / 1 ignored ·
check-worklog-json 0(67파일) · check-dod-ci-parity 0(명령 8개·toolchain 2개) · check-named-exception-classes-are-loadable 0 · check-merge-dropped-symbols 0

jun0 and others added 4 commits September 19, 2026 06:17
…각을 «세어서 찍는다» — 관문으로 올리지 않는다

채택 제안 2026-09-18-nonliteral-exception-call-sites#p0 — 「baseline 이 0 이니 관문으로 올릴까」.
★전제 «둘 다» 하루 만에 소멸했다(origin/main @ e9910a7 재측):
  ⑴「baseline is 0」 → 실제 1. jvm/tests/test_exception_construction.rs:19 이고,
     그 자리는 «비리터럴이어야만» 한다 — 리터럴로 쓰면 바로 이 검사기가 red 다.
     ⇒ 관문을 0으로 걸었으면 제안된 날 main 이 red 였고 대상은 정상 코드다.
     ★제안이 자기 why 에 그 비용을 예고했고 약 4시간 뒤 현실이 됐다.
  ⑵「crashing the whole runtime 대신」 → 더는 죽지 않는다(…-exception-throws-instead-of-unwrap 착지).
     못 싣는 이름은 NoClassDefFoundError 를 낸다 ⇒ 해악이 «죽음»에서 «틀린 catch»로 내려갔다.

⇒ 관문 대신 제안의 진짜 걱정(tradeoff: 「회차 사이에 바닥이 측정되지 않는다」)만 값싸게 고친다:
매 실행에 사각을 세어 한 줄로 찍고 ★절대 실패시키지 않는다. 종료코드 의미 불변(0/1/2).
1파일 +90/−6 · 새 DoD 명령 0 · 새 CI 잡 0.

축(제품 코드 · 양방향): jvm/src/jvm.rs 에 런타임 조립 호출 주입 → 1→2 이고 파일:줄을 지목 ·
원복 → 1 · rc 양쪽 0(그것이 «관문이 아니다»의 뜻이다).
술어 민감도: 8종 분리를 지우면 42(헬퍼 호출 33 + 정의 8 + 진짜 1) ⇒ 느슨한 앵커의 산물이 아니다.

★내가 만든 회귀 둘을 재서 걷어냈다: 두 번 걷기(3.3~4.3s → 10.0~13.3s) · 개행 인덱스(~2배 잔존).
최종 비용 유의차 없음(전 1.33/3.20/1.55/1.58s ↔ 후 1.73/1.88/1.44/1.54s · 구간 겹침).
결정은 검사기 docstring 에 못박았다 — 다음 회차가 관문을 다시 제안하기 전에 읽는 자리다.
…필터를 «보고 축»에만 둔다 — 게이트 입력집합을 되돌린다

게이트② 반려 승계(필수 1건). ★검수자가 옳다: 두 스캔을 scan_call_sites() 하나로 합치면서
보고 축에 필요한 IDENT_CHARS 접두 필터가 ★게이트 축(named)에도 같이 걸렸다.
종전 named_classes() 는 NAMED.finditer 로 «무필터»였다.

⇒ raise_exception("java/lang/X", …) 처럼 앞 글자가 식별자인 호출이 ★게이트에서도 보고에서도
빠진다(continue 가 두 분기보다 앞) — 막지도 찍지도 않는 «무증상»이다.

검수자 주입을 그대로 재현했다(jvm/src/runtime/java_lang_class.rs 에 1줄):
  origin/main 판본 : rc=1  ✗ java/lang/TotallyUnloadableProbe        ← 잡는다
  이 PR 판본(수정 전): rc=0  ✓ 43 … all 268 loadable                  ← 못 잡는다
  수정 후          : rc=1  ✗ java/lang/TotallyUnloadableProbe …:29   ← 되돌아왔다
  주입 원복 후      : rc=0 · 게이트 줄이 origin/main 과 «바이트 동일»(43 / 846 / 268)

처방은 검수자가 준 형태 그대로 — 필터를 «보고 축»으로 옮기고 게이트 축은 NAMED 무필터를 유지한다.
오늘 트리에서 그 필터는 게이트 축에 아무것도 벌지 않는다: 헬퍼 8종은 첫 인자가 jvm 이라
NAMED 의 \(\s*" 가 이미 막는다. blind spot 축 불변(필터 있으면 1 · 빼면 42).

부수: worklog 「What this costs」에 축 한 줄 추가 — 「종료코드 의미 불변」은 0/1/2 의 «뜻»에 대해
참이었고, 바뀐 것은 ★«rc 를 만드는 입력집합»이며 그것을 말하는 줄이 어디에도 없었다.

★rc 불변 계약 준수: 사각 때문에 rc 가 1 이 되는 일은 없다(관문으로 올리지 않았다).
★검수자 중간항 2종(제품 한정 관문 · 래칫)은 범위 밖이라 구현하지 않았다.
… — 원장 2파일 합집합(충돌 PR 은 pull_request CI 가 돌지 않는다)

형제 착지(#76 e9910a7 · #77 ad9eb1a)로 생긴 원장 재충돌. 코드 충돌 0.
★당긴 이유: 충돌 상태에서는 pull_request 워크플로가 «돌지 못해» 이 head 의 검사가 12건 → 1건으로
줄었다(coverage 만). ★그중 named_exception_classes 는 «내가 고친 바로 그 스크립트»를 돌리는 잡이라,
그대로 두면 CI 가 이 회차의 변경을 한 번도 검증하지 못한 채 검수로 간다.
보존: 소실 0/0 · 마커 0 · 해소면 밖 변경 0(검사기 바이트 동일).
… — 승인된 원장 2파일 합집합

게이트③ 2-c 재충돌(형제 착지 19커밋). 코드 충돌 0 — 충돌은 REPORT.md·STATE.md 둘뿐이고
검수 회신 머리 `해소승인:` 줄이 그 둘을 이름으로 미리 승인했다.
해소 = 양측 엔트리 전건 보존 합집합 · 날짜 내림차순 배치 · 소실 ours=0 theirs=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Jun025
Jun025 merged commit f65e061 into main Sep 21, 2026
13 checks passed
@Jun025
Jun025 deleted the feat/rustjava-nonliteral-blind-spot-reported branch September 21, 2026 04:06
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