[2026-09-18-nonliteral-exception-call-sites-p0] feat(scripts): 비리터럴 사각을 «세어서 찍는다» — 관문으로 올리지 않는다 - #79
Merged
Conversation
…각을 «세어서 찍는다» — 관문으로 올리지 않는다 채택 제안 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
채택 제안
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재측)jvm/tests/test_exception_construction.rs:19)★그 1자리는 «옳고», «비리터럴이어야만» 한다: 그 테스트는 못 싣는 이름을 부르는데, 리터럴로 쓰면 ★바로 이 검사기가 red 가 된다(작성 당시 실측).
⇒ ★관문을 0으로 걸었으면 제안된 날
main이 red 였고 그 대상은 정상 코드다.★제안이 자기
why에서 그 비용을 예고했다 — 「변수로 이름을 넘기는 정당한 리팩터가 red 가 되어 논박당한다」. ★약 4시간 뒤 현실이 됐다.★막으려던 해악도 작아졌다:
…-exception-throws-instead-of-unwrap착지 후 못 싣는 이름은 프로세스를 죽이지 않고NoClassDefFoundError를 낸다⇒ ★**「catch 가 안 걸린다」는 조용한 오동작**이지 «죽음»이 아니다(제안
userBenefit의 근거가 그만큼 약하다).대신 «값싼 절반»을 지었다
제안의 진짜 걱정은
tradeoff의 **「회차 사이에 바닥이 측정되지 않는다」**이고, 그것은 관문 없이 고쳐진다:★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**· 트리 클린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)
fmt0 ·clippy stable0 ·clippy +beta0 ·clippy wasm320 ·cargo test --all585 passed / 0 failed / 1 ignored ·check-worklog-json0(67파일) ·check-dod-ci-parity0(명령 8개·toolchain 2개) ·check-named-exception-classes-are-loadable0 ·check-merge-dropped-symbols0