On 11/21/18 4:35 AM, David Hildenbrand wrote:

+int qemu_strtod_finite(const char *nptr, const char **endptr, double *result)
+{
+    double tmp;
+    int ret;
+
+    ret = qemu_strtod(nptr, endptr, &tmp);
+    if (ret) {
+        return ret;

So, if we overflow, we are returning -ERANGE but with nothing stored
into *result.  This is different from qemu_strtod(), where a return of
-ERANGE guarantees that *result is one of 4 values (+/- 0.0/inf).
That seems awkward.

Violates the contract's "like qemu_strtod()".

Right, I missed that. What about something like this:

int qemu_strtod_finite(const char *nptr, const char **endptr, double
*result)
{
     double tmp;
     int ret;

     ret = qemu_strtod(nptr, endptr, &tmp);
     if (!ret && !isfinite(tmp)) {
         if (endptr) {
             *endptr = nptr;
         }
         ret = -EINVAL;
     }

     if (ret != -EINVAL) {
         *result = tmp;
     }
     return ret;
}

With that algorithm, v3 can have:
Reviewed-by: Eric Blake <ebl...@redhat.com>

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

Reply via email to