From: Greg Kurz <groug@kaod.org>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org,
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH 3/8] 9pfs: fix P9_NOTAG and P9_NOFID macros
Date: Sun, 11 Dec 2016 00:03:41 +0100 [thread overview]
Message-ID: <20161211000341.19d4192c@bahia> (raw)
In-Reply-To: <4d3cb602-acd8-42d2-43d7-c67c3c933aeb@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 2618 bytes --]
On Sat, 10 Dec 2016 10:24:35 -0600
Eric Blake <eblake@redhat.com> wrote:
> On 12/10/2016 07:57 AM, Greg Kurz wrote:
>
> >>> -#define P9_NOTAG (u16)(~0)
> >>> -#define P9_NOFID (u32)(~0)
> >>> +#define P9_NOTAG (uint16_t)(~0)
> >>> +#define P9_NOFID (uint32_t)(~0)
> >>
> >> Don't you want to write ((uint16_t)(~0)), to ensure that this expression
> >> can be used as a drop-in in any other syntactical situation?
> >>
> >
> > These defines come from the linux kernel sources and I must admit it
> > didn't cross my mind... can you share a case where this would cause
> > troubles ?
>
> Unlikely to occur in real code, but:
>
> int a[] = { -2, -3 };
> int *b = a + 1;
> printf("%d\n", (uint16_t)(~0)[b]); // prints 65534 - let's see why?
>
> // prints 65534, or the result of b[-1] cast to uint16_t
> printf("%d\n", (uint16_t)((~0)[b]));
>
> // probably dumps core, as b[65535] is out of bounds
> printf("%d\n", ((uint16_t)(~0))[b]);
>
> that is, since [] has higher precedence than casts, failure to
> parenthesize a cast will change the interpretation of P9_NOTAG[pointer].
>
... which is indeed very unlikely to happen even if it is legit. :)
> And yes, if you copied from the kernel, that means the kernel has a bug
> (even if it is unlikely to trip up normal code).
>
I'll send a patch there too.
>
> >
> >> Or even write it as UINT16_C(~0) (using <stdint.h>), or as UINT16_MAX.
> >> (Be aware: the type of (uint16_t)(~0) is uint16_t, while the type of
> >> UINT16_MAX is int, due to the rules of integer promotion, if that matters)
> >>
> >
> > UINT16_C(~0) expands to ~0 and UINT16_MAX expands to (65535), at least on
> > my laptop (glibc-headers-2.23.1-11.fc24.x86_64)... doesn't that mean the
> > type of UINT16_C(~0) is also int ? Please enlighten me.
>
> Indeed, UINT16_C produces an int constant, not uint16_t (since there is
> no such thing as a uint16_t constant). So the cast is the only way to
> force ~0 to be truncated to a 16-bit pattern. But using UINT16_MAX is
> probably just fine, as it is the all-ones value with the correct integer
> promotion for use in any other arithmetic.
>
> >
> > The 9P spec at http://man.cat-v.org/plan_9/5/version says "(ushort)~0". My
> > understanding is 16 bits all ones. I guess I'd rather then go for
> > ((uint16_t)(~0)).
>
> Verbose, but works, as does UINT16_MAX. But I stand corrected that
> UINT16_C(~0) does not work.
>
Ok, I'll go the UINT16_MAX way then.
Thanks for the detailed explanation.
Cheers.
--
Greg
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]
next prev parent reply other threads:[~2016-12-10 23:03 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-09 9:27 [Qemu-devel] [PATCH 0/8] tests: add 9P functional tests Greg Kurz
2016-12-09 9:27 ` [Qemu-devel] [PATCH 1/8] tests: virtio-9p: rename PCI configuration test Greg Kurz
2016-12-09 9:27 ` [Qemu-devel] [PATCH 2/8] tests: virtio-9p: code refactoring Greg Kurz
2016-12-09 9:28 ` [Qemu-devel] [PATCH 3/8] 9pfs: fix P9_NOTAG and P9_NOFID macros Greg Kurz
2016-12-09 21:25 ` Eric Blake
2016-12-10 13:57 ` Greg Kurz
2016-12-10 16:24 ` Eric Blake
2016-12-10 23:03 ` Greg Kurz [this message]
2016-12-09 9:28 ` [Qemu-devel] [PATCH 4/8] tests: virtio-9p: add version operation test Greg Kurz
2016-12-09 9:28 ` [Qemu-devel] [PATCH 5/8] tests: virtio-9p: add attach " Greg Kurz
2016-12-09 9:28 ` [Qemu-devel] [PATCH 6/8] tests: virtio-9p: add walk " Greg Kurz
2016-12-09 9:28 ` [Qemu-devel] [PATCH 7/8] tests: virtio-9p: no slash in path elements during walk Greg Kurz
2016-12-09 9:28 ` [Qemu-devel] [PATCH 8/8] tests: virtio-9p: ".." cannot be used to walk out of the shared directory Greg Kurz
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=20161211000341.19d4192c@bahia \
--to=groug@kaod.org \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=eblake@redhat.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.