[LTP] [PATCH v2 1/2] lib/safe_macros: Add SAFE_STRTOF
zhaogongyi
zhaogongyi@huawei.com
Fri Dec 2 03:34:19 CET 2022
Hi Cyril,
>
> Hi!
> > +float safe_strtof(const char *file, const int lineno,
> > + void (cleanup_fn) (void), char *str,
> > + float min, float max)
> > +{
> > + float rval;
> > + char *endptr;
> > +
> > + errno = 0;
> > + rval = strtof(str, &endptr);
> > +
> > + if ((errno == ERANGE) || (rval == 0)
> > + || (rval == HUGE_VAL) || (rval == -HUGE_VAL)) {
>
> This does not look right, supposedly the ERANGE is only set on overflow,
> and the rval is not guaranteed to be exact on underflow. Also rval == 0 is a
> valid result.
>
According to man 3 strtof, it seems there are some cases like:
1. strtof return the converted value as normal
2. strtof return 0 when no conversion is performed, and endptr == nptr: 'rval == 0'
3. strtof return HUGE_VAL or -HUGE_VAL when overflow: '(rval == HUGE_VAL) || (rval == -HUGE_VAL)'
4. strtof retrun 0 and set errno to ERANGE when underflow: 'errno == ERANGE'
For 2, it seems need to add checking of endptr when 'rval == 0' like: (rval == 0 && !strcmp(endptr, nptr)
Other places seem to be fine.
Regards,
Gongyi
More information about the ltp
mailing list