← 목록
기타 2026-07-09 5KB 읽기 5분

high2rpn.sh Q6·Q7 — 중첩호출 지원확장 + mktemp 비랜덤화 수정

개요

큐 Q6·Q7 지시: tools/high2rpn.shlibs/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)
(기대 10) — 게이트를 nest>=4로 완화한 사본에서 둘 다 컴파일 성공 + crownyc 실행 결과 기대값과 정확히 일치.
  • libs/XML.한선 전체 재변환: exit 0, 미인식 단어 0건, 미변환 태그 0건.
  • 기존 회귀 스위트(high2rpn-test.sh) 14케이스 전부 통과, 특히 c9(4단
중첩 출력값(에이(비(씨(1)))), depth=4)는 새 임계값에서도 여전히 정확히 차단됨을 확인(경계 자체는 안 무너짐).

적용한 수정: tools/high2rpn.sh의 nest 게이트를 nest>=3nest>=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단계 이상)할지는 이번 범위 밖 — 별도 실측 없이
손대지 말 것.