헤더 검증
파일이 기대한 포맷인지 magic과 version으로 먼저 확인한다.
바이너리 파일에는 구분자와 사람이 읽을 단서가 없다. magic, version, length, endian 같은 계약을 앞에 두어야 안전하게 읽고 거절할 수 있다.
파일이 기대한 포맷인지 magic과 version으로 먼저 확인한다.
파일이 말하는 payload 크기를 그대로 믿지 말고 실제 파일 크기와 상한을 비교한다.
int, long 대신 uint32_t처럼 폭이 정해진 타입으로 포맷을 만든다.
std::uint32_t magic = 0;
in.read(reinterpret_cast<char*>(&magic), sizeof(magic));
if (!in || magic != ExpectedMagic) throw FormatError{
overflow-wrap: break-word;
word-break: keep-all;
};