crownyc VM 입력() opcode 근본 수정 + 회원관리 라이브러리
2026-04-15  ·  2026-04-15-crownyc-input-vm-patch.md

crownyc VM 입력() opcode 근본 수정 + 회원관리 라이브러리

개요

crownyc VM의 `입력()` 프리미티브가 `scanf("%ld")`로 **숫자만** 받도록 구현되어 있어, 모든 대화형 한선씨 프로그램이 동작 불가였음. 문자열 한 줄 입력 + 다중 호출 안전 구현으로 근본 수정. 회원관리 라이브러리 및 터미널 CLI도 병행 작성.

무엇을 했는지

1. VM 입력() opcode 근본 수정 (핵심)

**이전** (`crownyc.c:4561-4563`):

case 325: /* INPUT — 숫자 입력 */
    { long v; if (scanf("%ld", &v) == 1) push(int_to_cube(v)); }
    break;
**이후** (`crownyc.c:4561-4571`):

case 325: /* INPUT — 한 줄 문자열 입력 (EOF/실패 시 빈 문자열) */
    { char buf[4096];
      if (fgets(buf, sizeof(buf), stdin)) {
          int len = (int)strlen(buf);
          while (len > 0 && (buf[len-1]=='\n' || buf[len-1]=='\r')) buf[--len] = 0;
          push(int_to_cube(str_new(buf, len)));
      } else push(int_to_cube(str_new("", 0)));
    }
    break;
**영향 범위**: 모든 대화형 한선씨 프로그램 해금 (REPL/CLI/인증/서버 등 24개 표준 라이브러리 전체) **검증**:
  • `/tmp/입력다중.한선` — 3회 연속 호출 모두 정상 (첫줄/둘째줄/셋째줄)
  • 회원터미널 메뉴 네비게이션 정상 동작

2. 회원관리 라이브러리

**파일**: `libs/회원관리.한선` 기능:
  • 회원 CRUD (등록/조회/인증)
  • 서비스 계정 관리 (다중 서비스 자격증명)
  • 권한 관리 (슈퍼/관리/쓰기/읽기/없음)
  • 지갑 (입금/출금/이체)
  • 뱅크 계좌 (등급별)
  • 스탁옵션 (4상 상태)
  • DEX (거래 기록)
  • 감사 로그
**반환값 맵 통일** (회원등록):
  • 이전: `["성공", "참", ...]` (배열)
  • 이후: `맵생성() → 맵넣어(...)` 로 통일

3. 회원터미널 CLI

**파일**: `libs/회원터미널.한선` 11개 메뉴 대화형 CLI. 모든 `입력()` 호출을 `문자열변환(입력())` 로 래핑 (24곳).

관련 파일 경로

  • `/Users/ef/CrownyOS/crownyc/crownyc.c:4561` — VM 입력 opcode
  • `/Users/ef/CrownyOS/crownyc/libs/회원관리.한선` — 회원관리 라이브러리
  • `/Users/ef/CrownyOS/crownyc/libs/회원터미널.한선` — 대화형 CLI
  • `/tmp/입력다중.한선` — VM 회귀 테스트

잔여 이슈 (다음 세션 태스크)

태스크 1: 회원관리.한선 반환값 전면 맵 통일

**규모**: 큼 (20+ 함수) **대상**: 서비스계정등록/로그인/지갑이체/뱅크관리/스탁배정/DEX활성화 등 여전히 배열 반환 중 **영향**: 터미널이 맵꺼내로 접근하므로 타입 불일치 시 VM 메모리 범위 에러 유발

태스크 2: 회원등록 → 인증 파이프라인 디버깅

**증상**: `[3진VM] 메모리 범위 벗어남: -240` 두 차례 발생 (인증 시도 중) **원인 추정**: 등록 시 `_회원데이터저장()` 과 재로드 간 셀ID 직렬화/역직렬화 불일치. `숫자변환(셀ID문자)` 결과가 음수로 튀면서 `셀읽(_셀넷, 음수ID, 슬롯)` 이 음수 메모리 주소 접근 **VM 복구 상태**: crownyc.c:1485에서 경고만 내고 0큐브 반환 — 크래시 없음

태스크 3: 감사로그 출력 포맷

**증상**: 감사로그 조회 시 `[20103, 0, 20104, 0, ...]` str_handle 원문 노출 **해결**: 터미널의 감사로그 출력에서 핸들 → 실제 문자열 변환 + 시간/회원/행동/상세 필드로 테이블 포맷팅

태스크 4: VM 타입 미스매치 가드 강화

**대상**: `셀읽`, `맵꺼내`, `숫자변환` 등에서 잘못된 타입/범위 입력에 대한 사전 검증 **현재**: 메모리 경계만 체크. 셀 ID/맵 키 음수에 대한 사전 거부 없음