[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