URL:
<http://gna.org/bugs/?19409>
Summary: cmdhelp_new() modifies const parameter on some
platforms
Project: Freeciv
Submitted by: cazfi
Submitted on: Sun 05 Feb 2012 02:46:37 AM EET
Category: general
Severity: 3 - Normal
Priority: 5 - Normal
Status: None
Assigned to: None
Originator Email:
Open/Closed: Open
Release:
Discussion Lock: Any
Operating System: None
Planned Release:
_______________________________________________________
Details:
I got warning that at first seemed only a missing #include when compiling for
Windows. After some thinking, I'm quite convinced that this is more serious
than that.
GNU basename() takes const parameter, POSIX one does not. cmdhelp_new() passes
const parameter to basename(). Everything is fine as long as GNU basename() is
being used, but bad things happen if not.
One gets GNU basename on systems supporting it by *not* including libgen.h
that has POSIX version. But simply omitting libgen.h include (as we do at the
moment) results prototype not to be included at all in systems without GNU
basename(). Then two C features come to play. First is that in lack of
explicit prototype (stating that parameter is *not* const in current platform)
implicit one is used, and from the fact that caller passes const parameter,
implicit prototype is constructed with const parameter. Now we have const
parameter in compile time, and non-const only in library to be linked against
(linking time). Second C (unlike C++) feature is that symbol names do not
contain information about parameter types, or even their count. To linker
"basename(const char *)" and "basename(char *)" are both just "basename()",
and so it happily links our 'const char *' parameter against library's 'char
*' function without any warnings.
Easy solution would be to always use POSIX version, but I'm still trying to
construct fc_basename() that would pass its const parameter as is to GNU
basename if available, and do more complicated things itself if available
baseline() modifies its parameters. Portable (not gcc-specific) configure
checks catering for all the cases seems to be quite hairy to do, though.
_______________________________________________________
Reply to this item at:
<http://gna.org/bugs/?19409>
_______________________________________________
Message sent via/by Gna!
http://gna.org/
_______________________________________________
Freeciv-dev mailing list
[email protected]
https://mail.gna.org/listinfo/freeciv-dev