C 언어에서 문자열을 부동소수점 숫자로 변환하는 과정에서 발생하는 오류를 안정적으로 감지하는 것이 생각보다 어렵다는 지적이 나왔습니다. 특히 `strtod`, `strtof` 같은 표준 함수들을 사용할 때, 오버플로(overflow)나 언더플로(underflow) 같은 수치 오류를 모든 시스템에서 일관되게 확인하기 어렵다는 것이 핵심입니다. 이는 C 표준의 모호한 규정과 각 컴파일러 및 라이브러리 구현의 차이에서 비롯됩니다.
문제의 근원은 `math_errhandling`이라는 매크로에 있습니다. 이 매크로는 수학 함수에서 오류를 보고하는 방식이 `errno`를 설정하는 방식(`MATH_ERRNO`)인지, 부동소수점 예외(exception)를 발생시키는 방식(`MATH_ERREXCEPT`)인지를 나타냅니다. 표준 C는 오버플로 발생 시 이 두 가지 방식 중 하나를 따르도록 요구하지만, 언더플로 보고는 ‘구현 정의(implementation-defined)’ 사항으로 남겨두어 모든 시스템에서 언더플로를 감지할 수 있음을 보장하지 않습니다. 반면 POSIX 표준은 오버플로와 언더플로 모두 `errno`를 `ERANGE`로 설정하도록 명확히 요구하며, 이는 표준 C의 `math_errhandling` 설정과 무관합니다. 또한, 숫자로 변환할 수 없는 잘못된 입력의 경우 `errno`가 아닌 `endptr` 인수를 통해 확인해야 하는데, 이마저도 구현에 따라 `errno` 설정 방식이 달라져 이식성 있는 오류 검사가 더욱 복잡해집니다.
이러한 불일치는 C 언어로 견고한 애플리케이션을 개발하려는 개발자들에게 큰 어려움을 안겨줍니다. 특히 금융, 과학 계산 등 정밀한 수치 처리가 요구되는 분야에서는 치명적인 오류로 이어질 수 있습니다. 개발자는 대상 시스템의 표준(표준 C 또는 POSIX)과 특정 라이브러리(예: glibc, musl)의 동작 방식을 정확히 이해하고, 이에 맞춰 오류 검사 로직을 세심하게 구현해야 합니다. 이는 단순히 `errno` 값만 확인하는 것을 넘어, `feclearexcept`, `fetestexcept` 같은 부동소수점 예외 처리 함수와 컴파일러 옵션(`-ftrapping-math`)까지 고려해야 함을 의미합니다. 궁극적으로는 표준 C의 관련 규정에 더 명확한 문구가 추가되어야 할 필요성이 제기됩니다.