All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH 08/24] util/cutils: Clean up control flow around qemu_strtol() a bit
Date: Tue, 14 Feb 2017 13:58:32 +0100	[thread overview]
Message-ID: <871sv1dj47.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <CAFEAcA_utp4m28Lk20vZ4u1UT7zPdkgywxJp2GS8WNFsNh_AOQ@mail.gmail.com> (Peter Maydell's message of "Tue, 14 Feb 2017 10:53:01 +0000")

Peter Maydell <peter.maydell@linaro.org> writes:

> On 14 February 2017 at 10:25, Markus Armbruster <armbru@redhat.com> wrote:
>> Reorder check_strtox_error() to make it obvious that we always store
>> through a non-null @endptr.
>>
>> Transform
>>
>>     if (some error) {
>>         error case ...
>>         err = value for error case;
>>     } else {
>>         normal case ...
>>         err = value for normal case;
>>     }
>>     return err;
>>
>> to
>>
>>     if (some error) {
>>         error case ...
>>         return value for error case;
>>     }
>>     normal case ...
>>     return value for normal case;
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
>>  util/cutils.c | 89 ++++++++++++++++++++++++++++++-----------------------------
>>  1 file changed, 45 insertions(+), 44 deletions(-)
>>
>> diff --git a/util/cutils.c b/util/cutils.c
>> index 7d165bc..7442d46 100644
>> --- a/util/cutils.c
>> +++ b/util/cutils.c
>> @@ -265,15 +265,20 @@ int64_t qemu_strtosz(const char *nptr, char **end)
>>  static int check_strtox_error(const char *nptr, char *ep,
>>                                const char **endptr, int eno)
>>  {
>> -    if (eno == 0 && ep == nptr) {
>> -        eno = EINVAL;
>> -    }
>> -    if (!endptr && *ep) {
>> -        return -EINVAL;
>> -    }
>>      if (endptr) {
>>          *endptr = ep;
>>      }
>> +
>> +    /* Turn "no conversion" into an error */
>> +    if (eno == 0 && ep == nptr) {
>> +        return -EINVAL;
>> +    }
>> +
>> +    /* Fail when we're expected to consume the string, but didn't */
>> +    if (!endptr && *ep) {
>> +        return -EINVAL;
>> +    }
>> +
>>      return -eno;
>>  }
>
> Doesn't this change the semantics? Previously, for the
> case of (eno == 0 && ep == nptr) we would both set
> *endptr to ep and return -EINVAL. Now we only return -EINVAL
> and leave *endptr alone.

Behavior before the patch:

    if (eno == 0 && ep == nptr) {
        eno = EINVAL;           // set return value to EINVAL, but continue
    }
    if (!endptr && *ep) {
        return -EINVAL;         // return -EINVAL without setting *endptr
                                // correct because endptr is null
    }
    if (endptr) {
        *endptr = ep;           // set *endptr unless endptr is null
    }
    return -eno;                // *endptr got set unless endptr is null

As you say, we set *endptr unless it's null.

After the patch:

    if (endptr) {
        *endptr = ep;           // set *endptr unless endptr is null
    }

    // no matter what happens below, *endptr got set unless endptr is null

    /* Turn "no conversion" into an error */
    if (eno == 0 && ep == nptr) {
        return -EINVAL;
    }

    /* Fail when we're expected to consume the string, but didn't */
    if (!endptr && *ep) {
        return -EINVAL;
    }

    return -eno;

No change, as far as I can tell.

>                          The comment describing the
> qemu_strtol() API is a bit vague about what exactly we keep
> from the strtol() semantics for "no convertable characters"
> but I would assume that retaining "*endptr is written with
> the original value of nptr" is intentional.

I rewrite the comment PATCH 05.  Relevant part:

 * @nptr may be null, and no conversion is performed then.
 *
 * If no conversion is performed, store @nptr in *@endptr and return
 * -EINVAL.

I guess I should qualify "store @nptr in *@endptr" with "unless @endptr
is null" for completeness.  Anything else to improve?

  reply	other threads:[~2017-02-14 12:58 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-14 10:25 [Qemu-devel] [PATCH 00/24] QemuOpts util/cutils: Fix and clean up number conversions Markus Armbruster
2017-02-14 10:25 ` [Qemu-devel] [PATCH 01/24] tests/test-qemu-opts: Cover qemu_opts_parse() Markus Armbruster
2017-02-14 19:48   ` Eric Blake
2017-02-14 10:25 ` [Qemu-devel] [PATCH 02/24] QemuOpts: Assert value string isn't null Markus Armbruster
2017-02-14 20:10   ` Eric Blake
2017-02-16 12:58     ` Markus Armbruster
2017-02-14 10:25 ` [Qemu-devel] [PATCH 03/24] tests/test-cutils: Add missing qemu_strtol()... endptr checks Markus Armbruster
2017-02-14 20:11   ` Eric Blake
2017-02-19  4:12   ` Philippe Mathieu-Daudé
2017-02-14 10:25 ` [Qemu-devel] [PATCH 04/24] tests/test-cutils: Clean up qemu_strtoul() result checks Markus Armbruster
2017-02-14 21:28   ` Eric Blake
2017-02-16 13:07     ` Markus Armbruster
2017-02-14 10:25 ` [Qemu-devel] [PATCH 05/24] util/cutils: Rewrite documentation of qemu_strtol() & friends Markus Armbruster
2017-02-14 21:32   ` Eric Blake
2017-02-19  4:12   ` Philippe Mathieu-Daudé
2017-02-14 10:25 ` [Qemu-devel] [PATCH 06/24] util/cutils: Rename qemu_strtoll(), qemu_strtoull() Markus Armbruster
2017-02-14 21:34   ` Eric Blake
2017-02-19  4:14   ` Philippe Mathieu-Daudé
2017-02-14 10:25 ` [Qemu-devel] [PATCH 07/24] util/cutils: Clean up variable names around qemu_strtol() Markus Armbruster
2017-02-14 12:33   ` Paolo Bonzini
2017-02-14 13:11     ` Markus Armbruster
2017-02-14 21:37   ` Eric Blake
2017-02-14 10:25 ` [Qemu-devel] [PATCH 08/24] util/cutils: Clean up control flow around qemu_strtol() a bit Markus Armbruster
2017-02-14 10:53   ` Peter Maydell
2017-02-14 12:58     ` Markus Armbruster [this message]
2017-02-14 13:01       ` Peter Maydell
2017-02-14 21:40   ` Eric Blake
2017-02-14 10:25 ` [Qemu-devel] [PATCH 09/24] QemuOpts: Fix to reject numbers that overflow uint64_t Markus Armbruster
2017-02-14 21:48   ` Eric Blake
2017-02-14 10:25 ` [Qemu-devel] [PATCH 10/24] tests/test-cutils: Add missing qemu_strtosz()... endptr checks Markus Armbruster
2017-02-14 22:26   ` Eric Blake
2017-02-19  4:16   ` Philippe Mathieu-Daudé
2017-02-14 10:25 ` [Qemu-devel] [PATCH 11/24] tests/test-cutils: Cover qemu_strtosz() invalid input Markus Armbruster
2017-02-14 22:53   ` Eric Blake
2017-02-16 14:19     ` Markus Armbruster
2017-02-14 10:25 ` [Qemu-devel] [PATCH 12/24] tests/test-cutils: Cover qemu_strtosz() with trailing crap Markus Armbruster
2017-02-14 22:58   ` Eric Blake
2017-02-14 10:26 ` [Qemu-devel] [PATCH 13/24] tests/test-cutils: Cover qemu_strtosz() around range limits Markus Armbruster
2017-02-14 23:14   ` Eric Blake
2017-02-14 10:26 ` [Qemu-devel] [PATCH 14/24] util/cutils: New qemu_strtosz_metric() Markus Armbruster
2017-02-17 20:44   ` Eric Blake
2017-02-18 10:08     ` Markus Armbruster
2017-02-14 10:26 ` [Qemu-devel] [PATCH 15/24] util/cutils: Rename qemu_strtosz() to qemu_strtosz_mebi() Markus Armbruster
2017-02-14 12:35   ` Paolo Bonzini
2017-02-14 13:12     ` Markus Armbruster
2017-02-17 20:45   ` Eric Blake
2017-02-14 10:26 ` [Qemu-devel] [PATCH 16/24] util/cutils: New qemu_strtosz() Markus Armbruster
2017-02-17 20:48   ` Eric Blake
2017-02-14 10:26 ` [Qemu-devel] [PATCH 17/24] util/cutils: Drop QEMU_STRTOSZ_DEFSUFFIX_* macros Markus Armbruster
2017-02-17 20:51   ` Eric Blake
2017-02-19  4:21   ` Philippe Mathieu-Daudé
2017-02-14 10:26 ` [Qemu-devel] [PATCH 18/24] tests/test-cutils: Use qemu_strtosz() more often Markus Armbruster
2017-02-17 20:55   ` Eric Blake
2017-02-14 10:26 ` [Qemu-devel] [PATCH 19/24] tests/test-cutils: Drop suffix from test_qemu_strtosz_simple() Markus Armbruster
2017-02-17 20:58   ` Eric Blake
2017-02-14 10:26 ` [Qemu-devel] [PATCH 20/24] qemu-img: Wrap cvtnum() around qemu_strtosz() Markus Armbruster
2017-02-17 21:10   ` Eric Blake
2017-02-18 10:13     ` Markus Armbruster
2017-02-14 10:26 ` [Qemu-devel] [PATCH 21/24] util/cutils: Let qemu_strtosz*() optionally reject trailing crap Markus Armbruster
2017-02-17 21:21   ` Eric Blake
2017-02-18 10:22     ` Markus Armbruster
2017-02-20 19:34   ` Dr. David Alan Gilbert
2017-02-21  9:13     ` Markus Armbruster
2017-02-21  9:21       ` Dr. David Alan Gilbert
2017-02-14 10:26 ` [Qemu-devel] [PATCH 22/24] util/cutils: Return qemu_strtosz*() error and value separately Markus Armbruster
2017-02-17 22:03   ` Eric Blake
2017-02-18 10:33     ` Markus Armbruster
2017-02-20 19:52   ` Dr. David Alan Gilbert
2017-02-14 10:26 ` [Qemu-devel] [PATCH 23/24] util/cutils: Change qemu_strtosz*() from int64_t to uint64_t Markus Armbruster
2017-02-17 22:19   ` Eric Blake
2017-02-18 10:40     ` Markus Armbruster
2017-02-20 20:16   ` Dr. David Alan Gilbert
2017-02-21  8:40     ` Paolo Bonzini
2017-02-21  9:25     ` Markus Armbruster
2017-02-14 10:26 ` [Qemu-devel] [PATCH 24/24] QemuOpts: Fix checking of sizes for overflow and trailing crap Markus Armbruster
2017-02-17 22:27   ` Eric Blake
2017-02-18 10:46     ` Markus Armbruster
2017-02-14 10:57 ` [Qemu-devel] [PATCH 00/24] QemuOpts util/cutils: Fix and clean up number conversions no-reply
2017-02-14 12:37 ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871sv1dj47.fsf@dusky.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.