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

VM 치명 버그 4군 패치 (ISA729 울트라감사 후속)

개요

2026-07-09 ISA729 924-opcode 울트라 감사(docs/isa729-감사-20260709/최종판정.md)에서 소스라인 단위로 확정된 치명 VM 버그 4군을 crownyc.c/hanseonc_high.c에 패치했다. 전부 재현(전) → 최소 diff 패치 → 임시빌드 검증 → mv 교체 → pkg 동기화 프로토콜을 따랐다.

무엇을 했는지

  1. op143 ZIPWITH: 콜백 실행 자리에서 exec_opcode(1)(=HALT)을 오호출해 함수가
전혀 실행되지 않고 VM이 조기종료되던 버그. rpush+pc점프 후 RET까지 자체 페치-실행 루프를 도는 정규 CALL 경로로 교체(스텝상한+pc가드로 폭주 방지).
  1. op469 TPOOL: break; 누락으로 case 470(HDL_FORCE)에 폴스루 → 반환값이
항상 1로 덮어써지고 스트레이 메모리쓰기 발생. break; 추가. 인접 케이스 전수 폴스루 스캔(자동화 스크립트) 완료, 추가 결함 없음 확인.
  1. PC탈취군(521/533/540/544/557 + JMP/SPAWN/LAZY_INIT/MONAD/FUNCTOR/APPLICATIVE 등
11개+): VM 메인루프가 pc>=0을 검사하지 않아 음수 점프 시 크래시. 개별 opcode가 아니라 execute()의 두 실행루프(FAST/LEGACY) 공통 커널 1곳을 (unsigned)pc < (unsigned)prog_len로 교체해 근본 차단(핫루프 분기비용 무추가).
  1. op931 QT_SYMP 비결정 크래시: 원 감사는 "힙 초기화 누락"으로 추정했으나,
본 세션이 --trace로 재추적한 결과 진짜 원인은 다른 곳이었음을 확정 — hanseonc_high.c__내장__ 원시 이스케이프가 opcode≥729(ISA729 확장, 217개)를 opcode_to_cube()에 직접 통과시키는데 이 함수의 섹터 필드가 2트릿(0~8)뿐이라 오버플로 → op931이 실제로는 op445(SPAWN)로 디코딩되어 실행됨(결정론적 앨리어싱). SPAWN이 PC탈취군과 동일한 무검증 pc대입 버그를 가져 크래시가 재현된 것. QT_SYMP 자신의 로직(가드+mem_at() 안전처리)은 이미 안전함을 정상입력 20회 반복(전부 동일결과)으로 확인. 패치는 (a) 위 3)의 메인루프 가드 + (b) __내장__도 언어 키워드 경로와 동일하게 opcode>=729DATA(op)+MACRO(727) 안전 디스패치로 우회하도록 수정 — 두 방어선으로 원인을 원천 차단.

검증 결과 요약

  • 4군 각각 전/후 재현: 상세 로그는 /Users/ef/CrownyOS/docs/isa729-감사-20260709/패치검증_VM.md.
  • op143: 함수 미실행(조기종료) → 정확한 콜백 실행(dest=[13,24,35]) 확인.
  • op469: outlen 항상 1(버그) → outlen=3(정상).
  • PC탈취군: JMP/SPAWN 음수점프 crash 90~100% → 0/10, 진단메시지로 안전정지.
  • op931: 재현 crash 8/30(26.7%) → 완전패치 후 0/30, 정상입력 20/20 일관.
  • 200케이스 무작위 퍼징 회귀(같은 방법론 재사용): crash 10→6(5.0%→3.0%),
  • hang 4→2(2.0%→1.0%). 사라진 크래시가 정확히 4군 대상 opcode(JMP/SPAWN/ LAZY_INIT/931·938 ext앨리어싱)와 일치. 남은 6crash+2hang은 재구성한 패치전 바이너리로도 동일 재현 — 회귀 아닌 범위 밖 기존결함(op7 STORE footgun·아리티 오배선 등, 최종판정.md "다음 단계 2·3"에 이미 별도 과제).
    • 기준선: --version/헬로월드/RPN(3+7=10) 정상, pkg make test 11/13
    PASS(패치 전과 동일 2건 무관 사전실패 — 16_셀3축,18_셀DB라이브러리).
    • 배포: 정본 crownyc/hanseonc_high mv 교체, pkg/crownyc.c·pkg/hanseonc_high.c
    cp 동기화 + pkg 바이너리 mv 재빌드 + pkg make test 재확인(동일).

    관련 파일

    • /Users/ef/CrownyOS/crownyc/crownyc.c — case 143(ZIPWITH), case 469(TPOOL),
    execute() 메인루프 x2 (FAST/LEGACY) 패치.
    • /Users/ef/CrownyOS/crownyc/hanseonc_high.c__내장__ 핸들러 opcode≥729
    안전 디스패치 패치.
    • /Users/ef/CrownyOS/crownyc/pkg/crownyc.c, pkg/hanseonc_high.c — 동기화본.
    • /Users/ef/CrownyOS/docs/isa729-감사-20260709/패치검증_VM.md — 전/후 재현 로그 전문.
    • /Users/ef/CrownyOS/docs/isa729-감사-20260709/최종판정.md,적대_규칙.md,적대_안정성.md — 원 감사 근거.
    • /Users/ef/CrownyOS/crownyc/vm패치_20260709.한선 — 한선씨 동반 문서(패치 로직 요약, 크라우니코드 규칙 준수).

    잔여 이슈 (이번 패치 범위 밖, 향후 과제)

    • 표준라이브러리 설정() 오용(op415 ARRAY_SET 오배선) → tests/run_all.sh hang
    — 다른 세션이 수정 중(사용자 컨텍스트 확인됨), 본 세션은 손대지 않음.
    • op7 STORE 인자순서 footgun, 아리티 오배선 10종+(507/516/548/549/624/632 등),
    주석-구현 불일치(FLOOR_DIV/SLERP/ADDOV 등), noop 85건 전반 — 최종판정.md "다음 단계 2·3"에 이미 별도 과제로 명시, 이번 4군 패치와 무관.
    • 이번 세션에서 남은 6crash(239/426/515/133/653/기타)+2hang(35/136)은
    패치 전에도 존재하던 기존 결함으로 재확인됨(회귀 아님).