← 목록
컴파일러 2026-07-30 3KB 읽기 3분

T122 — hanseonc_std GTE(opcode173) 항상거짓 근본수정

개요

T50에서 실측된 "크거나같다(GTE, opcode173) 항상 거짓 반환" 결함을 재현·근본원인 파악·수정.

근본원인

opcode 173(GTE)의 VM 구현(crownyc.c, crownyc_vm_core.c) 자체는 정상이었다(고수준 경로 hanseonc_high로 a >= b 테스트 시 정상 TRUE 반환 확인).

문제는 hanseonc_std.asm(RPN 어셈블러)의 키워드 인식표에 있었다:

  • 이상(GTE) / 이하(LTE) 한글 키워드만 등록돼 있었고
  • 정본 별칭표(hanseonc_rpn.c/hanseonc_high.c{"크거나같다",173}, {"GTE",173} 등)에
있는 "크거나같다"/"작거나같다"/영문 "GTE"/"LTE"는 hanseonc_std 어셈블러에 아예 미등록이었다.
  • 등록 안 된 토큰은 어떤 emit_* 분기에도 매칭되지 않아 폴백 경로(식별자/라벨 취급)로 빠지며
결과적으로 항상 0/거짓 취급되는 것으로 관찰됨.
  • 즉 opcode 173은 멀쩡했고, RPN 파서의 키워드 커버리지 누락이 진짜 결함.

수정 내용

/Users/ef/CrownyOS/crownyc/hanseonc_std.asm에 누락된 4개 키워드 분기 추가:
  • 크거나같다 (15바이트 UTF-8) → emit_173
  • 작거나같다 (15바이트 UTF-8) → emit_174
  • GTE (ASCII 3바이트) → emit_173
  • LTE (ASCII 3바이트) → emit_174
기존 이상/이하 분기는 그대로 유지(하위호환).

검증

  1. ./crownyc compile hanseonc_std.asm /tmp/hanseonc_std_new.toau 로 재어셈블
  2. 신규 케이스 전수 PASS: 크거나같다(5>=3=1, 3>=3=1, 2>=3=-1), GTE, 작거나같다, 기존 이상 유지
  3. 회귀: OLD toau vs NEW toau로 대표 RPN 9종(사칙연산·크다/작다/같다/다르다/또는/그리고) 동일 입력 실행,
출력 100% 동일 확인 후 라이브 hanseonc_std.toau 교체
  1. 백업: /tmp/hanseonc_std.toau.beforeT122 (교체 전 원본 보관)

관련 파일

  • /Users/ef/CrownyOS/crownyc/hanseonc_std.asm (소스 수정)
  • /Users/ef/CrownyOS/crownyc/hanseonc_std.toau (라이브 바이너리 교체)
  • /tmp/hanseonc_std.toau.beforeT122 (교체 전 백업)

잔여 이슈

  • 다른 비교연산자(EQ/NEQ/GT/LT/AND/OR)는 이번 점검에서 영문/별칭 누락 없이 정상 확인됐으나,
hanseonc_std.asm 전체 키워드표와 hanseonc_rpn.c/hanseonc_high.c 별칭표의 완전 자동대조 스크립트는 아직 없음 — 향후 유사 결함 재발 방지용으로 만들 것을 권장.
  • crownyc_vm_core.c(별도 VM 사본)와 crownyc.c(라이브 VM)에 GTE/LTE 구현이 이중으로 존재 —
향후 리팩토링 시 단일 소스화 검토.