From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v6 02/23] qapi: Require int64/uint64 implementation
Date: Wed, 2 Dec 2015 14:25:42 -0700 [thread overview]
Message-ID: <565F61D6.3050907@redhat.com> (raw)
In-Reply-To: <87si3r4phq.fsf@blackfin.pond.sub.org>
[-- Attachment #1: Type: text/plain, Size: 3207 bytes --]
On 11/27/2015 05:05 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
>
>> Now that all visitors supply both type_int64() and type_uint64()
>> callbacks, we can drop the redundant type_int() callback (the
>> public interface visit_type_int() remains, but calls into
>> type_int64() under the hood).
>>
>> Signed-off-by: Eric Blake <eblake@redhat.com>
>>
>> void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp)
>> {
>> - int64_t value;
>> + uint64_t value;
>>
>> if (v->type_uint8) {
>> v->type_uint8(v, obj, name, errp);
>> } else {
>> value = *obj;
>> - v->type_int(v, &value, name, errp);
>> - if (value < 0 || value > UINT8_MAX) {
>> + v->type_uint64(v, &value, name, errp);
>> + if (value > UINT8_MAX) {
>> error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
>> name ? name : "null", "uint8_t");
>> return;
>
> Note that this relies on value being in range after type_uint64() fails.
> If it isn't, we call error_setg() with non-null *errp.
>
> Two solutions:
>
> 1. Stipulate that type_uint64() & friends leave value alone on error.
> Works, because its initial value *obj is in range.
Pre-existing and simpler, but sets a poor example for the rest of the
code base (not everyone is going to read the fine print for why it works
here), and requires cross-file audits to ensure visitors comply.
>
> 2. Avoid using value on error. A clean way to do this:
>
> Error *err = NULL;
>
> value = *obj;
> v->type_uint64(v, &value, name, &err);
> if (err) {
> error_propagate(errp, err);
> return;
> }
> if (value < 0 || value > UINT8_MAX) {
> error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> name ? name : "null", "uint8_t");
> return;
> }
> *obj = value;
>
> More boilerplate. If we pick this solution, we'll want a separate
> PATCH 1.5 cleaning up the preexisting instances.
Of course, if I do the cleanup as 1.5, then patch 3/23 reindents
everything, that's a lot of churn. So I may end up rearranging 2 and 3
after all, and then do the cleanup as 3.5.
Or maybe option 3, write a pair of helper functions containing the
boilerplate for checking against min and max:
void visit_type_intN(Visitor *v, int64_t *obj, const char *name,
int64_t min, int64_t max, Error **errp);
void visit_type_uintN(Visitor *v, int64_t *obj, const char *name,
uint64_t max, Error **errp);
leaving us with simpler clients:
visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **errp)
{
int64_t value = *obj;
visit_type_uintN(v, &value, name, INT8_MIN, INT8_MAX, errp);
*obj = value;
}
and here, because the helpers are in the same file, it's easier to prove
that value was unchanged on error. Or I may even squash 2 and 3 into a
single patch now.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2015-12-02 21:25 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-26 0:22 [Qemu-devel] [PATCH v6 00/23] qapi visitor cleanups (post-introspection cleanups subset E) Eric Blake
2015-11-26 0:22 ` [Qemu-devel] [PATCH v6 01/23] qapi: Make all visitors supply int64/uint64 callbacks Eric Blake
2015-11-27 11:17 ` Markus Armbruster
2015-11-26 0:22 ` [Qemu-devel] [PATCH v6 02/23] qapi: Require int64/uint64 implementation Eric Blake
2015-11-27 12:05 ` Markus Armbruster
2015-12-02 21:25 ` Eric Blake [this message]
2015-12-03 8:30 ` Markus Armbruster
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 03/23] qapi: Consolidate visitor integer callbacks Eric Blake
2015-11-27 12:11 ` Markus Armbruster
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 04/23] qapi: Don't cast Enum* to int* Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 05/23] qmp: Fix reference-counting of qnull on empty output visit Eric Blake
2015-11-27 13:06 ` Markus Armbruster
2015-12-02 23:10 ` Eric Blake
2015-12-03 17:50 ` Markus Armbruster
2015-12-04 3:01 ` Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 06/23] qapi: Don't abuse stack to track qmp-output root Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 07/23] qapi: Document visitor interfaces Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 08/23] qapi: Drop unused error argument for list and implicit struct Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 09/23] hmp: Improve use of qapi visitor Eric Blake
2015-12-04 21:18 ` Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 10/23] vl: " Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 11/23] ppc: Improve use of qapi visitors Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 12/23] balloon: Improve use of qapi visitor Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 13/23] qapi: Add type.is_empty() helper Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 14/23] qapi: Fix command with named empty argument type Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 15/23] qapi: Improve generated event use of qapi visitor Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 16/23] qapi: Track all failures between visit_start/stop Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 17/23] qapi: Eliminate empty visit_type_FOO_fields Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 18/23] qapi: Canonicalize missing object to :empty Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 19/23] qapi-visit: Unify struct and union visit Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 20/23] qapi: Rework deallocation of partial struct Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 21/23] qapi: Simplify extra member error reporting in input visitors Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 22/23] qapi: Split visit_end_struct() into pieces Eric Blake
2015-11-26 0:23 ` [Qemu-devel] [PATCH v6 23/23] qapi: Change visit_type_FOO() to no longer return partial objects Eric Blake
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=565F61D6.3050907@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--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.