C side effect anomalies
Jon Buser
buser at wanginst.UUCP
Tue Nov 12 05:15:47 AEST 1985
This is a fun program that can identify what C compiler was
used to compile it by analyzing side effect anomalies. It illustrates
the variation in results obtained using different C compilers for
some syntactically valid, but unspecified, C expressions. For example
the C expression i = 1; j = i + i++; could leave j with the value 2, 3,
4, or 10 depending on what compiler was used. Try it, but beware of
modifications! Even minor changes to the program, such as adding print
statements, can change the results.
------------------------- CUT HERE ---------------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# whatcc.c
# This archive created: Mon Nov 11 13:33:46 1985
export PATH; PATH=/bin:$PATH
echo shar: extracting "'whatcc.c'" '(3189 characters)'
if test -f 'whatcc.c'
then
echo shar: will not over-write existing file "'whatcc.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'whatcc.c'
X/* MODULE: whatcc (what C compiler) */
X/* PURPOSE: whatcc uses known values for C side effects anomalies */
X/* to determine what C compiler was used to compile the */
X/* program. The main purpose of the program is to */
X/* illustrate the variability of these side effects. */
X/* */
X/* PROGRAMMER: Jon Franklin Buser */
X/* DATE: 10/30/85 */
X/* VERSION: 1.5 */
X/* REFERENCE: McKeeman et al, Expression Side Effects in C, */
X/* Wang Institute Technical Report TR-85-04 */
X/* NOTE: Minor modifications of the program can change the */
X/* computed side effect values. */
X/* RETURN ADDR: UUCP: decvax!wanginst!buser or decvax!wanginst!mckeeman */
X/* CSNET: buser at WangInst or mckeeman at WangInst */
X/* DISCLAIMER: no guarantees are made */
X/* MODIFICATION HISTORY: */
X
X/* Some compilers may need this include file */
X/* #include <stdio.h> */
X
Xtypedef int Boole;
X#define FALSE ((Boole) 0)
X#define TRUE ((Boole) !FALSE)
X
X#define NUMCOMPS 5 /* Number of compilers */
X#define NUMTESTS 5 /* Number of test cases */
X
Xchar *whatcc ();
X
Xmain () {
X puts (whatcc ());
X}
X
Xchar
X *whatcc () {
X
X int compiler;
X int i;
X int j;
X int test;
X Boole match;
X
X int result[NUMTESTS]; /* array for computed test results */
X
X static int comptab[NUMCOMPS][NUMTESTS] = {
X {4, 2, 2, 10, 4}, /* Berk C */
X {3, 2, 3, 10, 4}, /* High C */
X {3, 2, 3, 9, 3}, /* Wang C */
X {4, 3, 3, 9, 4}, /* MrkW C */
X {4, 3, 3, 12, 4} /* VMS C */
X };
X
X static char *cname[] = {
X "Berkeley 4.2BSD C",
X "MetaWare High C (version alpha 1.0)",
X "Wang VS C (version 01.03.00)",
X "Mark Williams C (version 2.4)",
X "VMS VAX-11 C (version 1.5-91)"
X };
X
X static char *notfnd = "Compiler unknown";
X
X/* collect side-effect anomalies */
X
X i = 1;
X j = i + ++i;
X result[0] = j;
X
X i = 1;
X j = i + i++;
X result[1] = j;
X
X i = 1;
X j = i++ + i++;
X result[2] = j;
X
X i = 1;
X j = ++i + (++i + ++i);
X result[3] = j;
X
X i = 1;
X j = i + (i = 2);
X result[4] = j;
X
X/* compare computed results to the table of precomputed results */
X
X for (compiler = 0; compiler < NUMCOMPS; compiler++) {
X for (match = TRUE, test = 0; test < NUMTESTS; test++) {
X match = match & (comptab[compiler][test] == result[test]);
X }
X if (match)
X return (cname[compiler]);
X }
X
X return (notfnd);
X
X}
X
X
SHAR_EOF
if test 3189 -ne "`wc -c < 'whatcc.c'`"
then
echo shar: error transmitting "'whatcc.c'" '(should have been 3189 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
--
Jon Franklin Buser buser at WangInst
Wang Institute decvax!wanginst!buser
Tyngsboro MA 01879
AND
W. M. McKeeman mckeeman at WangInst
Wang Institute decvax!wanginst!mckeeman
Tyngsboro MA 01879
More information about the Comp.sources.unix
mailing list