I am fine with the suggestion and the patch you sent. Thanks Ben. -----Original Message----- From: Ben Pfaff <b...@ovn.org> Date: Friday, March 18, 2016 at 1:47 PM To: Nithin Raju <nit...@vmware.com> Cc: "dev@openvswitch.org" <dev@openvswitch.org>, Yin Lin <li...@vmware.com> Subject: Re: [ovs-dev] [PATCH] list.h: Define OVS_LIST_POISON statically
>On Fri, Mar 18, 2016 at 01:17:54PM -0700, Nithin Raju wrote: >> The previous definitions of these variables using designated >> initializers caused a variety of issues when attempting to >> compile with MSVC, particularly if including these headers from C++ >> code. By defining them like this, we can appease MSVC and keep the >> definitions the same on all platforms. >> >> Suggested-by: Yin Lin <li...@vmware.com> >> Signed-off-by: Nithin Raju <nit...@vmware.com> >> --- >> lib/list.h | 12 ++++++++---- >> 1 file changed, 8 insertions(+), 4 deletions(-) >> >> diff --git a/lib/list.h b/lib/list.h >> index f9c9d85..24c57ba 100644 >> --- a/lib/list.h >> +++ b/lib/list.h >> @@ -24,10 +24,14 @@ >> #include "openvswitch/list.h" >> >> /* "struct ovs_list" with pointers that will (probably) cause >>segfaults if >> - * dereferenced and, better yet, show up clearly in a debugger. */ >> -#define OVS_LIST_POISON \ >> -(struct ovs_list) { (struct ovs_list *) (uintptr_t) >>0xccccccccccccccccULL, \ >> - (struct ovs_list *) (uintptr_t) >>0xccccccccccccccccULL } >> + * dereferenced and, better yet, show up clearly in a debugger. >> + >> + * MSVC2015 doesn't support designated initializers when compiling C++, >> + * and doesn't support ternary operators with non-designated >>initializers. >> + * So we use these static definitions rather than using initializer >>macros. */ >> +static const struct ovs_list OVS_LIST_POISON = >> + { (struct ovs_list *) (uintptr_t) 0xccccccccccccccccULL, >> + (struct ovs_list *) (uintptr_t) 0xccccccccccccccccULL }; > >This causes a lot of new warnings from sparse, e.g.: > > ../lib/list.h:33:39: warning: cast truncates bits from constant value >(cccccccccccccccc becomes cccccccc) > ../lib/list.h:34:39: warning: cast truncates bits from constant value >(cccccccccccccccc becomes cccccccc) > >How about the following? It reuses a trick we previously have used in >rculist.h. > >--8<--------------------------cut here-------------------------->8-- > >From: Nithin Raju <nit...@vmware.com> >Date: Fri, 18 Mar 2016 13:17:54 -0700 >Subject: [PATCH] list.h: Define OVS_LIST_POISON statically > >The previous definitions of these variables using designated >initializers caused a variety of issues when attempting to >compile with MSVC, particularly if including these headers from C++ >code. By defining them like this, we can appease MSVC and keep the >definitions the same on all platforms. > >Suggested-by: Yin Lin <li...@vmware.com> >Signed-off-by: Nithin Raju <nit...@vmware.com> >Signed-off-by: Ben Pfaff <b...@ovn.org> >--- > lib/list.h | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > >diff --git a/lib/list.h b/lib/list.h >index f9c9d85..96bbafd 100644 >--- a/lib/list.h >+++ b/lib/list.h >@@ -1,5 +1,5 @@ > /* >- * Copyright (c) 2008, 2009, 2010, 2011, 2013, 2015 Nicira, Inc. >+ * Copyright (c) 2008, 2009, 2010, 2011, 2013, 2015, 2016 Nicira, Inc. > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. >@@ -24,10 +24,14 @@ > #include "openvswitch/list.h" > > /* "struct ovs_list" with pointers that will (probably) cause segfaults >if >- * dereferenced and, better yet, show up clearly in a debugger. */ >-#define OVS_LIST_POISON \ >-(struct ovs_list) { (struct ovs_list *) (uintptr_t) >0xccccccccccccccccULL, \ >- (struct ovs_list *) (uintptr_t) >0xccccccccccccccccULL } >+ * dereferenced and, better yet, show up clearly in a debugger. >+ >+ * MSVC2015 doesn't support designated initializers when compiling C++, >+ * and doesn't support ternary operators with non-designated >initializers. >+ * So we use these static definitions rather than using initializer >macros. */ >+static const struct ovs_list OVS_LIST_POISON = >+ { (struct ovs_list *) (UINTPTR_MAX / 0xf * 0xc), >+ (struct ovs_list *) (UINTPTR_MAX / 0xf * 0xc) }; > > static inline void list_init(struct ovs_list *); > static inline void list_poison(struct ovs_list *); >-- >2.1.3 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev