[PATCH] msvcrt: Fix strtof() error reporting for values out of float range
Piotr Caban
piotr.caban at gmail.com
Wed Jul 28 04:56:12 CDT 2021
Hi Martin,
On 7/28/21 12:44 AM, Martin Storsjo wrote:
> float CDECL _strtof_l( const char *str, char **end, _locale_t locale )
> {
> - return _strtod_l(str, end, locale);
> + double ret = _strtod_l(str, end, locale);
> + if (isfinite(ret)) {
> + /* Check for cases that aren't out of range for doubles, but that are
> + * for floats. */
> + if (ret > FLT_MAX)
> + *_errno() = ERANGE;
> + else if (ret < -FLT_MAX)
> + *_errno() = ERANGE;
> + else if (ret > 0 && ret < FLT_MIN)
> + *_errno() = ERANGE;
> + else if (ret < 0 && ret > -FLT_MIN)
> + *_errno() = ERANGE;
> + }
> + return ret;
It doesn't work for denormals (e.g. for "1.4e-45" input string). Maybe
something along this lines will work better:
if (ret && isfinite(ret)) {
float f = ret;
if (!f || !isfinite(f))
*_errno() = ERANGE;
}
Thanks,
Piotr
More information about the wine-devel
mailing list