[ovs-dev] [PATCH 02/26] list: New macro OVS_LIST_POISON for initializing a poisoned list.
Jarno Rajahalme
jrajahalme at nicira.com
Fri Jul 31 20:03:24 UTC 2015
> On Jul 31, 2015, at 11:37 AM, Ben Pfaff <blp at nicira.com> wrote:
>
> On Fri, Jul 31, 2015 at 11:18:22AM -0700, Jarno Rajahalme wrote:
>> One question below,
>
> One answer below ;-)
>
>> Acked-by: Jarno Rajahalme <jrajahalme at nicira.com>
>
> Thanks.
>
>>> On Jul 29, 2015, at 11:42 PM, Ben Pfaff <blp at nicira.com> wrote:
>>>
>>> To be used in an upcoming commit.
>>>
>>> Signed-off-by: Ben Pfaff <blp at nicira.com>
>>> ---
>>> lib/list.h | 7 ++++++-
>>> 1 file changed, 6 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/lib/list.h b/lib/list.h
>>> index 7ba1e35..c1b0891 100644
>>> --- a/lib/list.h
>>> +++ b/lib/list.h
>>> @@ -23,6 +23,11 @@
>>> #include "util.h"
>>> #include "openvswitch/list.h"
>>>
>>> +/* Initializer for a list with pointers that will (probably) cause segfaults if
>>> + * dereferenced and, better yet, show up clearly in a debugger. */
>>> +#define OVS_LIST_POISON { (void *) (uintptr_t) 0xccccccccccccccccULL, \
>>> + (void *) (uintptr_t) 0xccccccccccccccccULL }
>>> +
>>> static inline void list_init(struct ovs_list *);
>>> static inline void list_poison(struct ovs_list *);
>>>
>>> @@ -91,7 +96,7 @@ list_init(struct ovs_list *list)
>>> static inline void
>>> list_poison(struct ovs_list *list)
>>> {
>>> - memset(list, 0xcc, sizeof *list);
>>> + *list = (struct ovs_list) OVS_LIST_POISON;
>>
>> Could the cast be part of the macro?
>
> The short answer is "yes". Would you like it that way, then?
>
If the compound literal can still be used as an initializer, then yes, so that the macro can be used by itself in both situations, as an initializer and as a compound literal in an assignment.
> For C pedants only, continue reading for pedantry below the fold.
>
Thanks, I’m always open to deepen my understanding of C :-)
Jarno
> --8<--------------------------cut here-------------------------->8--
>
> First, it's not a cast. It's a compound literal, and the C standard
> says, in a footnote: "Note that [a compound literal] differs from a cast
> expression. For example, a cast specifies a conversion to scalar types
> or void only, and the result of a cast expression is not an lvalue."
>
> Second, a compound literal isn't an initializer (except in the
> degenerate sense that any expression is an initializer). The {...}
> bracketed text in OVS_LIST_POISON is really an initializer. So I'd
> probably update the comment above OVS_LIST_POISON at the same time, for
> better pedantry.
More information about the dev
mailing list