[comp.lang.c] Dubious C code

frank@zen.co.uk (Frank Wales) (02/07/89)

A colleague of mine [honest, it wasn't me] was in the process of
chopping some code around, and accidentally got the equivalent of the
following section of code past the C compiler without any trouble.  It
lints completely clean, too.  The question is, *should* it compile
without any complaints at all?  A case can be made (sic) by analogy to
statement labels, but I think the compiler should have enough semantic
smarts to say, "waaaait a minute, pal!"  Have a look yourself:

.................................. rainbow.c ..................................
#include <stdio.h>

main()
{
  int zippy,bungle,george=99;

  for (zippy=0;zippy<4;++zippy)
  {
    switch(zippy)
    {
    case 0:
      bungle = 0;
      break;
    case 2:
      for (george=10;george>bungle;--george)
      /* falls through */
    case 1:
      (void)puts("Bananas!");
      break;
    default:
      (void)puts("\"Time for bed,\" said Geoffrey.");
    }
  }
  return(0);
}
...............................................................................
    
[System: HP-9000 model 840 rel 2.1 -- lint is pcc-based, compiler is not.]

Now, guess how many times "Bananas!" should get printed.  Please write the
answer on a postcard and put it in a drawer.  :-)
    
--
Frank Wales, Systems Manager,        [frank@zen.co.uk<->mcvax!zen.co.uk!frank]
Zengrange Ltd., Greenfield Rd., Leeds, ENGLAND, LS9 8DB. (+44) 532 489048 x217 

gwyn@smoke.BRL.MIL (Doug Gwyn ) (02/09/89)

In article <1508@zen.UUCP> frank@zen.co.uk (Frank Wales) writes:
>The question is, *should* it compile without any complaints at all?

Why not?  It's legitimate C code.  It follows the rules.
So what if it's a stupid algorithm?  It's not the compiler's
job to criticize the choice of algorithms.

alanm@cognos.uucp (Alan Myrvold) (02/11/89)

In article <9619@smoke.BRL.MIL> gwyn@brl.arpa 
   (Doug Gwyn (VLD/VMB) <gwyn>) writes:
>In article <1508@zen.UUCP> frank@zen.co.uk (Frank Wales) writes:
>>The question is, *should* it compile without any complaints at all?
>
>Why not?  It's legitimate C code.  It follows the rules.
>So what if it's a stupid algorithm?  It's not the compiler's
>job to criticize the choice of algorithms.

I didn't realize that a CASE statement within the body of a FOR loop
was legitimate C code, and just a stupid algorithm.

Curiously enough, although it compiles without complaints and generates
the same output on UNIX cc, UNIX gcc, PC-DOS Turbo C, IBM MVS/TSO SAS C,
and IBM MVS/TSO IBM C (109 Bananas) ... 

VAX/VMS cc does have the sense to complain :

$ cc rainbow.c

	    case 1:
%CC-E-NOTSWITCH, Default labels and case labels are
		valid only in "switch" statements.
		At line number 17 in PATH$USR:[USR.ALANM]RAINBOW.C;1.

	}
%CC-I-NOBJECT, No object file produced.
		At line number 25 in PATH$USR:[USR.ALANM]RAINBOW.C;1.

%CC-I-SUMMARY, Completed with 1 error(s), 0 warning(s), and
		1 informational messages.
		At line number 26 in PATH$USR:[USR.ALANM]RAINBOW.C;1.

%CC-I-NOBJECT, No object file produced.
		At line number 26 in PATH$USR:[USR.ALANM]RAINBOW.C;1.


$
---
Alan Myrvold          3755 Riverside Dr.     uunet!mitel!sce!cognos!alanm
Cognos Incorporated   P.O. Box 9707          alanm@cognos.uucp
(613) 738-1440 x5530  Ottawa, Ontario       
                      CANADA  K1G 3Z4       

krs0@bunny.UUCP (Rod Stephens) (02/11/89)

Very interesting. I tried it on my Ultrix system and it gave veeerrryyy
interesting results. I tried it under VMS and it gave a
Default labels and case labels are valid only in "switch" statements.
Apparently it objected to the "case 1" after the for statement. When I 
changed it so the puts("Bananas!"); was also inside the case 2 it worked
in the expected (boring) way.

gwyn@smoke.BRL.MIL (Doug Gwyn ) (02/16/89)

In article <5251@cognos.UUCP> alanm@cognos.UUCP (Alan Myrvold) writes:
>I didn't realize that a CASE statement within the body of a FOR loop
>was legitimate C code, and just a stupid algorithm.

Surprise!

>VAX/VMS cc does have the sense to complain :
>%CC-E-NOTSWITCH, Default labels and case labels are
>		valid only in "switch" statements.

That compiler is broken -- the case label WAS inside a switch body.

I admit that making use of this language feature is almost always
ill-advised (and, apparently, not portable to VAX/VMS).  "Duff's
device" makes use of it in an essential way, though..