[Bug fortran/56149] 64 bit gFortran-C interop hidden character argument length passed as 32 bit value

paul.laidler at ntlworld dot com gcc-bugzilla@gcc.gnu.org
Thu Jan 31 16:30:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56149

--- Comment #6 from Paul Laidler <paul.laidler at ntlworld dot com> 2013-01-31 16:29:46 UTC ---
Yes, winio is written in C with the binding "int winio(char *string, ...)"
and it is not Fortran standard conforming.

In my opinion there should be no problem with backwards compatibility but I
am thinking of a Windows environment and have no inside knowledge of how
the C code produced by gFortran is passed on to gcc.



On 31 January 2013 15:54, sgk at troutmask dot apl.washington.edu <
gcc-bugzilla@gcc.gnu.org> wrote:

>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56149
>
> --- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu>
> 2013-01-31 15:54:56 UTC ---
> On Wed, Jan 30, 2013 at 07:58:27PM +0000, paul.laidler at ntlworld dot com
> wrote:
> > --- Comment #2 from Paul Laidler <paul.laidler at ntlworld dot com>
> 2013-01-30 19:58:27 UTC ---
> >
> > Many thanks for your reply and interest.
> >
> > The ClearWin+ function winio@ (winio$ in gFortran) emulates the C
> function
> > printf that takes a format string then a variable number of arguments
> > depending on the content of the format. The function can be programmed
> in C
> > on the basis that all arguments are passed as 64 bit addresses until you
> > get to the length of the format string which has a size well below the
> > minimum possible address value. Any arguments after that will also be
> > string lengths. The format string cannot be processed to find out what
> > arguments are supplied until we know its length.
>
> My only interest here is to clearly define the issue.  With that
> in mind, is winio a function written in C (or at least has a C
> prototype) with the form "int winio(char *string, ...);"?
>
> If the answer is "yes", then the issue is not related to gfortran's
> implementation of the ISO C Binding feature.  The Fortran 2003
> standard specifically states that vardiac functions are not covered
> under BIND(C):
>
>   NOTE 15.21
>   The C language allows specification of a C function that can take a
>   variable number of arguments (C standard, 7.15).  This standard does
>   not provide a mechanism for Fortran procedures to interoperate with
>   such C functions.
>
> It seems to me that the only portable solution to your issue is to
> tell your users that the proper way to call winio from Fortran is
>
>    call winio("Some string" // C_NULL_CHAR, ...);
> or
>    call winio(trim(string) // C_NULL_CHAR, ...);
>
> In your implementation of winio, you will now have a terminated
> string.  You can parse the string and not depend on the hidden
> length.
>
> As Tobias notes, changing the hidden length from a 32-bit integer
> to a 64-bit integer breaks backwards compatibility.  The gfortran
> developer would now need to tell everyone else that may be
> mucking around with the hidden length argument to change their
> code.  Everyone with libraries and modules that use Fortran strings
> would also likely need to recompile.
>
> --
> Configure bugmail: http://gcc.gnu.org/bugzilla/userprefs.cgi?tab=email
> ------- You are receiving this mail because: -------
> You reported the bug.
>



More information about the Gcc-bugs mailing list