Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

C99, Section 6.8.6.1 "The goto statement", says:

A goto statement shall not jump from outside the scope of an identifier having a variably modified type to inside the scope of that identifier.

...

The examples here fall under the exception MSC17:-EX2 in MSC17-C. Finish every set of statements associated with a case label with a break statement.

...

This example shows the use of the switch statment statement to jump into a for loop.

Code Block
bgColor#FFCCCC
int f(int i) {
  int j=0;
  switch (i) {
    case 1:
      for(j=0;j<10;j++) {
      // no break, process case 2 as well
    case 2: // switch jumps inside the for block
        j++;
      // no break, process case 3 as well
    case 3:
        j++;
      }
      break;
  default:
    // default action
    break;
  }
  return j;
}

...

In this code, the first iteration of the loop is subject to the switch statement, so it performs count % 8 assignments. Each subsequent iteration of the loop performs 8 assignments. (being Being outside the loop, the switch statement is ignored.) . Consequently, this code performs count assignments, but only n comparisons, so it is usually faster.

The code is widely considered to be legal C and C++ and supported by all compliant compilers. When describing Duff's Device, the creator noted:

Many people ... have said that the worst feature of C is that switches don't break automatically before each case label. This code forms some sort of argument in that debate, but I'm not sure whether it's for or against.

...

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

MSC20-C

medium

probable

medium

P8

L2

Other Languages

Related Guidelines

This rule appears in the C++ Secure Coding Standard as : MSC20-CPP. Do not use a switch statement to transfer control into a complex block.

Bibliography

Wiki Markup
\[[ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999]\] Section 6.8.6.1 "The goto statement"
[MISRA 042004|AA. Bibliography#ISO/MISRA 04] Rule 15.1
[Tom Duff on Duff's Device|http://www.lysator.liu.se/c/duffs-device.html]

...