C++ 바이너리 파일

바이너리 입출력 위험 기준

바이너리 파일은 빠르고 작지만 C++ 객체를 그대로 저장하면 padding, endian, 버전 변경에 취약하다. 레코드 형식, 크기, 바이트 순서, 실패 상태를 명시해야 오래 버틴다.

01

형식 정의

파일 헤더, 버전, 레코드 크기, 필드 순서를 코드와 문서에 고정한다.

매직 값 사용
02

쓰기

POD라도 reinterpret_cast 저장 전 padding과 endian을 확인한다.

그대로 저장 위험
03

읽기

read 후 gcount와 상태를 확인해 짧은 읽기와 손상 파일을 잡는다.

부분 읽기
04

호환

새 필드 추가 시 이전 버전 파일을 어떻게 읽을지 분기한다.

마이그레이션
raw struct
빠르지만 취약 컴파일러, 플랫폼, 옵션에 따라 padding과 alignment가 달라질 수 있다.
외부 형식에는 부적합
fixed width
크기 명시 int 대신 uint32_t처럼 크기가 정해진 타입을 사용한다.
범위도 명확
byte order
네트워크/파일 순서 고정 다른 아키텍처에서 읽을 수 있어야 하면 endian 변환을 명시한다.
little만 가정 금지
checksum
손상 탐지 중요 파일은 길이와 체크섬으로 잘린 파일을 구분한다.
복구 판단

ios::binary · 버전 · 보안 점검

ios::binary Windows 줄바꿈 변환을 피해야 하는 파일은 binary 모드인지 확인한다.
버전 파일 형식 변경 후 기존 파일을 읽는 테스트가 있는지 본다.
보안 파일 안의 길이 값을 그대로 신뢰해 과도한 할당을 하지 않는지 확인한다.