|
From: | Lorenzo Bettini |
Subject: | [help-gengetopt] Re: GNU Gengetopt 2.22 |
Date: | Tue, 15 Jan 2008 22:52:57 +0100 |
User-agent: | Thunderbird 2.0.0.6 (X11/20071022) |
Andre Noll wrote:
mh... I don't think this is the expected behavior: issueing another configure might change the config.h and the files that include it will be recompiled, but not all files are expected to include it; actually if you build a package for different platforms you should run each configure in a separate directory (one for each different configure).Similarly, if gengetopt is compiled on Mac, and then configured and built on Linux, it results in argsdef.o: file not recognized: File format not recognized However, this is not a serious issue because "make clean" solves the problem.OK. Another solution would be to let all object files depend on Makefile which is also generated by configure.
mhh... but I don't know whether this can be made in a clean way with autotools... I'm pretty sure that configure for different architectures should be run in different directories...
mh... setting that arg to null is crucial (since what is freed could be re-used internally), but probably I could set it to NULL after that function call, I'll take a look at this.Finally, when compiling audiod.cmdline.c, a file generated by gengetopt-2.22, I see the following warning, which didn't show up when using earlier versions of gengetopt: audiod.cmdline.c: In function 'audiod_cmdline_parser_release':audiod.cmdline.c:337: warning: dereferencing type-punned pointer will break strict-aliasing rulesThe offending line 337 in audiod.cmdline.c isfree_multiple_field (args_info->user_allow_given, (void **)&(args_info->user_allow_arg), &(args_info->user_allow_orig));And free_multiple_field() looks like this: static void free_multiple_field(unsigned int len, void **arg, char ***orig) { unsigned int i; if (*arg) { for (i = 0; i < len; ++i) { free_string_field(&((*orig)[i])); } free (*arg); *arg = 0; free (*orig); *orig = 0; } } Why you are using void ** as the second parameter "arg" when the function is only using *arg? Wouldn't it be better to generate static void free_multiple_field(unsigned int len, void *arg, char ***orig) { unsigned int i; if (arg) { for (i = 0; i < len; ++i) { free_string_field(&((*orig)[i])); } free (arg); free (*orig); *orig = 0; } } instead? This would allow to get rid of the cast in the offending line. The only drawback I can see is that args_info->user_allow_arg is not set to NULL by free_multiple_field() when using this approach.I see. An alternative for getting rid of this warning is to introduce an intermediate (void *) cast: free_multiple_field (args_info->user_allow_given, (void **)(void *)&(args_info->user_allow_arg), &(args_info->user_allow_orig)); ^^^^^^^^
well if this does not generate the warning I think that'd be a better solution :-)
Actually, I don't get this warning, so thanks for reporting it.You need to compile with -Wstrict-aliasing (included in -Wall) and with -fstrict-aliasing (enabled at levels -O2, -O3, -Os).
actually I always test compilations with -Wall but I don't get this warning... probably because you're using a different architecture? Is this warning something to worry about? I mean: I want to remove it, but does the warning means that the above code can do something wrong?
thanks LorenzoP.S. there are also other warnings that I still need to remove; Gyozo, I didn't remember to remove all the warnings you told me about; I'll do that in the very near future :-)
-- Lorenzo Bettini, PhD in Computer Science, DI, Univ. Torino ICQ# lbetto, 16080134 (GNU/Linux User # 158233) HOME: http://www.lorenzobettini.it MUSIC: http://www.purplesucker.com http://www.myspace.com/supertrouperabba BLOGS: http://tronprog.blogspot.com http://longlivemusic.blogspot.com http://www.gnu.org/software/src-highlite http://www.gnu.org/software/gengetopt http://www.gnu.org/software/gengen http://doublecpp.sourceforge.net
[Prev in Thread] | Current Thread | [Next in Thread] |