C portability test

Jerry Leichter leichter at yale-comix.UUCP
Sat Apr 21 06:31:01 AEST 1984


Brian Jones (drutx!qwerty) presents a program to test C compilers for proper
evaluation of expressions involving side-effects and coercions.  I've tried
his sample program on two more C compilers, with the following results:

VAX11-C (VMS)		DECUS C (VMS, compatibility mode)
-------------		---------------------------------
20 2			20 2
20 3			 0 3
30 5			30 5
30 6			33 6

The VAX11-C results are identical to those Brian found for "Unix on a Dec
11/70, Ver. 3.0"; he believes this is the (a?) "right answer".  (I'm not
questioning his judgement; I haven't looked at the code closely enough to form
any sort of opinion.)

The DECUS C results - which would be the same on all the operating systems
and machines (VAXes and 11's) DECUS C runs under - are identical to what
Brian found for  "Mark Williams Co. C on an Intel 86/330 System, with 8087
support".  I find this an interesting statement, since I think the same person
(Dave Conroy) did most of both compilers.

DECUS C required two changes to the code as distributed.  The first is a known
DECUS C restriction:  Local variables cannot be initialized.  This required
that j in main be initialized in a separate statement.  The second is either a
bug or a change in the language definition (DECUS C pre-dates K&R):  DECUS C
requires a parenthesized expression after return; this requires that:

	return a;

in ifunc() be changed to:

	return (a);

For people who might have missed the original article and want to try this
test out on their favorite compiler, here is the version I used, with the
edits for DECUS C in place (might help on other old compilers):

/*
 *	Simple E1 op= E2 test
 */
#include	<stdio.h>
main()
	{
	int	i,
		j,
		*ifunc();

	j = 0;

	i = 100;
	*ifunc(&i, &j) = *ifunc(&i, &j) * .2;
	printf("%d %d\n", i, j);

	i = 100;
	*ifunc(&i, &j) *= .2;
	printf("%d %d\n", i, j);

	i = 100;
	*ifunc(&i, &j) = *ifunc(&i, &j) / 3.3;
	printf("%d %d\n", i, j);

	i = 100;
	*ifunc(&i, &j) /= 3.3;
	printf("%d %d\n", i, j);
	}

int	*ifunc(a, b)
int	*a, *b;
	{
	++*b;
	return (a);
	}

Brian's results, in summary:

    1	    2	    3	    4	    5	    6
  ----	  ----	  ----	  ----	  ----	  ----
  19 2	  20 2	  20 2	  20 2	  20 2	  19 2
  0 3	  0 3	  20 3	  20 4	  0 3	  19 4
  30 5	  30 5	  30 5	  30 6	  30 5	  30 5
  33 6	  33 6	  30 6	  30 8	  33 6	  30 6

1) Maxi-Unix on an Ahmdahl (sp?), Ver. 5.0
2) Unix on a Vax 11/780, Ver. 5.0
3) Unix on a Dec 11/70, Ver. 3.0 **right answer**
4) Unix on a 3B20, Ver. 5.0
5) Mark Williams Co. C on an Intel 86/330 System, with 8087 support
6) Ancient Yourdon (I think) compiler on a Dec 11/44 **right answer**

							-- Jerry
						decvax!yale-comix!leichter
						leichter at yale



More information about the Comp.lang.c mailing list