gnupg-2.0.13: unwanted gcc-ism in source code, and a needed library

View: New views
2 Messages — Rating Filter:   Alert me  

gnupg-2.0.13: unwanted gcc-ism in source code, and a needed library

by Nelson H. F. Beebe :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I've made some further progress in getting gnupg-2.0.13 installed on
various local Unix platforms, and today, hit an apparent gcc-ism in
the source code:

        % cd tests
        % sed -n 202p asschk.c
        #define die(format, args...) (die) ("%s: " format, __func__ , ##args) %%

Compiling this single file with gcc, and using the native compiler on
all other files, was sufficient to get this release on build on Sun
Solaris (SPARC, AMD64, and IA-32).

A check of the text of the 1999 ISO C Standard shows this
specification of the use of variable numbers of arguments in macro
definitions:

        6.10.3 Macro replacement
        ...
        4 If the identifier-list in the macro definition does not end with an
          ellipsis, the number of arguments (including those arguments
          consisting of no preprocessing tokens) in an invocation of a
          function-like macro shall equal the number of parameters in the
          macro definition. Otherwise, there shall be more arguments in the
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          invocation than there are parameters in the macro definition
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          (excluding the ...). There shall exist a ) preprocessing token that
          terminates the invocation.

The gnupg code seems to violate that highlighted requirement, since it
has subsequent statement like

        die ("out of core");
        die ("received line too large");

after the macro definition.  Also, the Standard's syntax description
does not appear to permit a comma to be omitted before the ellipsis.

The Sun c99 compiler on this test file

        % cat foo-die.c
        extern void die (const char *format, ...);

        #define die(format, args, ...) (die) ("%s: " format, __func__ , ##args)

        void
        foo()
        {
                die("test 1"); /* line 8 */
                die("test 1", "test 2"); /* line 9 */
                die("test 1", "test 2", "test 3"); /* line 10 */
        }

produces these errors:

        % c99 -c foo-die.c
        "foo-die.c", line 8: warning: argument mismatch
        "foo-die.c", line 8: syntax error before or at: )
        "foo-die.c", line 9: warning: argument mismatch
        c99: acomp failed for foo-die.c

Notice that lines 8 and 9 elicit a diagnostic, but line 10, which has
the required minimum number of arguments, does not.

Inasmuch as this is the ONLY file in this gnupg release that uses this
C99 feature, I suggest that it would be better to remove it, in the
interests of gnupg being compilable by a wider range of compilers.

Also, linking of this release on Solaris fails with nanosleep()
unresolved.  Restarting the build with

        make LIBS=-lrt

resolves that problem.  The -lrt (real-time) library is needed on
several systems for features like high-precision timers, so configure
scripts should be written to find whether -lrt is needed on a given
build host.

-------------------------------------------------------------------------------
- Nelson H. F. Beebe                    Tel: +1 801 581 5254                  -
- University of Utah                    FAX: +1 801 581 4148                  -
- Department of Mathematics, 110 LCB    Internet e-mail: beebe@...  -
- 155 S 1400 E RM 233                       beebe@...  beebe@... -
- Salt Lake City, UT 84112-0090, USA    URL: http://www.math.utah.edu/~beebe/ -
-------------------------------------------------------------------------------

_______________________________________________
Gnupg-devel mailing list
Gnupg-devel@...
http://lists.gnupg.org/mailman/listinfo/gnupg-devel

Re: gnupg-2.0.13: unwanted gcc-ism in source code, and a needed library

by Werner Koch :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Mon, 12 Oct 2009 23:15, beebe@... said:

> The gnupg code seems to violate that highlighted requirement, since it
> has subsequent statement like
>
> die ("out of core");
> die ("received line too large");
>
> after the macro definition.  Also, the Standard's syntax description
> does not appear to permit a comma to be omitted before the ellipsis.

Thanks for pointing this out.

> Inasmuch as this is the ONLY file in this gnupg release that uses this
> C99 feature, I suggest that it would be better to remove it, in the
> interests of gnupg being compilable by a wider range of compilers.

Right, our policy is to use C-90 thus vararg macros should not be used.
I replaced that by die_0, die_1 etc, macros.

> Also, linking of this release on Solaris fails with nanosleep()
> unresolved.  Restarting the build with
>
> make LIBS=-lrt

I'll take care of that later.  I also need to read through the reports
you sent me a couple of weeks ago.


Salam-Shalom,

   Werner

--
Die Gedanken sind frei.  Auschnahme regelt ein Bundeschgesetz.


_______________________________________________
Gnupg-devel mailing list
Gnupg-devel@...
http://lists.gnupg.org/mailman/listinfo/gnupg-devel