crownyc VM 입력() opcode 근본 수정 + 회원관리 라이브러리
개요
crownyc VM의 입력() 프리미티브가 scanf("%ld")로 숫자만 받도록 구현되어 있어, 모든 대화형 한선씨 프로그램이 동작 불가였음. 문자열 한 줄 입력 + 다중 호출 안전 구현으로 근본 수정. 회원관리 라이브러리 및 터미널 CLI도 병행 작성.
무엇을 했는지
1. VM 입력() opcode 근본 수정 (핵심)
이전 (crownyc.c:4561-4563):
ccase 325: /* INPUT — 숫자 입력 */
{ long v; if (scanf("%ld", &v) == 1) push(int_to_cube(v)); }
break;
이후 (crownyc.c:4561-4571):
ccase 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/맵 키 음수에 대한 사전 거부 없음