high2rpn.sh Q6·Q7 — 중첩호출 지원확장 + mktemp 비랜덤화 수정
개요
큐 Q6·Q7 지시: tools/high2rpn.sh로 libs/XML.한선 변환 시 미인식 단어/미변환
태그를 격리재현하고 가능한 것을 수정(Q6), 1456행 부근 mktemp 비ASCII 템플릿을
ASCII로 수정(Q7). 둘 다 실측 재현→수정→재검증 완료.
Q7 — mktemp 비랜덤화 (1456행, generate_3layer)
재현(수정 전):
$ for i in 1 2 3; do mktemp "$TMPDIR/high2rpn.XXXXXX.한선"; done
/var/.../high2rpn.XXXXXX.한선 # 1회차: 리터럴 그대로 성공
mktemp: mkstemp failed ...: File exists # 2·3회차: 랜덤화 안 됨
중요 정정: 기존 1574행 주석은 원인을 "XXXXXX 뒤 비ASCII 접미사"로
적어뒀으나, 재조사 결과 원인은 더 넓다 — macOS(BSD) mktemp(1)은 트레일링
X가 템플릿의 맨 끝에 있을 때만 치환한다(man: "some number of Xs
appended to it"). ASCII 접미사(.toau, .txt)로도 동일하게 재현됨을
실측 확인. 즉 "ASCII로 바꾸면 해결"이 아니라 접미사 자체를 없애야 한다.
또한 1456행(generate_3layer)뿐 아니라 바로 아래 1460행의
toautmp="$(mktemp ".../high2rpn.XXXXXX.toau")"도 같은 버그를 갖고 있어
함께 수정(1454행 근처).
수정: 두 mktemp 모두 접미사 제거, XXXXXX가 템플릿 맨 끝에 오도록
high2rpn_src.XXXXXX / high2rpn_toau.XXXXXX로 변경.
검증: 수정 후 3회 연속 mktemp 호출 시 매번 다른 랜덤 파일명 생성 확인.
파일 전체에서 mktemp ... XXXXXX.<접미사> 패턴(위험) 잔존 0건, 전체 11개
mktemp 호출 모두 XXXXXX가 템플릿 끝.
Q6 — libs/XML.한선 중첩호출 미지원 (실제 원인 발견 + 확장)
재현(수정 전):
$ ./tools/high2rpn.sh libs/XML.한선
[경고] 중첩 호출식 2단계 이상 미지원: 맵넣어(노드, "자식수", 문자열변환(길이(자식들)))
[경고] 중첩 호출식 2단계 이상 미지원: 추가(결과, 맵꺼내(노드, "자식" + 문자열변환(i)))
[컴파일게이트] 실패(미인식 단어 7건, ..., 미변환 중첩호출 태그 2건)
exit=1
grep -c 미인식 단어: 7건 / 미변환 태그: 2건분석: 두 줄 모두 call_nesting_depth=3(2단계 중첩)으로, 기존 게이트가
nest>=3이면 무조건 차단(1단계 중첩까지만 지원)하도록 설계돼 있었음.
그런데 resolve_calls()는 "안쪽부터 하나씩 임시변수로 치환→재스캔"하는
반복 알고리즘으로, 깊이에 무관하게 동작하도록 설계돼 있다(안전한도 30회).
원래 전략문서(RPN_CONVERSION_STRATEGY.md 118행)의 예시
출력값(문자열변환(길이(arr)))도 정확히 이 깊이(3)라 애초 지원 대상으로
문서화돼 있었다 — 게이트가 설계 의도보다 보수적이었던 것으로 판단.
격리 실험(임시 사본으로 검증):
- 손으로 만든 대조 케이스 2개:
두배(세제곱(3))(기대 54),합(곱(2,3),4)
nest>=4로 완화한 사본에서 둘 다 컴파일 성공 +
crownyc 실행 결과 기대값과 정확히 일치.
libs/XML.한선전체 재변환: exit 0, 미인식 단어 0건, 미변환 태그 0건.- 기존 회귀 스위트(
high2rpn-test.sh) 14케이스 전부 통과, 특히 c9(4단
출력값(에이(비(씨(1)))), depth=4)는 새 임계값에서도 여전히
정확히 차단됨을 확인(경계 자체는 안 무너짐).적용한 수정: tools/high2rpn.sh의 nest 게이트를 nest>=3→nest>=4로
한 단계만 완화(1단계 중첩 지원→2단계 중첩 지원). 관련 주석(31~33행, 329행,
1310행) 및 경고 문구("2단계 이상"→"3단계 이상")를 실제 동작에 맞게 갱신.
tools/high2rpn-test.sh에 신규 회귀 케이스 c6b(2단계 중첩 성공, 기대값 54)
추가, c9 기대 문구를 갱신된 경고 텍스트로 동기화. 최종 스위트 15 PASS / 0
FAIL.
잔여 리스크(정직 보고): libs/ 전체 코퍼스는 1만+ 파일 규모라 이
세션 시간/자원 한도 내에서 전수 회귀를 완주하지 못했다(샘플 배치 실행이
시스템 부하로 반복 타임아웃). resolve_calls의 반복 알고리즘 자체는
깊이 불문 동일 로직이라 구조적으로 안전할 것으로 판단하나, 대규모
코퍼스 단위 실측 검증은 다음 세션 과제로 남긴다. 임계값은 딱 한 단계만
완화했고(4단 이상은 기존과 동일하게 차단), 4번째 항목 이상 깊은 중첩은
여전히 명시적 경고로 안전하게 차단된다.
관련 파일
/Users/ef/CrownyOS/crownyc/tools/high2rpn.sh(1454~1500행 mktemp, 1230~1252행 nest 게이트, 31~33행/329행 주석)/Users/ef/CrownyOS/crownyc/tools/high2rpn-test.sh(c6b 신규, c9 문구 갱신)/Users/ef/CrownyOS/crownyc/libs/XML.한선(대상 파일, 미수정 — 변환기만 수정)
다음 세션 인수인계
libs/전체(1만+ 파일) 대상 배치 회귀는 미완주 — 시스템 부하가 낮은
--batch 또는 표본 스크립트로 재시도 권장.
- nest 게이트를 더 완화(4단계 이상)할지는 이번 범위 밖 — 별도 실측 없이