Versions Compared

Key

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

...

Code Block
size_t count; /* must be nonzero */
char *to;     /* output destination */
char *from;   /* Points to count bytes to copy */

do {
  *to = *from++;        /* Note that the ''"to''" pointer is NOT incremented */
} while (--count > 0);

...

Code Block
bgColor#FFCCCC
langc
int n = (count + 7) / 8;
switch (count % 8) {
  case 0: do { *to = *from++;
  case 7:      *to = *from++;
  case 6:      *to = *from++;
  case 5:      *to = *from++;
  case 4:      *to = *from++;
  case 3:      *to = *from++;
  case 2:      *to = *from++;
  case 1:      *to = *from++;
	      } while (--n > 0);
}

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 outside the loop, the switch statement is ignored.) Consequently, this code performs count assignments, but only n comparisons, so it is usually faster.

...

Compliant Code Example (Duff's Device)

This is an alternate implemention implementation of Duff's device, which separates the switch statement and loop.

Code Block
bgColor#CCCCFF
langc
int n = (count + 7) / 8;
switch (count % 8) {
  case 0: *to = *from++; /* fall through */
  case 7: *to = *from++; /* fall through */
  case 6: *to = *from++; /* fall through */
  case 5: *to = *from++; /* fall through */
  case 4: *to = *from++; /* fall through */
  case 3: *to = *from++; /* fall through */
  case 2: *to = *from++; /* fall through */
  case 1: *to = *from++; /* fall through */
}
while (--n > 0) {
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
  *to = *from++;
}

...

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

MSC20-C

medium

probable

medium

P8

L2

Related Guidelines

 

...

Bibliography

...

]Section 6.8.6.1, "The goto statement"

MISRA Rule 15.1

...