← 목록
기타 2026-05-27 4KB 읽기 3분

crownyc 셀DB.한선 다형성 패치 — PC 291 OOB 무한루프 근본 해결

개요

Enterprise 한선씨 서버가 데모데이터() 초기화 시 PC 291에서 "배열 범위 초과" 무한 루프로 무응답되던 문제를 셀DB.한선 다형성 패치 하나로 근본 해결. crownyc VM에는 oob_count 100회 안전장치를 영구화해서 동일류 무한 루프 재발을 차단.

무엇을 했는지

1. crownyc VM 무한루프 차단 (이전 세션 마무리)

  • crownyc.c:5267-5274 — INDEX opcode(407)의 배열범위초과 처리에 정적 카운터 oob_count 추가
  • 100회 누적 시 exit(1) — 무한 로그 폭주(이전: 9천만 줄) 방지
  • 검증: 1000회 OOB 시도 → 100회에서 정확히 차단, 0초

2. 셀DB.한선 다형성 패치 (근본 원인 수정)

  • 파일: /Users/ef/CrownyOS/crownyc/libs/셀DB.한선
  • 행수(테이블): 첫 원소 타입이 "array"(맵 객체)면 단순 길이(테이블) 반환
  • 집계(테이블, 종류, 컬럼): 첫 원소가 "array"면 행맵 배열 전용 경로(맵꺼내로 직접 키 접근). 평면 테이블 경로는 그대로 유지
  • 호환성: 호출자 60+ 곳 무수정 (영업/재무/공급망/인사/프로젝트/생산/포네/워크플로우/조직/서버 등)

3. PC 291 원인 추적 과정 (재발 방지용 기록)

  • _컬럼찾기(테이블, 컬럼)이 행맵 배열을 받으면 원소(테이블, 0)(=맵)을 N으로 오인 → 큰 정수 캐스팅
  • 반복문 i 부터 0 까지 N → 길이 1 배열에 인덱스 1, 2, 3... 누적 접근 → OOB 무한루프
  • 발화 패턴: 집계(조회(_X, "k", "==", v), "SUM", "c") — 영업.한선 line 112가 데모 첫 트리거
  • 추적은 데모데이터() 함수 본문에 라인별 출력값 마커 삽입 → 정확히 파이프라인진행() 진입 직후 PC 291 확정

격리 검증 결과

격리 환경 /tmp/ent-test + 포트 19701에서 운영 코드(디버그 마커 0개) 구동:

  • 서버 생존, err.log 0 (런타임 에러 없음)
  • /health 200, /api/status 200, /api/finance 200, /api/scm 200, /api/hrm 200, /api/crm 200, /api/dashboard 200 (1337 bytes, 12개 모듈 전체)
  • 운영 데이터 디렉토리 /Users/ef/crowny-enterprise/data/ 안 건드림 (4월 10일자 보존)

관련 파일

  • /Users/ef/CrownyOS/crownyc/crownyc.c — VM oob_count 차단 (라인 5267-5274)
  • /Users/ef/CrownyOS/crownyc/libs/셀DB.한선 — 행수/집계 다형성 (라인 73-86, 256-)
  • /Users/ef/CrownyOS/crownyc/libs/셀DB.한선.bak.* — 패치 전 원본 백업
  • /Users/ef/crowny-enterprise/서버.한선 — 변경 없음, 다형성 효과만 받음
  • /Users/ef/crowny-enterprise/modules/{영업,인사,공급망,재무,프로젝트,생산,포네,워크플로우}.한선 — 60+ 집계(조회()) 호출처가 추가 수정 없이 동작

잔여 이슈

  • ABTI 측 server.js 패턴 점검 (별도 작업 창에서 동일류 패턴 있는지)
  • 셀DB.한선 단위 테스트 추가 (행맵 배열 vs 평면 테이블 회귀 방지)
  • 운영 9701 포트 한선씨 단독 가동 전환 (현재 node proxy → 한선씨 서버 직접 가동 가능)

학습 포인트 (knowledge 등록 대상)

  1. 셀DB 행맵 배열은 타입(원소(.,0)) == "array"로 평면 테이블과 구분 가능
  2. 한선씨 맵 객체는 vector 컨텍스트에서 "array" 타입으로 노출됨 (정수가 아님)
  3. _컬럼찾기() 같은 평면 테이블 전용 함수에 행맵 배열을 넘기면 N이 맵→큰정수로 OOB 무한루프
  4. crownyc VM은 OOB 즉시중단 안 함(로그 후 계속) → oob_count로 누적 한도 필요