Re: including sparse headers in C++ code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Oct 17, 2010 at 12:31:26PM +0200, Tomas Klacko wrote:
> On Sat, Oct 16, 2010 at 9:11 PM, Josh Triplett <josh@xxxxxxxxxxxxxxxx> wrote:
> > On Sat, Oct 16, 2010 at 06:03:53PM +0200, Tomas Klacko wrote:
> >> On Wed, Oct 13, 2010 at 2:37 AM, Christopher Li <sparse@xxxxxxxxxxx> wrote:
> >> > On Tue, Oct 12, 2010 at 3:45 PM, Tomas Klacko <tomas.klacko@xxxxxxxxx> wrote:
> 
> >> >> Â/* Silly type-safety check ;) */
> >> >> Â#define DECLARE_PTR_LIST(listname,type) Â Â Â Âstruct listname { type *list[1]; }
> >> >> -#define CHECK_TYPE(head,ptr) Â Â Â Â Â (void)(&(ptr) == &(head)->list[0])
> >> >> Â#define TYPEOF(head) Â Â Â Â Â Â Â Â Â __typeof__(&(head)->list[0])
> >> >> Â#define VRFY_PTR_LIST(head) Â Â Â Â Â Â(void)(sizeof((head)->list[0]))
> >> >>
> >> >> +#ifndef __cplusplus
> >> >> +#define CHECK_TYPE(head,ptr) Â Â Â Â Â (void)(&(ptr) == &(head)->list[0])
> >> >> +#else
> >> >> +/* I don't know yet how to do this better in C++. */
> >> >> +#define CHECK_TYPE(head,ptr) (void)((void*)&(ptr) == (void*)&(head)->list[0])
> >> >> +#endif
> >> >
> >> > If you can't get CHECK_TYPE work in C++, you might just make it an empty define
> >> > instead of doing useless point dancing. At least it is clear that it does not
> >> > do any thing here.
> >>
> >> True. How about
> >> #define CHECK_TYPE (head,ptr) Â (void)(1)
> >> ?
> >
> > As far as I can tell, CHECK_TYPE works just fine in C++. ÂI could easily
> > compile an invocation of CHECK_TYPE, as well as some simple examples
> > that called the macros which invoked CHECK_TYPE. ÂWhen I tried
> > FOR_EACH_PTR, I encountered *other* warnings (related to assigning (void
> > *) to some other type without a cast), but those warnings didn't come
> > from CHECK_TYPE.
> 
> Maybe I did not investigate deeply enough to find out the origin of
> the warnings.
> But I get no warnings/errors, when I disable CHECK_TYPE in C++ code.
> 
> > What warning do you encounter about CHECK_TYPE?
> 
> In the following code1 (file main.cc):
> int main(int argc, char* argv[])
> {
>     struct string_list *files=NULL;
> 
>     void* file_void;
>     char* file_char;
> 
>     struct symbol_list *symbols=NULL;
>     struct symbol_list *all_symbols=NULL;
> 
>     symbols=sparse_initialize(argc, argv, &files);
>     concat_symbol_list(symbols, &all_symbols);
> 
>     FOR_EACH_PTR_NOTAG(files, file_void) {  // line 19
>         file_char=(char*)file_void;
>         symbols=sparse(file_char);
>         concat_symbol_list(symbols, &all_symbols);
>     } END_FOR_EACH_PTR_NOTAG(file_void);
> 
>     exit(EXIT_SUCCESS);
> }
> 
> I get:
> main.cc: In function âint main(int, char**)â:
> main.cc:19: error: comparison between distinct pointer types âvoid*â
> and âchar*â lacks a cast

This warning means that CHECK_TYPE has done its job correctly; you
should not use the void * file_void to iterate over a list of files.Â
FOR_EACH_PTR (and the _NOTAG variant) expect a list type and the
corresponding element type, and they use CHECK_TYPE to make this
type-safe.

> compiler and (important) flags:
> g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4), -Wall -Werror
> 
> 
> Now, the code2 (file main.cc):
> int main(int argc, char* argv[])
> {
>     struct string_list *files=NULL;
> 
>     char* file_char;
> 
>     struct symbol_list *symbols=NULL;
>     struct symbol_list *all_symbols=NULL;
> 
>     symbols=sparse_initialize(argc, argv, &files);
>     concat_symbol_list(symbols, &all_symbols);
> 
>     FOR_EACH_PTR_NOTAG(files, file_char) {  // line 18
>         symbols=sparse(file_char);
>         concat_symbol_list(symbols, &all_symbols);
>     } END_FOR_EACH_PTR_NOTAG(file_char);
> 
>     exit(EXIT_SUCCESS);
> }
> 
> I get error:
> main.cc: In function âint main(int, char**)â:
> main.cc:18: error: invalid conversion from âvoid*â to âchar*â

This warning doesn't come from CHECK_TYPE; it comes from the subsequent
implicit conversion from the list's void * to the desired type char *,
which will indeed need a cast to work correctly when included from C++.

Based on these two code examples, I think you don't need to change
CHECK_TYPE at all.  (And the user should always use code like your
second example, not your first example.)

(Of course, if someone really wants to use these lists from C++, they
might want to build appropriate type-safe C++ iterator types on top of
the ptrlist bits. :) )

- Josh Triplett
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux