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

Nelson H. F. Beebe beebe at
Mon Oct 12 23:15:26 CEST 2009

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

	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)

		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 at  -
- 155 S 1400 E RM 233                       beebe at  beebe at -
- Salt Lake City, UT 84112-0090, USA    URL: -

More information about the Gnupg-devel mailing list