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
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to