← 뉴스레터

2026-08-05

1,024바이트를 넘기니까, 멀쩡한 글자를 깨졌다고 했다

검사가 「이 글자 깨졌다」고 했다. 손으로 재현해도 똑같이 나왔다. 그런데 그 글자는 멀쩡했고, 고장난 건 검사기였다.

손으로 재현해도 깨져 있었다

한글은 글자 하나가 3바이트다. 그래서 글을 길이로 자르면 마지막 글자가 반쪽만 남는 일이 생긴다. 그 반쪽이 남으면 화면에서 깨져 보이는 정도가 아니라, 그 파일을 다시 읽는 기능이 통째로 죽는다. 그걸 막는 코드를 손보는 중이었다.

검사를 돌렸더니 항목 하나가 빨간불이었다. 「만들어진 초안이 깨진 글자다」.

의심스러워서 검사기를 빼고 직접 재현해봤다. 초안을 손으로 만들어 같은 방식으로 확인했다. 똑같이 깨진 것으로 나왔다.

여기까지 오면 보통은 확정이다. 검사도 빨갛고 손으로도 빨갛다. 나는 이걸 진짜 결함으로 읽고 보고할 참이었다. 그러면 다음 순서는 멀쩡한 코드를 뜯어고치는 것이었다.

대조군 하나가 방향을 바꿨다

돌린 건 하나였다. 확실히 멀쩡한 파일을 만들어 같은 검사기에 넣어봤다. 한글만 반복해서 채운, 깨질 구석이 없는 파일이다.

그것도 **「깨졌다」**가 나왔다.

이 한 줄이 방향을 바꿨다. 검사 대상이 아니라 검사기를 의심해야 하는 상황이 된 것이다.

확인 삼아 두 가지를 더 넣었다. 문제의 초안을 다른 도구로 한 번 풀었다 다시 묶어 바이트가 완전히 같은 파일을 만들어 넣었다. 역시 「깨졌다」. 반대로 일부러 깨뜨린 3바이트짜리를 넣었더니 그것도 「깨졌다」.

즉 이 검사기는 멀쩡한 것과 깨진 것을 구별하지 못하면서 둘 다 깨졌다고 답하고 있었다.

경계는 1,024바이트였다

무엇이 기준인지 찾으려고 크기를 갈라가며 재봤다.

  • 1,023바이트 → 정상
  • 1,026바이트 → 「깨졌다」 (실제로는 멀쩡)
  • 8,190바이트 → 「깨졌다」 (실제로도 멀쩡)

경계는 1,024바이트였다. 그 도구가 한 번에 읽는 크기로 보인다. 그보다 작으면 제대로 답하고, 넘으면 무조건 깨졌다고 한다. 문제가 됐던 입력은 약 16,800바이트였다.

무서운 건 1,024바이트 아래에서는 이 함정이 전혀 안 보인다는 점이다. 짧은 예시로 검사하면 멀쩡히 통과한다. 누군가 나중에 입력을 키우는 순간 그때부터 빨간불이 뜨고, 그러면 「이 기계가 원래 좀 그래」로 묻힌다.

그날 내가 낸 다른 통과 판정들도 다시 확인했다. 입력이 420바이트, 178바이트였다. 전부 경계 아래였고 그 판정들은 그대로 유효했다. 경계를 넘은 건 딱 하나였고, 그게 이번에 잡힌 가짜 실패였다.

배운 것

먼저 내가 아까 낸 판단이 틀렸다고 적었다. 손으로 재현까지 해놓고 결함이라고 읽었으니 근거가 약한 판단은 아니었다. 그래도 틀렸다. 틀린 걸 조용히 덮으면 다음 사람이 같은 자리에 다시 선다.

그리고 이번 건은 방향이 반대여서 기록해 둘 값이 있다. 그날 아홉 번은 전부 「통과인데 실은 아무것도 안 본」 경우였다. 이번은 「실패인데 실은 멀쩡한」 경우다. 앞의 것은 안심시키고 뒤의 것은 멀쩡한 걸 뜯게 만든다. 둘 다 같은 뿌리에서 나온다 — 재는 도구가 살아 있는지 확인하지 않은 것.

남은 위험도 그대로 적었다. 같은 방식으로 판정하는 곳이 두 군데 더 있다. 지금은 입력이 작아서 조용하다. 커지는 순간 똑같이 터진다.


빨간불을 보면 대상을 먼저 의심하게 된다. 그런데 가끔은 자를 의심해야 한다.

— 강대종 / @ssamssae