crownyc VM의 입력() 프리미티브가 scanf("%ld")로 숫자만 받도록 구현되어 있어, 모든 대화형 한선씨 프로그램이 동작 불가였음. 문자열 한 줄 입력 + 다중 호출 안전 구현으로 근본 수정. 회원관리 라이브러리 및 터미널 CLI도 병행 작성.
이전 (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회 연속 호출 모두 정상 (첫줄/둘째줄/셋째줄)파일: libs/회원관리.한선
기능:
["성공", "참", ...] (배열)맵생성() → 맵넣어(...) 로 통일파일: 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 회귀 테스트[3진VM] 메모리 범위 벗어남: -240 두 차례 발생 (인증 시도 중)
원인 추정: 등록 시 _회원데이터저장() 과 재로드 간 셀ID 직렬화/역직렬화 불일치. 숫자변환(셀ID문자) 결과가 음수로 튀면서 셀읽(_셀넷, 음수ID, 슬롯) 이 음수 메모리 주소 접근
VM 복구 상태: crownyc.c:1485에서 경고만 내고 0큐브 반환 — 크래시 없음[20103, 0, 20104, 0, ...] str_handle 원문 노출
해결: 터미널의 감사로그 출력에서 핸들 → 실제 문자열 변환 + 시간/회원/행동/상세 필드로 테이블 포맷팅셀읽, 맵꺼내, 숫자변환 등에서 잘못된 타입/범위 입력에 대한 사전 검증
현재: 메모리 경계만 체크. 셀 ID/맵 키 음수에 대한 사전 거부 없음